单片机电子时钟设计报告_第1页
单片机电子时钟设计报告_第2页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子时钟实验报告全部代码在文档末尾: 51 单片机, LCD1602 液晶显示屏平台下编程实现,可直接编译运行目录:一, 实验目的 . 2二,实验要求 . 2三,实验基本原理 . 3四,实验设计分析 . 3五,实验要求实现 . 4A. 电路设计. 41. 整体设计 . 52. 分块设计 . 5输入部分 . 5输出部分 . 5晶振与复位电路 . 6B. 程序设计 . 6程序总体设计 . 6程序主要模块 . 6五. 实验总结及感想 . 6一, 实验目的20 世纪末, 电子技术获得了飞速的发展, 在其推动下, 现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,

2、同 时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。对于那些对时间把握非常严格和准确的人或事来说, 时间的不准确会带来非常大的 麻烦,所以电子钟是以其小巧,价格低廉,走时精度高,使用方便,功能多,便于 集成化而受广大消费的喜爱,得到了广泛的使用。1. 学习 8051 定时器时间计时处理、按键扫描及LCD 液晶显示的设计方法。2. 设计任务及要求 利用实验平台上 LCD1602 液晶显示屏,设计带有闹铃功能的数字时钟二,实验要求A. 基本要求:1.在 LCD1602 液晶显示屏上显示当前日期,时间。2. 利用按键

3、可对时间及闹玲进行设置, 并可显示设置闹玲的时间。 闹玲时间到蜂鸣器发出声响,一分钟后闹铃停止。B. 扩展部分:1. 日历功能(能对年,月,日,星期进行显示,分辨平年,闰年以及各月天数,并 调整)实现年月日时分秒的调整,星期准确的随着日期改变而改变进行显示。2. 定时功能(设定一段时间长度,定时到后,闹铃提示)C.可扩展部分:1. 闹铃重响功能(闹铃被停止后,以停止时刻开始,一段时间后闹铃重响,且重响 时间的间隔可调)2可进行备忘录提示,按照年月日,可在设定的某年某月进行闹铃提示。三,实验基本原理利用单片机定时器完成计时功能,定时器 0 计时中断程序每隔中断一次并当作 一个计数,设定定时 1

4、秒的中断计数初值为 20,每中断一次中断计数初值加 1,当 减到 20 时,贝 y 表示 1s 到了,秒变量加 1,同理再判断是否 1min 钟到了,再判断是 否 1h 到了 , 是否一天到了,是否一个月到了,是否一年到了。将时间在 LCD 液晶屏上显示,降低了程序的编写难度。LCD 的固定显示特性是我们省去了数码管的动态扫描显示。四,实验设计分析针对要实现的功能,采用 AT89S5 单片机进行设计,AT89S52 单片机是一款低功 耗,高性能 CMOS 位单片机,片内含 4KB 在线可编程(ISP)的可反复擦写 1000 次的 Flash 只读程序存储器,器件采用高密度、非易失性存储技术制造

5、,兼容标准MCS-51 指令系统及 80C51 引脚结构。这样,既能做到经济合理又能实现预期的功能。在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解, 又能便于添加各项功能。程序可分为闹钟的声音程序、时间显示程序、日期显示程 序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。 运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的 错误。首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、 存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第 二部分是硬件部分:依据想要的功能分块设计设计,比如输入需

6、要开关电路,输出 需要显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解 C 吾言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是 软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是 软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真, 仿真无法完成时检查 软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电 路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。最后进行功 能扩展,在已经正确的设计基础上,添加额外的功能!五,实验要求实现A.电路设计1.整体设计此次设计主要是应用单片机来设计电子时钟,硬件

