ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:34.43KB ,
资源ID:9171544      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-9171544.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机电子时钟设计报告.docx)为本站会员(b****0)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

单片机电子时钟设计报告.docx

1、单片机电子时钟设计报告电子时钟实验报告全部代码在文档末尾:51单片机,LCD1602液晶显示屏平台下编程实现,可直接编译运行目录:一, 实验目的20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以电子钟是以其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,得到了广泛的

2、使用。1. 学习8051定时器时间计时处理、按键扫描及LCD液晶显示的设计方法。2. 设计任务及要求 利用实验平台上LCD1602液晶显示屏, 设计带有闹铃功能的数字时钟二,实验要求 A.基本要求:1. 在LCD1602液晶显示屏上显示当前日期,时间。 2. 利用按键可对时间及闹玲进行设置,并可显示设置闹玲的时间。闹玲时间到蜂鸣器发出声响,一分钟后闹铃停止。B.扩展部分:1.日历功能(能对年,月,日,星期进行显示,分辨平年,闰年以及各月天数,并调整)实现年月日时分秒的调整,星期准确的随着日期改变而改变进行显示。2.定时功能(设定一段时间长度,定时到后,闹铃提示)C.可扩展部分:1.闹铃重响功能

3、(闹铃被停止后,以停止时刻开始,一段时间后闹铃重响,且重响时间的间隔可调)2可进行备忘录提示,按照年月日,可在设定的某年某月进行闹铃提示。三,实验基本原理利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.05s中断一次并当作一个计数,设定定时1秒的中断计数初值为20,每中断一次中断计数初值加1,当减到20时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了,是否一天到了,是否一个月到了,是否一年到了。将时间在LCD液晶屏上显示,降低了程序的编写难度。LCD的固定显示特性是我们省去了数码管的动态扫描显示。 四,实验设计分析针对要实现的功能,采用AT89S52单

4、片机进行设计,AT89S52 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。首先,在编程之前必

5、须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解C语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电路并导入程序检查电路,若与设计的完全一样一般

6、能实现想要的功能。最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!五,实验要求实现A.电路设计1. 整体设计此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用lcd1602显示,年份,月份,星期,小时、分钟和秒(日),使电路更加简单。单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。电路的总体设计框架如下: 2. 分块设计模块电路主要分为:输入部分、输出部分、复位和晶振电路。2.1 输入部分输入信号主要是各种模式选择和调整信号,由按键开关提供。以下为输入部分样例:在本实验中主要用用P3口输入按键信号,还用到了特殊的P0口。对于P0口,由于其

7、存在高阻状态,为了实现开关功能,给其添加上拉电阻,具体如下图所示:2.2 输出部分本电路的输出信号LCD的写入命令和写入数据,闹铃脉冲信号。闹铃由P1.5端输出,模块如下:日期时间由LCD1602输出,模块如下:2.3 晶振与复位电路本实验单片机时钟用内部时钟,模块如下:复位电路为手动复位构成,模块如下:B.程序设计B.1 程序总体设计本实验用汇编程序完成.程序总的流程图如下:B.2 程序主要模块中断服务程序:/*一秒定时中断函数*/void timer0() interrupt 1 using 1 ET0=0; /关闭定时器T0中断允许位 TR0=0; /关闭定时器T0 jiamiao+;

8、TH0=(65536-50000)/256; /设定每次中断间隔50ms TL0=(65536-50000)%256; TR0=1; /启动定时器T0 ET0=1; /打开定时器T0中断允许位本实验中,计数器T0有运用,其中T0中断为时钟定时所用,T1中断用于秒表的准确性保证。T0的定时长度为0.05s,工作于方式1,计数1次,时长1us,故计数器计数20次,进入中断,装满定时器需要0.05s的时间,从而20次中断为一秒,一秒之后,判断是否到60秒,若不到则秒加一,然后返回,若到,则秒赋值为0,分加一,依次类推。包括日期显示的功能也是如此。另外,由于要实现倒计时功能,因此在中断程序中还要加入加

