单片机电子时钟综合实验报告

上传人:cn****1 文档编号:544607804 上传时间:2024-01-28 格式:DOCX 页数:17 大小:154.60KB
返回 下载 相关 举报
单片机电子时钟综合实验报告_第1页
第1页 / 共17页
单片机电子时钟综合实验报告_第2页
第2页 / 共17页
单片机电子时钟综合实验报告_第3页
第3页 / 共17页
单片机电子时钟综合实验报告_第4页
第4页 / 共17页
单片机电子时钟综合实验报告_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《单片机电子时钟综合实验报告》由会员分享,可在线阅读,更多相关《单片机电子时钟综合实验报告(17页珍藏版)》请在金锄头文库上搜索。

1、单片机综合实验报告题 目:电子时钟(LCD)显示一、实验内容:以 AT89C51 单片机为核心的时钟,在 LCD 显示器上显 示当前的时间:使用字符型LCD显示器显示当前时间。显示格式为“时时:分分:秒秒”。 用 4 个功能键操作来设置当前时间, 4 个功能键接在P1.0P1.3引脚上。功能键K1K4功能如下。 K1进入设置现在的时间。 K2设置小时。 K3设置分钟。 K4确认完成设置。程序执行后工作指示灯 LED 闪动,表示程序开始执 行,LCD显示“00 : 00 : 00”,然后开始计时。二、实验电路及功能说明1) 单片机主控制模块以 AT89C51 单片机为核心进行一系列控制。2) 时

2、钟显示模块用1602为LCD显示模块,把对应的引脚和最小系统 上的引脚相连,连接后用初始化程序对其进行简单 的功能测试。测试成功后即可为实验所用,如图:Current Tine 00:00:01曹目专器念lu1-0.-4.=LU寸口1- L0a1-宣3)时间调整电路用4个功能键操作来设置当前时间,4个功能键接在 P1.0P1.3引脚上。功能键K1K4功能如下。K1 进入设置现在的时间。K2设置小时。K3设置分钟。K4确认完成设置。如图:三、实验程序流程主程序:子程序:时钟主程序流程_;:_!LMD13LaLIJ1 1d;:XTM118ponfAra PD.ifAM PD2fAM PD.SfAr

3、a PD.-VAM PDjSfAK PDfifAH POTfAt?戈 TAL2rstK1 D - O5. g 7 ISet New Tine02:00:0LPSEN .ALE EAP2DffiQ F2.1MP2.ZTA.E P2.37M1 甩P2.歆P2.6/A14F2.WRRORXJO P2.1JEP32OTa FJqHTiP3.41OP3爼1 战创空 P3.7.W212222Bd.Ail*D1眾F a.7EXT. . . . 1 .RPtA12AZ 3鶴45A5aAJ67A7a-i 1 1Araa.Ki TEXT旺 EPACTS EXT实验结果及分析:单片机的晶振可以根据要求设定。 6MH

4、Z为和现实时间显示相同。实验采用12MHZ晶振采用 方式1定时,选取50ms采用20次中断达到一秒,采用查表 方式控制LCD显示。当烧入程序后开始运行,根据初始值设 定可以观察到显示的时间,这里为了更明显观察显示数据变 化把起始值设为23:59: 50运行后显示Current Tine23:59=50,K1为进入现在设置时间,当按下Set- New TineK1后显示00:00: 10,和实验要求相比较,实现了按下K1进入现在时间设置,按下K4确认完成时间设 置的功能;不同之处:当进入时间设置时在按下K1设置小 时,再次按下K1是设置分钟。增加功能:进入时间设置并 选择设置位置后K2键位数字增

5、加功能,K3键为数字减小功 能。根据仿真结果能够确定编程正确,基本实现了所有功能 而且有所改进。五、心得体会每次做单片机实验都会有不同的等收获,而这次的 实验让我感觉收获更大。这次的实验让我巩固了以往所 学,而且锻炼了自己发现问题解决问题的能力。在编程 过程,发现自己对 C 语言很生疏,很多技巧和函数运 用都不会,通过参考资料和询问同学终于让我完成了程 序,并实现了程序的功能。这不仅提高了自己动手能力, 也培养了自己的思考能力。这次在编程过程中学到了很多新东西,特别是 LCD 的显示,在设定的显示字符后,正确编译后显示各种设 定值,LCD显示16位字符,在最初编程时编译正确但 是 LCD 上的

