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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(万年历程序和电路图Word下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

万年历程序和电路图Word下载.docx

1、Lcd液晶能一屏把本设计所要显示的信息表达完整。而且lcd耗电小,体积小很适合与室使用。本设计的要求日期时间以数字表示、星期用3位英文字符表示共21个字符,lcd1602能显示32个字符,足以完成显示功能。Lcd1602有16个引脚,各个引脚功能见下表:引脚号引脚名电平输入/输出作用1VSS电源地2VDDVcc电源+5v3VEE比照调整电压4RS0/1输入0=输入指令,1=输入数据5R/W0=向lcd写入数据或指令1=从lcd读取数据6E1,1-使能信号,1=读取信息1-0下降沿执行指令7DB0数据总线line08DB1数据总线line19DB2数据总线line210DB3数据总线line31

2、1DB4数据总线line412DB5数据总线line513DB6数据总线line614DB7数据总线line715ALcd背光正极KLcd背光负极表 1-1 lcd1602引脚及功能2.按键与蜂鸣器本设计选用轻触按钮,型号为XDJT1102S。选用压电式蜂鸣器型号PT-1540P RoHS。3.控制芯片根据lcd1602液晶显示器与按键的引脚I/O数量以及扩展功能的要求,所选控制芯片至少需要三组I/O口,本设计功能简单,所以程序量较小,AT89C51是一种带4K字节闪存只读存储器的低电压、高性能CMOS 8位微处理器。AT89c51是51系列根本的控制芯片,能满足本设计的要求,性价比也要低于5

3、1系列其他的芯片。4.日期时间生成模块为了减少本钱,使用51的部定时器中断再配合软件计数的方式来生成一秒的时间。1.2软件设计1.2.1编程环境及语言:本设计的原理图实现是在proteus中实现的,本设计的程序在keil Uvision4环境中进展编程与调试的,keil Uvision4与proteus联调能有效的对各个设计进展测试。编程语言51C。1.2.2程序框图图1-2 程序框图1.time0中断用于生成时间,具体由程序和硬件共同产生1秒的时间。2.两个外部中断能进展时间日期的切换,和对时间日期进展调整,播放音乐,能满足对按键设置的要求。3.主函数能及时在液晶屏上显示默认的时间和调整后的

4、时间。第二章 系统设计2.1硬件设计2.1.1振荡电路本设计51芯片选用部振荡器方式。由于本设计的时间由部定时器中断与软件计数相结合产生的,所以从计算方便以及系统的效率上考虑,本设计选用12MHz频率的晶振,电路原理图如下:图2-1 AT89C51的振荡电路经厂家推荐稳定电路的电容C1,C2=30pF+-10p附录资料AT89C51.PDF 第4-32页。2.1.2复位电路本设计使用上电复位电路。单片机晶振为12MHz,起振时间将近1ms,单片机1个机器周期的时间为1us。单片机每次上电复位所需的最短延时应该不小于treset。这里,treset等于上电延时与起振延时之和。从实际上讲,延迟一个

5、treset往往还不够,不能够保障单片机有一个良好的工作开端。复位电路把单片机锁定在复位状态上并且维持一个延时记作TRST,以便给予电源电压从上升到稳定的一个等待时间;在电源电压稳定之后,再插入一个延时,给予时钟振荡器从起振到稳定的一个等待时间;在单片机开场进入运行状态之前,还要至少推迟2个机器周期的延时间。单片机是高电平的时候复位,一般是用电阻和电容组成的,电容充电的时RST复位端为高电平,此时单片机开场复位.电容充电完成,此时单片机复位完成。由此电容值可取22uf,电阻值取10K。详细见附录文件电容充电时间的计算方法.pdf图2-2 AT89C51上电复位电路2.1.3按键选用两个轻触按键

6、与单片机P32int0、P33int1两个引脚相接组成的独立按键。2.1.4 lcd显示电路1.lcd的选用本设计选用型号为LCD-016M002L显示器。具体资料见附录文件LCD-016M002L.pdf。2.lcd与51引脚的连接Lcd1602引脚AT89C51引脚LCD1602引脚P20P03P21P04P22P05P00P06P01P07P02表2-1 lcd1602与51的连接VEE为液晶显示器比照度调整端,接正电源时比照度最弱,接地时比照度最高,比照度过高时会产生“鬼影,使用时可以通过一个10K的电位器调整比照度。图2-3 1602液晶与单片机接口电路2.1.5音乐播放电路此模块采

7、用蜂鸣器实现,蜂鸣器驱动电流为20mA,单片机的P1口输出电流为26mA能够直接驱动蜂鸣器。只要编写相应的程序即可实现发出不同频率的声音,蜂鸣器与单片机的接口电路,蜂鸣器接线与单片机P17引脚相连。图2-5 蜂鸣器电路2.1.6 P0上拉电阻计算由于lcd数据口是与51的P0口连接的,在P0口做一般I/O使用时要外接上拉电阻。根据LCD-016M002L显示器的伏安特性,要保证上拉电阻明显小于lcd的阻抗,以使高电平时输出有效Lcd工作电压:+5VLcd工作电流:20mAlcd阻抗=5v/20mA=2.5k。上拉电阻值可以取2.2k详细见附录资料上拉电阻下拉电阻的总结.doc,由于需要八个一样

8、的上拉电阻如图2-6所示,也可用一个排阻。具体型号见附录表。图2-6 上拉电阻2.2软件设计2.2.1程序流程图图2-6主函数流程 图2-7 time0中断效劳程序流程是否图2-8 int1中断效劳流程图2-9 int0中断效劳流程2.2.2流程的各个模块设计全局变量datetime数组保存日期时间星期的容器。min2,hour2,day2,mon2,year4;调整时候使用的中间变量。buffer_date16,buffer_time16显示缓冲区。1.定时器中断效劳程序定时器1计时一秒。计数初值的计算方法如下:设晶振频率为f,那么定时/计数器计数频率为f/12, 定时/计数器的计数总次数T

9、_all在方式1为216=65536,定时间隔为T,计数初值为a,那么有 a=-Tf/12将计数初值a分别赋给加1计数器TH0、TL0:TH0=T_all-a/256;TL0=T_all-a%256;本设计晶振频率为12MHz,定时间隔为50ms,所以a=-0.05*12000000/12a=50000TH0=65536-50000/256TL0=65536-50000%2561s就要计20次,中断效劳程序如下:void time0() interrupt 1 using 3TH0=(65536-50000)/256; TL0=(65536-50000)%256; if(+count=20)/

10、计时一秒 count=0; DATATIME();/按实际规那么日期时间更新 2.int0中断效劳程序按键1接在了int0对应的引脚P32。按键2接在了int1对应的引脚P33。Int0为电平触发方式,int1为边沿触发方式。由于按键2是一键多功能,具体功能由状态标志FLAG说明。所以在int0中断效劳程序中要有对FLAG标志的置位及清位的操作。在调整期间为了时间准确定时器不能工作,为了对日期时间的各位值进展循环调整,设置了一个计数器,它的值说明要调整的是哪位。终端效劳程序如下:void int0_K1() interrupt 0 TR0=0; /定时器停顿 um+; /计数器加1 FLAG=

11、1; /标志位置位 datetime0=0; while(K1=0); /等待按键松开 if(um12) /调整完毕,各个状态复原 TR0=1; um=-1; FLAG=0;3.int1中断效劳程序Int1只要判断标志位执行任务就行了,中断效劳程序如下:void int1_K2() interrupt 2 if(FLAG=1)/调整状态下那么位对应调整位的增值,正常状态那么播放音乐 EDIT_datetime(um);/按计数器的值调整对应位 else ShowString(0x00,0, ); /播放音乐是屏幕上的字幕 ShowString(0x00,1,happy); music(); D

12、elayms(500); 4.主函数程序主函数对各个中断及lcd1602初始化后,就一直进展显示工作了,显示的时候判断标志FLAG以区别是正常显示还是闪烁显示。主程序如下:void main() IE=0X87; /开中断 ea=1,et0=1,et1=1,ex0=1 TCON=0X04; /it1为边沿触发,it0电平触发 IP=0X0a; /定时器0,1为高优先级 TMOD=0X01; /设置定时器0方式1 TH0=(65536-50000)/256; Initialize_LCD(); /初始化LCD TR0=1; while(1) buffer_value(); /设置显示缓存区的容

13、if(FLAG) /调整时对应调整位置闪烁 if(+refresh=5) refresh=0; Flash(um); DIS_buffer(); /将显示缓冲区的容输出到lcd上5.星期在调整是是自动更新的,这要归功于蔡勒公式。算法如下C51表示:unsigned char week() unsigned int y,m,c,s; y=datetime5%100; c=datetime5/100; if(datetime4=1) m=13; y-; if(datetime4=2) m=14; s=y+y/4+c/4-2*c+26*(m+1)/10+datetime3-1;/蔡勒公式 s=s%7

14、; return s;函数返回值:0-星期日,1-星期一6-星期六6.闰年是自动判断的,算法:(year%4=0)&(year%100!=0)|year%400=0函数代码如下:unsigned char Ynian(unsigned char year) if( (year%400=0|year%4=0) & (year%100!=0) ) return 1; return 0;是闰年返回1,否那么返回07.月的天数判断,由于1,3,5,7,8,10,12每月有31天;4,6,9,11每月有30天;2月闰年29天,平年28天。所以只要判断月号是哪一类的,就返回那类的值,2月用闰年判断算法判断

15、。unsigned char MON(unsigned char month) switch(month) case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; default: if(Ynian(datetime5)/二月特殊,闰年判断 return 29; else return 28; 返回各月的天数上限。8.日期时间更新按照实际规那么更新,60秒一分,60分一时,24小时一日,30日或31日或28日或29日一月,12

16、月一年。void DATATIME() datetime0+; if(datetime059) /秒判断 datetime0=0; datetime1+; if(datetime159) /分 datetime1=0; datetime2+; if(datetime223)/时 datetime2=0; datetime3+; if(datetime3MON(datetime4)/日 datetime3=1; datetime4+; if(datetime412) /月 datetime4=1; datetime5+; /年/时刻为进入调整状态作准备,将当前日期时间值赋给调整时的变量 date

17、time6=week(); min0=datetime1%10; min1=datetime1/10; hour0=datetime2%10; hour1=datetime2/10; day0=datetime3%10; day1=datetime3/10; mon0=datetime4%10; mon1=datetime4/10;year0=datetime5%10,year1=datetime5%100/10; year2=datetime5%1000/100,year3=datetime5/1000;9.调整日期时间函数,利用um计数器指定当前的调整属性,函数源代码如下:void EDI

18、T_datetime(charum) switch(um) case 0: min0+; if(min09) /分低位调整限制 min0=0; break; min1+; if(min15) /分高调整限制 min1=0; case 2: hour0+; if(hour09)/时低位调整限制 hour0=0; hour1+; if(hour12)/时高位调整限制 hour1=0; day0+; if(day09) /日低位调整限制 day0=0; day1+; if(day13)/日高位调整限制 day1=0; mon0+; if(mon09)/月低位调整限制 mon0=0; mon1+; i

19、f(mon11)/月高位调整限制 mon1=0; year0+; /年调整 if(year09) year0=0; year1+; if(year1 year1=0; year2+; if(year2 year2=0; year3+; if(year3 year3=0; datetime1=min0+min1*10; /调整后将datetime实时更新 datetime2=hour0+hour1*10; datetime3=day0+day1*10; datetime4=mon0+mon1*10; datetime5=year0+year1*10+year2*100+year3*1000;调整

20、后能及时让datetime更新。10.将datetime的日期时间星期按照格式放到缓冲区上,格式为:YYYY-MM-DD weekHH:MM:函数源代码如下:void buffer_value() Format_Datetime(datetime0,buffer_time+6);/将年月日时分秒星期, Format_Datetime(datetime1,buffer_time+3);/放到对应缓冲区的位置上 Format_Datetime(datetime2,buffer_time+0);/以待显示 Format_Datetime(datetime3,buffer_date+8); Forma

21、t_Datetime(datetime4,buffer_date+5); Format_Datetime(datetime5%100,buffer_date+2); Format_Datetime(datetime5/100,buffer_date+0); buffer_date13=week1week(); buffer_date14=week2week(); buffer_date15=week3week();Lcd1602显示的是字符,所以用函数转换。Format_Datetime(数组1,数组2)功能:将数组1的数值转换为字符放到数组2。11.闪烁显示,在主函数显示配合延时清空,写入缓冲区的容,到达闪烁效果。具体哪位闪烁还是有um决定。void Flash(char n) switch(n) buffer_clr(0,4); /对应分低位置,清空 buffer_clr(0,3); buffer_clr(0,1); buffer_clr(0,0); buffer_clr(1,9); buffer_clr(1,8); buffer_clr(1,6); buffer_clr(1,5); buffer_clr(1,3); buffer_clr(1,2);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1