单片机电子时钟(LCD显示)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机综合实验报告
题目:电子时钟(LCD)显示
班级: 0310405班
学号: *********
学生姓名:***
指导老师:**
2013年 6 月 17 日
一、实验内容:
以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间:
●使用字符型LCD显示器显示当前时间。
●显示格式为“时时:分分:秒秒”。
●用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。
功能键K1~K4功能如下。
●K1—进入设置现在的时间。
●K2—设置小时。
●K3—设置分钟。
●K4—确认完成设置。
程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00:00”,然后开始计时。
二、实验电路及功能说明
1)单片机主控制模块
以AT89C51单片机为核心进行一系列控制。
2)时钟显示模块
用1602为LCD显示模块,把对应的引脚和最小系统上的引脚相连,
连接后用初始化程序对其进行简单的功能测试。测试成功后即可为实
验所用,如图:
3)时间调整电路
用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚
上。功能键K1~K4功能如下。K1—进入设置现在的时间。K2—设
置小时。K3—设置分钟。K4—确认完成设置。如图:
三、实验程序流程图:
主程序:
时钟主程序流程
子程序:
保护现场
设置计数初值
1S到?
(40H)=10?
0 (40H)(40H)+1 (40H)(41H)+1 (41H)
(46H)=4?
0 (46H)
(0)(47H)
恢复现场
返回
N
N
中断服务流程图
(41H)=5?
0 (41H)
(43H)=10?
0 (43H)(43H)+1 (43H)(44H)+1 (44H)
(44H)=5?
0 (44H)
(46H)+1 (46H)
(47H)=2?
(46H)+1 (46H)
N
N
(46H)=10?
0 (46H)
(47)+1 (47)
N
N
四、实验结果分析
实验结果及分析:单片机的晶振可以根据要求设定。6MHZ为和现实时间显示相同。实验采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。当烧入程序后开始运行,根据初始值设定可以观察到显示的时间,这里为了更明显观察显示数据变化把起始值设为
23:59:50 运行后显示,K1为进入现在设置
时间,当按下K1后显示,和实验要求相比较,实现了按下K1进入现在时间设置,按下K4确认完成时间设置的功能;不同之处: 当进入时间设置时在按下K1设置小时,再次按下K1是设置分钟。增加功能:进入时间设置并选择设置位置后K2键位数字增加功能,K3键为数字减小功能。根据仿真结果能够确定编程正确,基本实现了所有功能,而且有所改进。
五、心得体会
每次做单片机实验都会有不同的等收获,而这次的实验让我感觉收获更大。这次的实验让我巩固了以往所学,而且锻炼
了自己发现问题解决问题的能力。在编程过程,发现自己对C
语言很生疏,很多技巧和函数运用都不会,通过参考资料和询
问同学终于让我完成了程序,并实现了程序的功能。这不仅提
高了自己动手能力,也培养了自己的思考能力。
这次在编程过程中学到了很多新东西,特别是LCD的显示,在设定的显示字符后,正确编译后显示各种设定值,LCD显示
16位字符,在最初编程时编译正确但是LCD上的显示字符有缺
失,显示不完整,经过不断调试发现空格同样占据字符,只有
所有字符不超过16位且位置正确时才能完整正确显示。时间
的显示需要每一个显示的位子有定义,而且要给“:”留下特
定位子。同时编程时发现还可以显示其他如日期。但本实验不
需要且很难完成最终没实现。
在仿真过程中发现许多模型不知道名称,最后搜索了一份Proteus 元件库,里边有很多元件模型的名称。最后搭建成功
了仿真模型,并且运行成功。
在这里要感谢老师在以往实验过程中不厌其烦的帮助自己解决所遇到的问题和传授一些知识和小窍门。让我对单片机
有机会加深了解,体会到了单片机的强大,学到了很多,感谢。
六、程序清单
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit K1 =P1^0; //选择调整小时,分钟
sbit K2 =P1^1;//增加
sbit K3 =P1^2;//减小
sbit K4 =P1^3;
sbit SPK=P3^0;
sbit RS =P2^0;
sbit RW =P2^1;
sbit E =P2^2;
uchar code Str1[] =" Current Time "; //一下两个字符串的串长均为16
uchar code Str2[] =" Set New Time";
uchar HMS_String[]=" 00:00:00 ";//带显示的时间串
bit Settime=0; //是否修改时间
bit Change_H_or_M =1;//1表示修改时.0表示修改分
uchar MilliSecond,Hour =23,Minute=59, Second =50; //延时函数
void DelayMS(uint x)
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}
//LCD忙状态检测
bit LCD_Busy_Check()
{
bit result;
RS = 0;RW = 1;E = 1;DelayNOP();result = (bit)(P0 & 0x80);E = 0;
return result;
} //写LCD命令
void LCD_Write_Command(uchar cmd)
{
while(LCD_Busy_Check());//判断LCD是否忙碌
RS = 0;RW = 0;E = 0;_nop_();_nop_();P0 = cmd; DelayNOP(); E = 1;DelayNOP();E = 0; } //设置LCD显示位置
void LCD_Set_Pos(uchar pos)
{
LCD_Write_Command(pos | 0x80);
}
//写LCD数据