9、一的寄存器,需要时将其进行显示。 程序中日历的实现较为复杂,要考虑平年,闰年,特殊的2月,每月的天数的不尽相同。具体的逻辑判断方法为:首先,要考虑年份是不是闰年,闰年的判断方法是:将年份除以100,若能整除,则将年份除以400,若还能整除,则为闰年,若不能,则为平年;若不能被100整除,则判断是否能被4整除,若能,则为闰年,若不能则为平年。只有2月与平、闰年相关,因此在闰年和平年的子程序中,要判断是不是2月,若是则在相应的年中进行日期的增加,若不是则转入平时的月份。其中1、3、5、7、8、10、12月是每月31天,4、6、9、11月为每月30天。显示子程序:/*刷新液晶屏显示内容子函数*/vo

10、id brush_lcd() static uchar old_second=0x01; if(dis_val6!=old_second) old_second=dis_val6; /刷新原来的秒为新秒值 in_command(0x80); /设定第一行字符串起始显示位置 in_data(2); /年的千位 in_data(0); /年的百位 in_data(num_tabdis_val0/16); /显示年 in_data(num_tabdis_val0%16); in_data(-); /显示分隔符 in_data(num_tabdis_val1/16); /显示月 in_data(num

11、_tabdis_val1%16); in_data(-); /显示分隔符 in_data(num_tabdis_val2/16); /显示日 in_data(num_tabdis_val2%16); in_data( ); /显示分隔符 in_data(); /显示分隔符 week_disp(dis_val3); /LCD1602显示星期值 in_data(); /显示分隔符 in_command(0xc0); /设定第二行字符串起始显示位置 in_data(-); /显示分隔符 in_data(-); /显示分隔符 in_data(-); /显示分隔符 in_data(-); /显示分隔符

12、in_data(num_tabdis_val4/16); /显示时 in_data(num_tabdis_val4%16); in_data(:); /显示分隔符 in_data(num_tabdis_val5/16); /显示分 in_data(num_tabdis_val5%16); in_data(:); /显示分隔符 in_data(num_tabdis_val6/16); /显示秒 in_data(num_tabdis_val6%16); in_data(-); /显示分隔符 in_data(-); /显示分隔符 in_data(-); /显示分隔符 in_data(-); /显示分

13、隔符 本程序通过Keil单片机开发平台实现程序的编译,链接,生成HEX文件。程序再编译过程中可以发现错位,并及时改正,在设计时非常重要,使错误被扼杀在摇篮中。五.实验总结及感想一分耕耘,一分收获。只有亲自用实践来验证这句话,在能得其要领。经过这次单片机课程设计,我从一个单片机实践的门外汉,已经越升为略知一二的新手。虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的原理,全部知识点,各个细节,一切设计皆有可能。在实验的开始几天,基本上没有收获,不知何从下手,不知所措。为了看得更远,不妨站在前人的肩膀上,我在整体思路模糊的情况下,在网上大量招资粮,各种与电子时钟相关的文章,我

14、阅读了不少。随着涉猎的点滴积累,我对电子时钟的设计方案已经慢慢酝酿而成。有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心。实验中遇到了不少问题,接下来总结一下,共同探讨。1, P0口开关问题。P0口比较特殊,它存在高阻态,要使其输入不是高电平就是低电平,就要接上拉电阻,给其高电平输入。以上就是实验中遇到的主要问题,基本上都找到了相应的解决之道。整个实验的过程就是一个解决问题的过程,每天都解决一些问题,我的实验也就解决了,当然结果不重要,功利化的追求结果,会使人浮躁,还是享受那份疑难迎刃而解的快感吧!全部完整代码:此代码未经本

15、人优化,可以根据自己的需求优化代码。盗版不究,可直接引用。/*/基于STC89S52单片机以及液晶1602显示的万年历项目/*/#include#include#define uchar unsigned char#define uint unsigned int/*液晶1602相关参数*/#define data_port P0 /液晶屏指令、数据通信接口sbit rs=P10; /液晶屏寄存器选择接口(rs=0时选择指令寄存器,rs=1时选择数据寄存器) sbit rw=P11; /液晶屏读写选择接口(rw=0时选择写入,rw=1时选择读出) sbit en=P12; /液晶屏使能接口(e