6、显示字符有缺失,显示不完整,经过不断 调试发现空格同样占据字符,只有所有字符不超过 16 位且位置正确时才能完整正确显示。时间的显示需要每 一个显示的位子有定义,而且要给“:”留下特定位子。 同时编程时发现还可以显示其他如日期。但本实验不需 要且很难完成最终没实现。在仿真过程中发现许多模型不知道名称,最后搜索 了一份Proteus元件库,里边有很多元件模型的名称。最后搭建成功了仿真模型,并且运行成功。在这里要感谢老师在以往实验过程中不厌其烦的 帮助自己解决所遇到的问题和传授一些知识和小窍门。 让我对单片机有机会加深了解,体会到了单片机的强 大,学到了很多,感谢。六、程序清单#include #

7、include #define uchar unsigned char#define uint unsigned int#define DelayNOP() _nop_();_nop_();_nop_();_nop_();sbit K1 =P1A0;/选择调整小时,分钟sbit K2 =P1A1; /增力口sbit K3 =P1A2; 减小sbit K4 =P1A3;sbit SPK=P3A0;sbit RS =P2A0;sbit RW =P2A1;sbit E 二P2八2;uchar code Str1 = Current Time ; /一下两个字符串的 串长均为16uchar code

8、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();resul

9、t = (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;DelayN0P();E = 0; 设置 LCD 显示位置 void LCD_Set_Pos(uchar pos)LCD_Write_Command(pos | 0x80);/写LCD数据void LCD_Write_Data(uchar da

10、t)while(LCD_Busy_Check();判断 LCD 是否忙碌RS = 1;RW = 0;E = 0; P0 = dat; DelayNOP(); E = 1;DelayNOP();E = 0; /LCD初始化 void LCD_Initialize()LCD_Write_Command(0x38);DelayMS(1); LCD_Write_Command(0x0c);DelayMS(1);LCD_Write_Command(0x06);DelayMS(1);LCD_Write_Command(0x01);DelayMS(1);/显示函数,在LCD指定的行上显示字符串 void D

11、isplay_St ri ng(ucha r*st r,ucha r LineNo) uchar k;LCD_Set_Pos(LineNo); for(k=0;k;/显示修改标志 HMS_String10= s/10 + 0; /秒 HMS_String11= s/10 + 0;else HMS_String3 = ;HMS_String4 = h/10 + 0; h/10 + 0;HMS_String5 = h%10 + 0; h%10 + 0;HMS_String7 = m/10 + 0;+ 0;HMS_String8 = m%10 + 0;m%10 + 0;/不显示修改标志/时十位 HM

12、S_String5 =/时个位 HMS_String5 =/分 HMS_String8 = m/10/分 HMS_String8 =HMS_String11= s%10 + 0; /秒 HMS_String11= s%10 + 0;Display_String(HMS_String,0x40);/设置时间void Change_Time()Settime=0;if(K1 =0)按下k1键即进入修改状态TR0 = 0;Display_String(Str2,0x00); /第一行提示修改时间Settime = 1;while (Settime)if(K1 = 0)/确定调整小时还是分钟while

13、(K1 = 0)Change_H_or_M = !Change_H_or_M; *else if(K2 = 0) /增加while(K2 = 0); if(Change_H_or_M=1)if(+Hour = 24) Hour = 0;elseif(+Minute = 60) Minute = 0;else if(K3 = 0) /减少while(K3 = 0); if(Change_H_or_M = 1)if(-Hour = 0xff) Hour = 23; elseif(-Minute = 0xff) Minute = 59;else if(K4 = 0) /确定while(K4 = 0);Display_String(Str1,OxOO);第一行还原显示 strlSettime = 0;TR0 = 1;Display_HMS(Hour,Minute,Second);/定时器0中断void Time0() interrupt 1TH0 = (

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号