7、部分主要分以下电路模块:显示电路用 lcd1602 显示,年份,月份,星期,小时、分钟和秒(日),使电路更加简单。单片机采用 AT89S5 係列,这种单片机应用简单,适合电子钟设计。电路的总体设计框架如下:输入信号主要是各种模式选择和调整信号,由按键幵关提供。以下为输入部分样例:在本实验中主要用用 P3 口输入按键信号,还用到了特殊的P0 口。对于 P0 口,由于其存在高阻状态,为了实现幵关功能,给其添加上拉电阻,具体如下图所示:输出部分 本电路的输出信号 LCD 勺写入命令和写入数据,闹铃脉冲信号闹铃由端输出,模块如下: 日期时间由 LCD1602 俞出,模块如下:晶振与复位电路本实验单片机

8、时钟用内部时钟,模块如下: 复位电路为手动复位构成,模块如下: B.程序设计程序总体设计本实验用汇编程序完成 . 程序总的流程图如下:程序主要模块中断服务程序:/*一秒定时中断函数 */void timer0() interrupt 1 using 1ET0=0;验总结及感想一分耕耘,一分收获。只有亲自用实践来验证这句话,在能得其要领。经过这 次单片机课程设计,我从一个单片机实践的门外汉,已经越升为略知一二的新手。虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的 原理,全部知识点,各个细节,一切设计皆有可能。在实验的开始几天,基本上没有收获,不知何从下手,不知所措。为了

9、看得更远,不妨站在前人的肩膀上,我在整体思路模糊的情况下,在网上大量招资粮,各种与电子时钟相关的文章,我阅读了不少。随着涉猎的点滴积累,我对电子时钟的设计方案已经慢慢酝酿而成。有了方向和不少知识储备后,在接下来的几天,几乎 每天都有突破, 虽然有时只是一句程序的修改或诞生, 但那种收获的感觉很暖人心。实验中遇到了不少问题,接下来总结一下,共同探讨。1, P0 口幵关问题。P0 口比较特殊,它存在高阻态,要使其输入不是高电平就 是低电平,就要接上拉电阻,给其高电平输入。以上就是实验中遇到的主要问题, 基本上都找到了相应的解决之道。 整个实验的过程就是一个解决问题的过程,每天都解决一些问题,我的实

10、验也就解决了,当 然结果不重要,功利化的追求结果,会使人浮躁,还是享受那份疑难迎刃而解的快 感吧!全部完整代码:此代码未经本人优化,可以根据自己的需求优化代码。盗版不究,可直接引用。/*/基于 STC89S52 单片机以及液晶 1602 显示的万年历项目/*/#include#include #define uchar unsigned char #define uint unsigned int液晶 1602 相关参数 */sbit timer=P1A5;/蜂鸣器sbit sound=P3A4;/进入闹铃设置状态键uchar sflag=0,ssflag=0;/ 闹铃设置标志位;闹铃工作标#

