单片机电子时钟LCD显示
Word 资料 . 单片机综合实验报告 题目:: 电子时钟(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— Word 资料 . 设置小时。K3—设置分钟。K4—确认完成设置。如图: 三、实验程序流程图:三、实验程序流程图: 主程序:主程序: 时时 钟钟 主主 程程 序序 流流 程程 子程序:子程序: Word 资料 . 保护现场 (46H)+1(46H) N 设 置 计 数 初 值 (46H)=4? N (47H)=2? 1S 到? (40H)+1(40H) N (40H)=10? 0(46H) (0)(47H) 0(40H)(46H)+1(46H) (41H)+1(41H) N (41H)=5? 0(41H)恢复现场 (43H)+1(43H) N (43H)=10? 返回 (46H)=10? 0(43H) 0(46H) (44H)+1(44H) N (44H)=5? (47) +1(47) 0(44H) 中中 断断 服服 务务 流流 程程 图图 四、实验结果分析四、实验结果分析 Word 资料 . 实验结果及分析实验结果及分析 :单片机的晶振可以根据要求设定。6MHZ 为和现实时 间显示相同。实验采用 12MHZ 晶振采用方式 1 定时,选取 50ms 采用 20 次中断 达到一秒,采用查表方式控制 LCD 显示。当烧入程序后开始运行,根据初始值 设定可以观察到显示的时间,这里为了更明显观察显示数据变化为了更明显观察显示数据变化把起始值设为 23:59:50 运行后显示,K1 为进入现在设置 时间,当按下K1 后显示, 和实验要求相比较, 实现了按下 K1 进入现在时间设置,按下 K4 确认完成时间设置的功能;不同之 处: 当进入时间设置时在按下 K1 设置小时, 再次按下 K1 是设置分钟。 增加功能: 进入时间设置并选择设置位置后 K2 键位数字增加功能,K3 键为数字减小功能。 根据仿真结果能够确定编程正确,基本实现了所有功能,而且有所改进。 五、心得体会五、心得体会 Word 资料 . 每次做单片机实验都会有不同的等收获,而这次的实验让 我感觉收获更大。这次的实验让我巩固了以往所学,而且锻炼 了自己发现问题解决问题的能力。在编程过程,发现自己对C 语言很生疏,很多技巧和函数运用都不会,通过参考资料和询 问同学终于让我完成了程序,并实现了程序的功能。这不仅提 高了自己动手能力,也培养了自己的思考能力。 这次在编程过程中学到了很多新东西,特别是 LCD 的显 示,在设定的显示字符后,正确编译后显示各种设定值,LCD 显示 16 位字符, 在最初编程时编译正确但是 LCD 上的显示字 符有缺失, 显示不完整, 经过不断调试发现空格同样占据字符, 只有所有字符不超过 16 位且位置正确时才能完整正确显示。 时间的显示需要每一个显示的位子有定义,而且要给“: ”留 下特定位子。同时编程时发现还可以显示其他如日期。但本实 验不需要且很难完成最终没实现。 在仿真过程中发现许多模型不知道名称,最后搜索了一份 Proteus 元件库,里边有很多元件模型的名称。最后搭建成功 了仿真模型,并且运行成功。 在这里要感谢老师在以往实验过程中不厌其烦的帮助自 己解决所遇到的问题和传授一些知识和小窍门。让我对单片机 有机会加深了解, 体会到了单片机的强大, 学到了很多, 感谢。 六、程序清单六、程序清单 Word 资料 . #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;i120;i++); } //LCD 忙状态检测 bit LCD_Busy_Check() { bit result; RS = 0;RW = 1;E = 1;DelayNOP();result = (bit)(P0 E = 0; return result; }//写 LCD 命令 void LCD_Write_Command(uchar ) { while(LCD_Busy_Check());//判断 LCD 是否忙碌 RS = 0;RW = 0;E = 0;_nop_();_nop_();P0 = ; DelayNOP(); E = 1;DelayNOP();E = 0; } //设置 LCD 显示位置 void LCD_Set_Pos(uchar pos) { LCD_Write_Command(pos | 0 x80); } //写 LCD 数据 void LCD_Write_Data(uchar dat) { Word 资料 . while(LCD_Busy_Check());//判断 LCD 是否忙碌 RS = 1;RW = 0;E = 0; P0 =