完整版电子时钟LCD显示.docx
- 文档编号:11659212
- 上传时间:2023-03-29
- 格式:DOCX
- 页数:15
- 大小:19.56KB
完整版电子时钟LCD显示.docx
《完整版电子时钟LCD显示.docx》由会员分享,可在线阅读,更多相关《完整版电子时钟LCD显示.docx(15页珍藏版)》请在冰豆网上搜索。
完整版电子时钟LCD显示
电气工程及自动化专业
单片机原理及应用课程设计报告
姓名:
XXXXXX
学号:
XXXXXXX
专业班级:
XXXXXX
题目:
电子时钟(LCD显示)
电气与电子工程学院
二〇一四年十二月三十日
2
2
2
3
4
5
7
13
13
14
1
一、设计目的
1、设计要求以AT89C51单片机为核心的时钟,在LCD显示器上显
示当前的时间。
2、使用字符型LCD显示器显示当前时间。
显示格式为“时时:
分
分:
秒秒”。
3、用4个功能键操作来设置当前时间。
4、熟悉掌握proteus编成软件以及keil软件的使用
二、设计任务与要求
本设计以AT89C51单片机为核心,通过时钟程序的编写,并在LCD显示器上显示出来。
该编程的核心在于定时器中断及循环往复判断是否有按键操作,并对每个按键的操作在LCD显示器上作出相应的反应。
由于LCD显示器每八位对应一个字符,故把秒、分、时的个位和十位分开表示。
该课题中有四个控制开关KM1、KM2、KM3、KM4分别控制时、分、秒、确定的调整,时间按递增的方式调整,每点一次按钮则相应的时间个位加以,且时间调整不干扰其他为调整时间的显示。
三、设计原理分析
1、按照系统的设计功能要求,本时钟系统的设计必须采用单片
机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。
时钟电路
数据显示
微
型
控按键调时
制
器
图一系统总原理图
2
2、软件主要完成功能
(1)显示时间程序
用软件调节时间,通过程序的调节,最后用LED现实时钟
(2)调节时间程序
按键调节时间,能实现时、分的调节
3、软件设计主要流程
时间控制程序
时间控制程序,用中断准确的控制时间,采用60进制,60秒为一分钟,60分钟为一个小时,全天设置为24小时。
四、硬件资源及原理图
AT89C51芯片
AT89C51是美国ATMEL公司生产的8位FlashROM单片机。
其最突出的优点是片内ROM为FlashROM,可擦写1000次以上,应用并不复杂的通用ROM写入器就能方便的擦写,读取也很方便,价格低廉,具有片程序ROM二级保密系统。
因此可灵活应用于各种控制领域。
AT89C51包含以下一些功能部件:
1.一个8位CPU;
2.一个片内振荡器和时钟电路;
3.4KBFlashROM;
4.128B内RAM;
5.可寻址64KB的外ROM和外RAM控制电路;
6.两个16位定时/计数器;
7.21个特殊功能寄存器;
8.4个8位并行I/O口;
9.一个可编程全双工串行口;
10.5个中断源,可设置成2个优先级。
AT89C51单片机一般采用双列直插DIP封装,共40个引脚,图2-1为其引脚排列图。
40个引脚大致可分为4类:
电源、时钟、控制各I/O引脚
3
五、硬件图
4
六、程序框图
LCD显示
设置T0为方式1
设中断次数为20
清计时单元
开中断
启动T0
调用显示子程序
按键程序
调用按键显示子程序
时钟主程序流程
5
保护现场
设置计数初值
1S到?
(40H)+1(40H)
N
(40H)=10?
1(40H)
(41H)+1(41H)
N
(41H)=5?
1(41H)
(43H)+1(43H)
N
(43H)=10?
1(43H)
(44H)+1(44H)
N
(44H)=5?
0(44H)
(46H)+1(46H)
N
(46H)=4?
N
(47H)=2?
0
(46H)
(0)
(47H)
(46H)+1
(46H)
恢复现场
返回
(46H)=10?
0(46H)
(47)+1(47)
中断服务流程图
6
七、程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDelayNOP(){_nop_();_nop_();_nop_();_nop_();}
sbitK1=P0^0;
sbitK2=P0^1;
sbitK3=P0^2;
sbitK4=P0^3;
sbitSPK=P3^0;
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
ucharcodeStr1[]="CurrentTime";//一下两个字符串的串
长均为16
ucharcodeStr2[]="SetNewTime...";
ucharHMS_String[]="00:
00:
00";//带显示的时间串
bitSettime=0;//是否修改时间
bitChange_H_or_M=1;//1表示修改时.0表示修改分ucharMilliSecond,Hour=0,Minute=0,Second=0;
//延时函数
voidDelayMS(uintx)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
//LCD忙状态检测
bitLCD_Busy_Check()
{
7
bitresult;
RS=0;RW=1;E=1;DelayNOP();result=(bit)(P0&0x80);E=0;
returnresult;
}
//写LCD命令
voidLCD_Write_Command(ucharcmd)
{
while(LCD_Busy_Check());//判断LCD是否忙碌
RS=0;RW=0;E=0;_nop_();_nop_();P0=cmd;DelayNOP();
E=1;DelayNOP();E=0;
}
//设置LCD显示位置
voidLCD_Set_Pos(ucharpos)
{
LCD_Write_Command(pos|0x80);
}
//写LCD数据
voidLCD_Write_Data(uchardat)
{
while(LCD_Busy_Check());//判断LCD是否忙碌
RS=1;RW=0;E=0;
P0=dat;DelayNOP();
E=1;DelayNOP();E=0;
}
//LCD初始化
voidLCD_Initialize()
{
LCD_Write_Command(0x38);DelayMS
(1);
LCD_Write_Command(0x0c);DelayMS
(1);
8
LCD_Write_Command(0x06);DelayMS
(1);
LCD_Write_Command(0x01);DelayMS
(1);
}
//显示函数,在LCD指定的行上显示字符串
voidDisplay_String(uchar*str,ucharLineNo)
{
uchark;
LCD_Set_Pos(LineNo);
for(k=0;k<16;k++)LCD_Write_Data(str[k]);
}
//蜂鸣函数
voidBeep()
{
uchari,j=70;
for(i=0;i<200;i++)
{
while(--j);SPK=~SPK;
}
DelayMS(300);SPK=0;
}
//时分秒显示
voidDisplay_HMS(ucharh,m,s)
{
if(Settime)HMS_String[3]='>';//
显示修改标志
elseHMS_String[3]='';
//
不显示修改标志
HMS_String[4]=h/10+'0';
//
时
HMS_String[5]=h%10+'0';
HMS_String[7]=m/10+'0';
//
分
HMS_String[8]=m%10+'0';
HMS_String[10]=s/10+'0';
//
秒
HMS_String[11]=s%10+'0';
9
Display_String(HMS_String,0x40);
}
//设置时间
voidChange_Time()
{
Settime=0;
if(K1==0||K2==0||K3==0)//按下k1k2k3中的任何一个键即进
入修改状态
{
TR0=0;
Display_String(Str2,0x00);//第一行提示修改时间
Settime=1;
}
while(Settime)
{
if(K1==0)//确定调整小时还是分钟
{
Beep();
while(K1==0)
Change_H_or_M=!
Change_H_or_M;
}
elseif(K2==0)//增加
{
Beep();
while(K2==0);
if(Change_H_or_M==1)
{if(++Hour==24)Hour=0;}
else
{if(++Minute==60)Minute=0;}
}
elseif(K3==0)//减少
10
{
Beep();
while(K3==0);
if(Change_H_or_M==1)
{if(--Hour==0xff)Hour=23;}
else
{if(--Minute==0xff)Minute=59;}
}
elseif(K4==0)//确定
{
Beep();
while(K4==0);
Display_String(Str1,0x00);//第一行还原显示str1
Settime=0;
TR0=1;
}
Display_HMS(Hour,Minute,Second);
}//外层While在这里结束
}
//定时器0中断
voidTime0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//重新装入50MS定时
if(++MilliSecond==20)//50*20=1s
{
MilliSecond=0;
if(++Second==60)
{
Second=0;
if(++Minute==60)
11
{
Minute=0;
if(++Hour==24)
{
Hour=0;Minute=0;Second=0;
}
}
}
}
}
//主函数
voidmain()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x82;
SPK=0;
LCD_Initialize();
Display_String(Str1,0x00);//第一行显示
TR0=1;
P1=0xFF;
while
(1)
{
Display_HMS(Hour,Minute,Second);//第二行显示时分秒
DelayMS(500);
Change_Time();//显示过程中允许修
改时间
}
}
12
八、调试运行
1、按硬件原理图接线用4个功能键操作来设置当前时间。
功能键K1~
K4功能如下。
K1—进入设置现在的时间。
K2—设置小时。
K3—设置分钟。
K4—确认完成设置。
程序执行后工作指示灯LED闪动,表示程序开始执行,LED显示“00:
00:
00”,然后开始计时
九、仿真截图
结论:
采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。
根据仿真结果可知该编程及硬件电路符合要求:
13
十、设计心得体会
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要
的。
回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。
同时,在老师的身上我学得到很多实用的知识,在次我表示感谢!
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
14
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整版 电子 时钟 LCD 显示