11、define data_port P0sbit rs=P1A0;指令寄存器, rs=1 时选择数据寄存器)sbit rw=P1A1;入, rw=1 时选择读出)sbit en=P1A2;断, en=1 时通信接口接通)uchar code line1_str=-Welcome!-;/uchar code line2_str= made by: MCU ;/ 液晶屏指令、数据通信接口/ 液晶屏寄存器选择接口 (rs=0 时选择/ 液晶屏读写选择接口 (rw=0 时选择写/ 液晶屏使能接口 (en=0 时通信接口中液晶屏第一行要显示的字符串液晶屏第二行要显示的字符串按键设置的相关参数 */志位sb

12、it set_key=P3A7;/ 进入设置sbit up_key二卩3八6;/ 加号键sbit cancle_key=P3A5;/ 完成设置键uchar set=0;/ 是否进行了设置uchar flag=0;/设置选择标志uchar year=0 x00;/ 年 寄存器uchar month=0 x01;/月寄存器uchar day=0 x01;/日 寄存器uchar week=0 x06;/ 星期 寄存器uchar hour;/时寄存器uchar minite;/分寄存器uchar second;/秒寄存器uchar jiamiao=0;/ 加秒参数uchar fen1,fen2;/ (

13、数据交换)分定时寄存器uchar shi1,shi2;/ (数据交换)时定时寄存器uchar code num_tab=09;/ 液晶屏要显示的数字表uchar dis_val7=0 x00,0 x01,0 x01,0 x06,0 x00,0 x00,0 x00;/日,星期,时,分,秒依次存储 : 年, 月,子函数部分*/void lcd_int();void welcome();void in_command(uchar com);void in_data(uchar dat);void delay(uint ms);void key();uchar calculate_week();voi

14、d week_disp(uchar x);void lcd_disp_string(uchar str);void brush_lcd();void run();/ 初始化 1602 液晶/ 欢迎界面/ 向液晶屏输入命令/ 向液晶屏输入数据/ 延时函数/ 按键设置函数/ 星期计算函数/LCD1602 显示星期值子函数声明/ 液晶屏显示一串字符子函数声明/ 刷新液晶屏显示内容子函数声明/ 万年历正常运行函数*void main()TMOD=0 x01;/OOOO OOO1 使用定时器 TO 的模式 1 (16 位模式)TH0=(65536-50000)/256; / 设定每次中断间隔 50msT

15、LO=(65536-5OOOO)%256;jiamiao=1;EA=1;/打开总中断允许ETO=1;/打幵定时器 TO 中断允许位TRO=1;/启动定时器 TOlcd_int();welcome();delay(1OOO);while(1)key();if(jiamiao=2O)second+;dis_val6=(second/10)4)|(second%10); / 刷新 秒 jiamiao=0;run();if(flag=0)if(dis_val0=0 x00 & dis_val1=0 x01dis_val2=0 x01)/2000 年 1 月 1 日为星期六dis_val3=0

16、x06;brush_lcd(); / 刷新液晶屏显示内容if(hour=shi2 & minite=fen2 &ssflag=1)timer=0;&void delay(uint ms)uchar i;while(ms-)for(i=0;i=1)days_number=(year-1)/4)+1); / 从 00 年到 year-1 年的闰年个数days_number=days_number+(year*365); / 从 00 年到 year-1 年的总天数elsedays_number=0;for(i=1;imonth;i+)计算星期值子函数*/switch(i)c

17、ase 1:case 3:case 5:case 7:case 8:case 10:case 12:days_number+=31;/ 大月 31 天break;case 4:case 6:case 9: case 11:days_number+=30;/ 小月 30 天case 2: if(year%4=0)/ 闰年 2 月 29 天days_number+=29;else / 平年 2 月 28 天break;days_number+=28;break;days_number+=day;/ 加上本月日期if(days_number+5)%7=0)/ 计算现在的星期值 , 并返回其值retu

18、rn(7);elsereturn(days_number+5)%7);/*LCD1602 显示星期值子函数 */ void week_disp(uchar x)switch(x)case 1:case 2:case 3:case 4:case 5:case 6:lcd_disp_string(MON);break;lcd_disp_string(TUE);break;lcd_disp_string(WED);break;lcd_disp_string(THU);break;lcd_disp_string(FRI);break;lcd_disp_string(SAT);break;/ 显示星期一

19、 / 显示星期二 / 显示星期三 / 显示星期四 / 显示星期五 / 显示星期六 case 7:lcd_disp_string(SUN);/ 显示星期日 break;/ 检测 设置 键是否按下/ 延时消抖/ 打开定时器 T0 中断允许位/ 启动定时器 T0按键设置函数*/elsevoid key()if(set_key=0)delay(5);if(set_key=0)ET0=0;TR0=0;if(flag6)flag+;IIIIIIflag=0;switch(flag)case 0:if(set=1)set=0;/ 检测时间是否更改/ 时间更改标志复位dis_val0=(year/10)4)|