16、n=0时通信接口中断,en=1时通信接口接通)uchar code line1_str=-Welcome!-;/液晶屏第一行要显示的字符串uchar code line2_str= made by: MCU ;/液晶屏第二行要显示的字符串/*按键设置的相关参数*/sbit timer=P15; /蜂鸣器sbit sound=P34; /进入闹铃设置状态键uchar sflag=0,ssflag=0; /闹铃设置标志位;闹铃工作标志位sbit set_key=P37; /进入设置sbit up_key=P36; /加号键sbit cancle_key=P35; /完成设置键uchar set=0

17、; /是否进行了设置uchar flag=0; /设置选择标志uchar year=0x00; /年寄存器 uchar month=0x01; /月寄存器 uchar day=0x01; /日寄存器 uchar week=0x06; /星期寄存器uchar hour; /时寄存器 uchar minite; /分寄存器 uchar second; /秒寄存器 uchar jiamiao=0; /加秒参数uchar fen1,fen2; /(数据交换)分定时寄存器uchar shi1,shi2; / (数据交换)时定时寄存器 /液晶屏要显示的数字表uchar dis_val7=0x00,0x01

18、,0x01,0x06,0x00,0x00,0x00;/依次存储:年,月,日,星期,时,分,秒/*子函数部分*/void lcd_int(); /初始化1602液晶void welcome(); /欢迎界面void in_command(uchar com); /向液晶屏输入命令void in_data(uchar dat); /向液晶屏输入数据void delay(uint ms); /延时函数void key(); /按键设置函数uchar calculate_week(); /星期计算函数void week_disp(uchar x); /LCD1602显示星期值子函数声明void lcd

19、_disp_string(uchar str); /液晶屏显示一串字符子函数声明void brush_lcd(); /刷新液晶屏显示内容子函数声明void run(); /万年历正常运行函数/*/void main() TMOD=0x01; /0000 0001 使用定时器T0的模式1(16位模式) TH0=(65536-50000)/256; /设定每次中断间隔50ms TL0=(65536-50000)%256; jiamiao=1; EA=1; /打开总中断允许 ET0=1; /打开定时器T0中断允许位 TR0=1; /启动定时器T0 lcd_int(); welcome(); dela

20、y(1000); while(1) key(); if(jiamiao=20) second+; dis_val6=(second/10)4)|(second%10); /刷新秒 jiamiao=0; run(); if(flag=0) if(dis_val0=0x00 & dis_val1=0x01 & dis_val2=0x01)/2000年1月1日为星期六 dis_val3=0x06; brush_lcd(); /刷新液晶屏显示内容 if(hour=shi2 & minite=fen2 &ssflag=1) timer=0; else timer=1; /*延时子函数*/void del

21、ay(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年的总天数 else days_number=0; for(i=1;imonth;i+) switch(i) case 1: case 3: case 5: case 7: case 8: case 10: case 12:days_number+=31;/大月31天 break; case 4: case 6: ca

22、se 9: case 11:days_number+=30;/小月30天 break; case 2: if(year%4=0) /闰年2月29天 days_number+=29; else /平年2月28天 days_number+=28; break; days_number+=day; /加上本月日期 if(days_number+5)%7=0) /计算现在的星期值,并返回其值 return(7); else return(days_number+5)%7); /*LCD1602显示星期值子函数*/void week_disp(uchar x) switch(x) case 1: lcd

23、_disp_string(MON); /显示星期一 break; case 2: lcd_disp_string(TUE); /显示星期二 break; case 3: lcd_disp_string(WED); /显示星期三 break; case 4: lcd_disp_string(THU); /显示星期四 break; case 5: lcd_disp_string(FRI); /显示星期五 break; case 6: lcd_disp_string(SAT); /显示星期六 break; case 7: lcd_disp_string(SUN); /显示星期日 break; /*按键设置函数*/void key() if(set

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2