首页 > 领导讲话 > 纪检讲话 / 正文
单片机开机次数记忆器的设计及实现
2020-12-23 06:21:13 ℃ 信息与电气工程学院 单片机应用系统(三级项目) 设计说明书 (2014/2015学年第二学期)
题
目 :
开机次数记忆器设计及实现
专业班级 :
电子信息工程班
学生学号 :
学生姓名 :
指导教师 :
设计周数 :
2周
设计成绩 :
2015年X月X日
1、 项目设计 1.1 设计要求 (1)以单片机AT89C52为核心,使用24C02串行EEPROM进行存储开机次数; (2)用LCD1602显示存储的开机次数;
(3)单片机复位一次,从24C02中读取数据,然后加1; (4)在此基础上可以拓展对一组密码数据存储对比后,才能进入正常界面。
1.2 设计目的 (1)培养学生正确的设计思想,理论联系实际的工作作风,严肃认真、实事求是的科学态度和勇于探索的创新精神。
(2)锻炼学生自学软件的能力及分析问题、解决问题的能力。
(3)通过课程设计,使学生在理论计算、结构设计、工程绘图、查阅设计资料、标准与规范的运用和计算机应用方面的能力得到训练和提高。
(4)巩固、深化和扩展学生的单片机理论知识。
(5)培养学生的团队合作能力。
2、项目设计正文 2.1方案设计 2.1.1设计思路 此次项目设计的目的是实现单片机开机次数的记忆及显示功能,即其复位断电关机都能准确的将开机次数显示在LCD1602显示屏上。根据对项目设计要求和实际应用的分析,选用以单片机AT89C52为核心,使用24C02串行EEPROM进行存储开机次数的方法,使C52单片机的P2.0口和P2.1口分别控制24C02的数据线SDA和时钟信号线SCK来完成数据的读写功能,然后用LCD1602显示屏将24C02中存储的数据显示出来。
具体设计实现的逻辑流程图如图1所示:
图1 逻辑实现流程图 2.1.2主要元器件 (1) 处理器AT89C52,引脚图如图2所示:
图2 AT89C52单片机引脚图
AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。
(2) 外部存储器24C02 串行E2PROM是基于I2C-BUS 的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。具有以下几大特点:
1.宽范围的工作电压1.8v~5.5v 2.低电压技术:
1mA典型工作电流 1uA典型待机电流 3.储存器组织结构 4.2线串行接口,完全兼容I2C总线 5.施密特触发输入噪声抑制 6.硬件数据写保护 7.内部与周期(最大5ms) 8.自动递增地址 9.可按照字节写 10.esd保护大于2.5kV 11.高可靠性:擦写寿命:100万次 数据保持时间:100年 12.无铅工艺,符合RoHS标准 2.2单元电路设计 2.2.1处理器AT89C52引脚的选择 本次项目设计选择的引脚分别为P0口、P2口、RES端口。
P0 口是一组8 位漏极开路型双向I/O 口, 也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8 个TTL逻辑门电路,对端口P0 写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8 位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P2口 是一个带有内部上拉电阻的8 位双向I/O 口,P2 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对端口P2 写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。访问外部程序存储器或16 位地数据存储器(例如执行MOVX @DPTR 指令)时,P2 口送出高8 位地址数据。在访问8 位地址的外部数据存储器(如执行MOVX@RI 指令)时,P2 口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。P2.0口和P2.1口分别控制24C02的数据线SDA和时钟信号线SCK来完成数据的读写功能。
RST为复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
单片机引脚图连接选择如图3所示:
图3 单片机的引脚连接图 2.2.2 RC复位电路 复位电路图如图4所示:
图4 复位电路图 系统复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,此高电平信号随着VCC对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。在图4的复位电路中,当VCC掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“1”态。如果系统在上电时得不到有效的复位,则程序计数器PC将得不到一个合适的初值,CPU可能会从一个未被定义的位置开始执行程序。
2.2.3 LCD1602显示屏的连接 LCD1602各引脚的功能如下:
第1脚:VSS为电源地 第2脚:VDD接5V电源正极 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
第6脚:E(或EN)端为使能(enable)端。
第7~14脚:D0~D7为8位双向数据端。
单片机的P2.5,P2.6,P2.7分别接LCD1602的RS、RW、E端口,如图5所示:
图5 LCD1602显示屏的连接 2.2.4 24C02的连接 C52单片机的P2.0口和P2.1口分别控制24C02的数据线SDA和时钟信号线SCK来完成数据的读写功能,具体电路图如图6所示:
图6 24C02 的连接 2.2.5 整体电路 系统整体仿真电路和实物操作电路如图7和图8所示:
图7 整体仿真电路图
图8 仿真实物图 2.3系统实现程序 #include <reg51.h> #include <intrins.h>
sbit SDA = P2^0; //AT24C01串行数据
5脚
sbit SCL = P2^1; //AT24C01串行时钟
6脚
int time=0; int time2=0; typedef unsigned char
uint8;
/* defined for unsigned 8-bits integer variable
无符号8位整型变量
*/ typedef signed
char
int8;
/* defined for signed 8-bits integer variable
有符号8位整型变量
*/
typedef unsigned char BYTE; typedef unsigned int WORD; typedef bit BOOL ;
sbit rs = P2^6;
sbit rw = P2^5; sbit ep = P2^7;
BYTE code dis1[] = {“TIME“}; BYTE
dis2[10]={“0123456789“}; BYTE
dis3[10]={“0123456789“};
delay(BYTE ms) {
// 延时子程序
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
} }
BOOL lcd_bz() {
// 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
}
lcd_wcmd(BYTE cmd) {
// 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_pos(BYTE pos) {
//设定显示位置
lcd_wcmd(pos | 0x80); }
lcd_wdat(BYTE dat)
{
//写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init() {
//LCD初始化设定
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01);
//清除LCD的显示内容
delay(1); } ////2402程序2 void AT2401_Delay() {;;}
void busy()
{
BYTE temp;
temp=0x00;
rs=0;
rw=1;
ep=1;
while((temp&0x80)==0x80)
{
ep=0;
_nop_();
ep=1;
_nop_();
}
}
void AT2401_Start()//启动信号 {
SDA=1;
AT2401_Delay();
SCL=1;
AT2401_Delay();
SDA=0;
AT2401_Delay(); }
void AT2401_Stop()//停止信号 {
SDA=0;
AT2401_Delay();
SCL=1;
AT2401_Delay();
SDA=1;
AT2401_Delay(); }
void AT2401_Respons()//响应 {
uint8 i;
SCL=1;
AT2401_Delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
AT2401_Delay(); }
void AT2401_Init()//初始化函数 {
SDA=1;
AT2401_Delay();
SCL=1;
AT2401_Delay(); }
void AT2401_WByte(uint8 date)//写一个字节 {
uint8 i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
AT2401_Delay();
SDA=CY;
AT2401_Delay();
SCL=1;
AT2401_Delay();
}
SCL=0;
AT2401_Delay();
SDA=1;
AT2401_Delay(); }
uint8 AT2401_RByte()//读一个字节 {
uint8 i,k;
SCL=0;
AT2401_Delay();
SDA=1;
AT2401_Delay();
for(i=0;i<8;i++)
{
SCL=1;
AT2401_Delay();
k=(k<<1)|SDA;
SCL=0;
AT2401_Delay();
}
return k; }
void AT2401_WAddr(uint8 address,uint8 date)//指定地址写一个数据 {
AT2401_Start();
AT2401_WByte(0xa0);
AT2401_Respons();
AT2401_WByte(address);
AT2401_Respons();
AT2401_WByte(date);
AT2401_Respons();
AT2401_Stop(); }
uint8 AT2401_RAddr(uint8 address)//指定地址读取一个字节 {
uint8 date;
AT2401_Start();
AT2401_WByte(0xa0);
AT2401_Respons();
AT2401_WByte(address);
AT2401_Respons();
AT2401_Start();
AT2401_WByte(0xa1);
AT2401_Respons();
date=AT2401_RByte();
AT2401_Stop();
return date; } void wr_com(BYTE com) {
ep=0;
rs=0;
rw=0;
P0=com;
_nop_();
ep=1;
_nop_();
ep=0; }
void wr_data(BYTE date) {
busy();
ep=0;
rs=1;
rw=0;
P0=date;
_nop_();
ep=1;
_nop_();
ep=0;
} /////////////////////////////////////// ///////////////////////////////////////
main() {
BYTE i;
lcd_init();
// 初始化LCD
AT2401_Init();
time = AT2401_RAddr(0x01);
time2 = AT2401_RAddr(0x02);
if(time>=9)
{
AT2401_WAddr(0x01,0);
time2+=1;
}
time+=1;
if(time2>9&&time>=9)
{
time=0;
time2=0 ;
}
AT2401_WAddr(0x01, time);
AT2401_WAddr(0x02, time2);
lcd_pos(4);
// 设置显示位置为第一行的第5个字符
i = 0;
while(dis1[i] != '\0')
{
// 显示字符“TIME“
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x49);
// 设置显示位置为第二行第一位字符
dis2[time];
lcd_wdat(dis2[time]); // 显示字符
delay(1);
lcd_pos(0x48);
// 设置显示位置为第二行第二位字符
dis2[time2];
lcd_wdat(dis3[time2]); // 显示字符
while(1);
} 3、 项目设计总结 通过此次课程设计,使我更加扎实的掌握了有关单片机应用系统设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了AT89C52、24C02和LCD1602的基本知识和连接测试,也通过查资料熟悉了外部存储24C02的工作原理。了解了C语言程序在单片机系统设计中的应用,掌握了系统电路的调试方法。
在此次的课程设计过程中,也对团队精神的进行了考察,我们小组三个人分工合作,查资料、电路设计、程序设计、硬件实物仿真都做得有条不紊,我们配合越来越默契,有问题一起解决,在成功后一起体会喜悦。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。我认为,此次课设不仅培养了我们独立思考、团队协作、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,我们学会了很多自主学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。
4、参考文献 [1] 张毅刚,彭喜元,董继成.单片机原理及应用.北京:高等教育出版社,2003. [2] 史良.LCD12864显示模块与微处理器的接口设计 [J]. 矿业安全与环保, 1999.
项目设计 评
语
项目设计 成
绩
指导教师 (签字)
年
月
日
猜你喜欢
- 2024-01-17 在纪检干部教育整顿交流研讨会上发言(2024年)
- 2024-01-09 2024年度某国企纪检干部在主题教育暨教育整顿学习研讨会上发言(全文)
- 2024-01-09 纪检干部在全市思想政治工作座谈会上交流发言(精选文档)
- 2024-01-09 XX国企纪检干部在主题教育暨教育整顿学习研讨会上发言(公司剖析问题)(完整)
- 2024-01-06 2024年公司纪检工作总结及下一步工作计划
- 2024-01-03 2024年(合集)纪检员个人工作总结范本
- 2024-01-02 2024年某国企纪检工作总结及2024年工作计划(党风廉政建设和反腐败)
- 2023-12-31 2024年公司纪检工作工作完成情况及2024年工作计划【优秀范文】
- 2023-12-30 纪检干部述职述廉工作报告
- 2023-12-29 2024纪检干部演讲稿:履职尽责担使命热血青春铸忠诚
- 搜索
-
- 【年轻人与老年人】 年轻人能玩老年妇 01-18
- 2020年1月国开(中央电大)学前教育专 09-22
- 纪检委员一对一谈心谈话记录(完整) 12-22
- 社区活动室管理制度 06-05
- 学习《长松组织系统》的心得体会 04-18
- 党支部落实全面从严治党主体责任报告 07-09
- 2021国家开放大学电大专科《学前儿童艺 11-07
- 关于打击电信诈骗犯罪活动工作总结 06-24
- 纪检委员一对一谈心谈话记录(全文完整 11-23
- [班主任年终工作总结]最精彩的班主任发 12-31
- 11-25国庆70周年庆典晚会 庆典晚会串词
- 11-25办公室礼仪的十大原则 浅谈办公室的电话礼仪
- 01-17用心灵轻轻地歌唱_心灵的歌唱
- 01-17也许你不是我一生的唯一|也许不是我
- 01-17爱了,请珍惜;不爱,趁早放手|爱就珍惜不爱就放手
- 01-17岁月带走的是记忆,但回忆会越来越清晰|有趣又有深意的句子
- 01-17曾经的美好只是曾经,我只想珍惜身边的人|我只想珍惜你
- 01-18从容不惊 [学会笑眼去看世界,不惊不乍,淡定从容]
- 02-03当代大学生学习态度调查报告
- 02-03常用护患英语会话
- 标签列表