20、(year%10);dis_val1=(month/10)4)|(month%10); /dis_val2=(day/10)4)|(day%10);dis_val3=week;/ 刷新刷新/ 刷新IIIIII年月日刷新 星期 dis_val4=(hour/10)4)|(hour%10);dis_val5=(minite/10)4)|(minite%10);dis_val6=(second/10)4)*10)+(dis_val0&0 x0f); / 预 设调节变量初始值为当前时刻month=(dis_val14)*10)+(dis_val1&0 x0f);day=(dis_val

21、24)*10)+(dis_val2&0 x0f);hour=(dis_val44)*10)+(dis_val4&0 x0f);minite=(dis_val54)*10)+(dis_val5&0 x0f);second=(dis_val64)*10)+(dis_val6&0 x0f);break;case 2:in_command(0 x86); / 设定显示 ( 光标 ) 位置 月 低位闪烁break;case 3:in_command(0 x89); / 设定显示 ( 光标 ) 位置 日 低位闪烁break;case 4: in_command(0 xc5)

22、; / 设定显示 ( 光标 ) 位置 - 时 低位闪烁break;case 5: in_command(0 xc8); / 设定显示 ( 光标 ) 位置 - 分 低位闪烁break;case 6: in_command(0 xcb); / 设定显示 ( 光标 ) 位置 - 秒 低位闪烁break;while(set_key=0);if(up_key=0 & flag!=0)按下/ 检测 设置时间 启动时 , 上升 键是否/ 延时消抖if(sflag=1)break;if(year28)delay(5);if(up_key=0)switch(flag)case 1:in_data(num

23、_tabday/10); /in_data(num_tabday%10);week=calculate_week();/ 计算星期值in_command(0 x8c);/ 设定显示 ( 光标 ) 位置 星期 week_disp(week);/LCD1602 显示星期值in_command(0 x82);/ 设定显示 (光标) 位置- 年高in_data(num_tabyear/10); / 显示正在调节的 年in_data(num_tabyear%10);in_command(0 x83); / 设定显示 ( 光标 ) 位置 - 年 低day=28;in_command(0 x88);/ 设定

24、显示 ( 光标 ) 位置- 日 高位修正 日位闪烁break;case 2: if(sflag=1)break;if(month30)day=30;in_command(0 x88);/ 设定显示 ( 光标 ) 位置 - 日 in_data(num_tabday/10); /修正 日高位in_data(num_tabday%10);if(month=2)if(year%4!=0) / 平年if(day28)day=28;in_command(0 x88); / 设 定 显 示 ( 光 标 ) 位 置in_data(num_tabday/10); /修正 日in_data(num_tabday%

25、10);else / 闰年- 日 高位if(day29)day=29;in_command(0 x88); / 设 定 显 示 ( 光 标 ) 位 置in_data(num_tabday/10); /修正 日in_data(num_tabday%10);week=calculate_week();/ 计算星期值in_command(0 x8c); / 设定显示 (光标) 位置- 星期week_disp(week); /LCD1602 显示星期值in_command(0 x85); / 设定显示 (光标) 位置- 月高位in_data(num_tabmonth/10); / 显示正在调节的 月i

26、n_data(num_tabmonth%10);- 日 高位in_command(0 x86); / 设定显示 ( 光标 ) 位置 月 低位闪烁break;case 3: if(sflag=1)break;if(month=4 | month=6 | month=9 | month=11)if(day30)day+;elseday=1;else if(month=2)if(year%4!=0) / 平年if(day28) day+; elseday=1;elseif(day29)day+;elseday=1;elseif(day31)/ 闰年if(sflag=1)/ 完成闹钟状态下的数值变换,

27、并保day+; elseday=1;week=calculate_week();/ 计算星期值in_command(0 x8c); / 设定显示 (光标) 位置-week_disp(week); /LCD1602 显示星期值in_command(0 x88); / 设定显示 (光标) 位置-in_data(num_tabday/10); / 显示正在调节的 in_data(num_tabday%10);in_command(0 x89); / 设定显示 ( 光标 ) 位置 -break;case 4: if(hour23)闪烁星期日 高位日- 日 低位shi1=hour;hour+;shi2=hour;elsehour+;elsehour=0;in_command(0 xc4); / 设定显示 (光标) 位置- 时高位in_data(num_tabhour/10); / 显示正在调节的 时in_data(num_tabhour%10)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论