单片机电子万年历(含程序)_第1页
单片机电子万年历(含程序)_第2页
单片机电子万年历(含程序)_第3页
单片机电子万年历(含程序)_第4页
单片机电子万年历(含程序)_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、changzhou institute of technology科 研 实 践项目名称: 电子万年历设计 二级学院: 电子信息与电气工程学院 专业: 电气工程及其自动化 班级: 10 电二 学生姓名: 祝学东 学号: 10020442指导教师: 庄志红 职称: 副教授 起止时间: 2013年12月9日2013年12月20日 摘 要本设计是电子万年历。具备三个功能:能显示:年、月、日、时、分、秒、星期,并具有可调整日期和时间功能。 该电子万年历使用12mhz晶振与单片机at89c52相连接,通过软件编程的方法实现了以24小时为一个周期,同时显示小时、分钟和秒的要求。利用单片机定时器及计数器产生

2、定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。电子万年历设计与制作可采用数字电路实现,也可以采用单片机来完成。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,这样一来就降低了硬件电路的复杂性,从而使得其成本降低,更适合我们大学生自主研发。at89c52是一个低电压,高性能cmos 8位单片机,片内含8k bytes的可反复擦写的

3、flash只读程序存储器和256 bytes的随机存取数据存储器(ram),器件采用atmel公司的高密度、非易失性存储技术生产,兼容标准mcs-51指令系统,片内置通用8位中央处理器和flash存储单元,at89c52单片机在电子行业中有着广泛的应用。关键词:单片机 数字显示 动态扫描 时间日期可调 目 录第一章 设计论证及要求11.1设计应用意义11.2设计方案论证11.2.1 单片机芯片选择11.2.2显示模块选择11.2.3时钟芯片选择21.3设计流程2第二章 系统硬件电路设计32.1 cpu时钟32.2 主控芯片at89c52模块32.3 显示控制电路的设计及原理42.4 按键电路设

4、计6第三章 系统软件设计73.1 软件主流程73.2初始化程序及宏定义93.3主程序103.4显示子程序123.5 按键子程序153.6 延时子程序16第四章 系统调试与分析17第五章 设计总结20第六章 参考文献21附一 元件清单22附二 仿真原理图23附三 程序清单24附四 实物图35iii科研实践说明书第一章 设计论证及要求1.1设计应用意义 二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。电子万年历的开发与研究在信息化时代的今天亦是当务之急,因为它应用在学校、机关、企业、部队等单位礼堂、训练场地、教学室、公共场地等场合,可以说遍及人们生活的每一

5、个角落。所以说单片机的开发是国家之所需,社会之所需,人民之所需。 由于社会对信息交换不断提高的要求及高新技术的逐步发展,促使电子万年历发展并且投入市场得到广泛应用。1.2设计方案论证1.2.1 单片机芯片选择方案一: 采用89c51芯片作为硬件核心,采用flash rom,内部具有4kb rom 存储空间,能于3v的超低压工作,而且与mcs-51系列单片机完全兼容,但是运用于电路设计中时由于不具备isp在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案二: 采用at89c52,片内rom全都采用flash ro

6、m;能以3v的超底压工作;同时也与mcs-51系列单片机完全该芯片内部存储器为8kb rom 存储空间,同样具有89c51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。但由于课程学习是主要以at89c51为主,因此选择at89c52。 1.2.2 显示模块选择方案一:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示.方案二:采用led数码管动态扫描,led数码管价格适中,对于显示数字

7、最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。所以采用了led数码管作为显示。1.2.3 时钟芯片选择方案一:采用ds1302时钟芯片实现时钟,ds1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的ram做为数据暂存区,工作电压2.5v5.5v范围内,2.5v时耗电小于300na。此方案虽然时间精度高,但电路复杂,设计成本高,所以不采用。方案二:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案减少芯片的使用,节约成本。本次设计采用单片机提供秒信号,用定时器t0的模式二(8

8、位自动重装计数初值的计数值)。1.3设计流程熟悉硬件 了解各引脚功能分块设计各部分电路将分块的电路组合认真学习单片机汇编语言完成整体电路图确定变成结构和思路综合各程序完成整体程序编辑各个程序模块用proteus画出电路图调试程序,进行修改对仿真问题进行改正画出仿真图进行仿真准备器件、搭接电路仿真成功软硬件结合,完成任务书要求验证硬件电路成功进行扩展 第二章 系统硬件电路设计2.1 单片机时钟信号单片机由外部电路提供时钟信号。本实验使用11.0592mhz的晶振、30pf的电容组成单片机的时钟电路。如图2-1所示:图2-1 时钟电路2.2 主控芯片at89c52模块 at89c52是一个低电压,

9、高性能cmos 8位单片机,片内含8k bytes的可反复擦写的flash只读程序存储器和256 bytes的随机存取数据存储器(ram),器件采用atmel公司的高密度、非易失性存储技术生产,兼容标准mcs51指令系统,片内置通用8位中央处理器和flash存储单元,功能强大的at89c52单片机可为您提供许多较复杂系统控制应用场合。图2-2 at89c52管脚图at89c52有40个引脚,32个外部双向输入/输出(i/o)端口,同时内含2个外中断口。3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,at89c52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和fl

10、ash存储器结合在一起,特别是可反复擦写的flash存储器可有效地降低开发成本。2.3 显示电路的设计及原理 就时钟而言,通常可采用液晶显示或数码管显示。由于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性相对较差;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般多采用并行接口,对微处理器的接口要求较高,占用资源多。另外,89c52本身无专门的液晶驱动接口,因此,本设计采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合。初始化时,由软件编写的指令就集中在显示功能的设置上。数码管引脚如图2-3所示。图2-3 数码管引脚定

11、义本设计采用动态扫描法,单片机p1.7控制第一只数码管,p1.6控制第二位,p1.5控制第三位,p1.4控制第四位,p1.3控制第五位,p1.2控制第六位, p0口控制八位数据,轮流选题六只数码管,先开通一只数码管,其余关闭,让p0显示数据,延秒一定时间后关闭数码管。设计如图2-4所示。图2-4 显示电路设计实物选用六位八段数码管lg3661ah,其管脚排列如图2-5所示。图2-5 6位共阴数码管管脚图2.4 按键电路设计由于我设计的是电子万年历,需要实现多种功能的显示,并要能够切换显示和调节年月日,因此,在设计过程中按键的设计就显得尤为重要。在设计过程中,按键选择p2口的前4位,一共采用了4

12、个按键,尽量在小的空间里实现最多的功能。其中mode键是年月日与时间显示切换键,按下一次就能够更换一次显示位。在调整显示环境下年/时、月/分、日/秒键是显示调整位的的加1键,每按一次显示数字加1。设计如图2-5所示。图2-5 按键电路其中p2.0为年/时键,p2.1为月/分键,p2.2为日/秒/星期键,p2.3为模式键。第三章 软件设计3.1软件主流程开始时=24?秒=0;分+1月份=13?秒+1分=0;时+1分=60?秒=60?时=0;日+1日本月天数?日=1,;月份+1有t0中断?年=9999?月份=1;年+1年=00根据平润年及大小月查出本月天数yyyyyynnnnnnn初始化启动定时器

13、t0,设置工作模式,装入计数初值允许t0中断调键盘扫描n调用显示子程序返回调用延时子程序返回3.2初始化程序及宏定义#include#include#define uchar unsigned char#define uint unsigned intsbit p1_2=p12;sbit p1_3=p13;sbit p1_4=p14;sbit p1_5=p15;sbit p1_6=p16;sbit p1_7=p17;sbit key_y_h=p20;sbit key_m_m=p21;sbit key_d_s=p22;sbit key_set=p23;uint tcnt;uint yearh=2

14、0;uchar flag,flag1,sec;uint week=1;uint min=30;uint hour=15;uint day=16;uint month=12; unint flag2=0;uint year=13;uchar sec_l,sec_h,min_l,min_h,hour_l,hour_h;uchar day_l,day_h,month_l,month_h,year_l,year_h;uchar code tab= 0x3f,/*0*/ 0x06,/*1*/ 0x5b,/*2*/ 0x4f,/*3*/ 0x66,/*4*/ 0x6d,/*5*/ 0x7d,/*6*/ 0

15、x07,/*7*/ 0x7f,/*8*/ 0x6f,/*9*/ ;3.3主程序void main() tmod=0x02; /设置模式为定时器t0的模式2 (8位自动重装计数初值的计数值) th0=0x06; /设置计数器初值,靠th0存储重装的计数值x0=256-250=6 tl0=0x06; tr0=1; /启动t0 et0=1; /开启定时器t0中断允许 ea=1; while(1) keyscan(); void t0(void)interrupt 1 using 0 /t0的中断程序 tcnt+; if(tcnt=4000)/定时器的定时计数,4000次250us为1秒 tcnt=0

16、; sec+; if(sec=60) sec=0; min+; if(min=60) min=0; hour+; if(hour=24) hour=0; day+;week+; if(month=2&(year=0&yearh%4=0)|(year!=0&year%4=0)&day=30)day=1; else if(month=2&day=29)day=1; else if(month=4|month=6|month=9|month=11)&day=31)day=1; else if(day=32)day=1; if(day=1) month+; if(month=13) month=1;

17、year+; if(year=100) year=0; yearh+; if(yearh=100) yearh=20; 3.4显示子程序void disp() sec_h=sec/10; /时分秒的数码管显示,年月日类似 sec_l=sec%10; min_h=min/10; min_l=min%10; hour_h=hour/10; hour_l=hour%10; day_h=day/10; day_l=day%10; month_h=month/10; month_l=month%10; year_h=year/10; year_l=year%10;p1_2=0; if(flag2=1)

18、p0=tabday_l; else if(flag2=0) p0=tabsec_l; else if(flag2=2) p0=tabweek; delay(1); p1_2=1; p1_3=0; if(flag2=1) p0=tabday_h; if(flag2=0) p0=tabsec_h; else p0=tab0; delay(1); p1_3=1; p1_4=0; if(flag2=1) p0=tabmonth_l|0x80; else if(flag2=0) p0=tabmin_l|0x80; else if(flag2=2) p0=tab0; delay(1); p1_4=1; p

19、1_5=0; if(flag2=1) p0=tabmonth_h; else if(flag2=0) p0=tabmin_h; else if(flag2=2) p0=tab0; delay(1); p1_5=1; p1_6=0; if(flag2=1) p0=tabyear_l|0x80; else if(flag2=0) p0=tabhour_l|0x80; else if(flag2=2) p0=tab0; delay(1); p1_6=1; p1_7=0; if(flag2=1) p0=tabyear_h; else if(flag2=0) p0=tabhour_h; else if(

20、flag2=2) p0=tab0; delay(1); p1_7=1;3.5 按键子程序void keyscan() disp(); while(!key_set) /日期/时间键 disp( ); if(key_set) flag2=!flag2; while(!key_y_h) /年/时键 disp( ); if(key_y_h) if(flag2=1) /对年份进行调节 year_l+; if(year_l=10) year_l=0; year_h+; year=year_l+year_h*10; else if(flag2=0) /对小时进行调节 hour_l+; if(hour_l=

21、10) hour_l=0; hour_h+; if(hour_l=4&hour_h=2) hour_l=0; hour_h=0; hour=hour_h*10+hour_l; 月/分、日/秒键的编程与年/时类似 ,最后的日秒键在模式2下可以对星期进行调节。3.6延时子程序void delay(uint ms) uchar i; while(ms-) for(i=0;i123;i+);第四章 系统调试与分析软、硬件调试软件调试用proteus进行仿真,电子成年历是多功能的数字型,可以看当前日期,时间。电子成年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。调试

22、发现年时键不能进行调节,其他键位能够正常工作,于是对按键子程序的三个调节键进行仔细对比,发现年时调节程序的括号没有一一对应,经过多次的模块子程序的修改,一步一步的完成,仿真能完美工作。仿真结果如图4-1、4-2和4-3所示。图4-1 时间显示图4-2 日期显示图4-3 星期显示硬件调试焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺被带有包皮的导线,则会对电路造成短路现象。调试时发现按钮按下时间没有调节,显示数字无变化,仔细检查发现,单片机p2口为自下至上排列,按键应选择下四位,改变插针位置,再次按下

23、按钮,能够对显示数字进行调节。将时间调至23:59:59,一秒后时间显示为00:00:00,日期增加一天。第五章 设计总结这次科研实践意义非同一般,把我从单深入的理论编程到硬件软件综合实现一个使用的电路。通过这次科研实践,知道了单片机在实际应用中占据很重要的作用,也了解单片机本身的功能,用编程控制,还有单片机的一些扩展功能,我更深入地了解到单片机的使用原理。设计中,我看到同组的同学都很努力,很认真,我也不敢懈怠。虽说时间有点仓促,但老师和同学们夜以继日在解决问题,我做电子万年历的设计中也遇到些许问题,但通过他人的指点,并查阅很多有价值的书籍,我从中认识了不少。也增强了自己发现问题解决问题的能力

24、。还有在编程的时候要仔细,要实现一个完整的功能就要考虑全面,在测试程序的时候要善于发现错误,而且可能是一些小问题,这是很常见的。设计完满结束了,经过自己的努力和同学的帮忙终于有了成果,特别离不开指导申明老师的悉心教导,我受益匪浅,相信他的工作作风和知识筑成都是我们学习榜样,给我很大的启迪。感谢老师不畏辛劳,热心精心的指导。在这里向他说声谢谢,您辛苦了。第六章 参考文献 1 张齐.朱宁西 单片机应用系统设计技术基于c51的proteus仿真(第二版). m 北京.电子工业出版社.20112 张齐 单片机应用系统设计技术基于c51的proteus仿真实验与解题指导. m 北京.电子工业出版社.20

25、113 张鑫. 单片微机原理与应用.m 北京.电子工业出版社. 20084 楼然苗.李光飞. 单片机课程设计指导. m北京.航空航天大学出版社. 20075 长洪润.刘秀英. 单片机应用设计200例(上、下). m 北京.航空航天大学出版社.20066 张毅刚. 新编mcs51单片机应用设计(第3版).m哈尔滨工业大学出版社.20087 马静.单片机原理与应用. m 实践教学指导书中国计量出版社. 2003附一 元件清单:序号名称型号、参数备注价格数量1cpustc89c52dip40封装4.412管座dip-400.313晶振11.0592mhz492型0.614整流桥2w102a圆桥0.5

26、15稳压iclm7805to-2200.816原片电容30pf0.0527电解电容1000uf/16v0.318电解电容470uf/16v0.219电解电容10uf/16v0.1110独石电容0.47uf0.2211按钮6mm*6mm0.1112电阻10k/0.25w金属膜1/4w0.01113排阻a10-103直插0.25114单排排阵直插1*400.3115自锁开关0.3716接线端子0.04117数码管lg3661ah14管脚8118按钮0.1419杜邦线20根31成本总价20.90元附二 仿真原理图:附三 程序清单:#include#include#define uchar unsig

27、ned char#define uint unsigned intsbit p1_2=p12;sbit p1_3=p13;sbit p1_4=p14;sbit p1_5=p15;sbit p1_6=p16;sbit p1_7=p17;sbit key_y_h=p20;sbit key_m_m=p21;sbit key_d_s=p22;sbit key_set=p23;uint tcnt;uint yearh=20;uchar flag,flag1,sec;uint week=1;uint min=30;uint hour=15;uint day=16;uint month=12;uint ye

28、ar=13;uchar sec_l,sec_h,min_l,min_h,hour_l,hour_h;uchar day_l,day_h,month_l,month_h,year_l,year_h;uchar code tab= 0x3f,/*0*/ 0x06,/*1*/ 0x5b,/*2*/ 0x4f,/*3*/ 0x66,/*4*/ 0x6d,/*5*/ 0x7d,/*6*/ 0x07,/*7*/ 0x7f,/*8*/ 0x6f,/*9*/ ;uint flag2=0;void keyscan();void disp();void delay(uint ms);void delay(uint

29、 ms) uchar i; while(ms-) for(i=0;i123;i+);void main() tmod=0x02; /设置模式为定时器t0的模式2 (8位自动重装计数初值的计数值) th0=0x06; /设置计数器初值,靠th0存储重装的计数值x0=256-250=6 tl0=0x06; tr0=1; /启动t0 et0=1; /开启定时器t0中断允许 ea=1; while(1) keyscan(); void t0(void)interrupt 1 using 0 /t0的中断程序 tcnt+; if(tcnt=4000)/定时器的定时计数,4000次250us为1秒 tcn

30、t=0; sec+; if(sec=60) sec=0; min+; if(min=60) min=0; hour+; if(hour=24) hour=0; day+;week+; if(month=2&(year=0&yearh%4=0)|(year!=0&year%4=0)&day=30)day=1; else if(month=2&day=29)day=1; else if(month=4|month=6|month=9|month=11)&day=31)day=1; else if(day=32)day=1; if(day=1) month+; if(month=13) month=

31、1; year+; if(year=100) year=0; yearh+; if(yearh=100) yearh=20; void disp() sec_h=sec/10; sec_l=sec%10; min_h=min/10; min_l=min%10; hour_h=hour/10; hour_l=hour%10; day_h=day/10; day_l=day%10; month_h=month/10; month_l=month%10; year_h=year/10; year_l=year%10; p1_2=0; if(flag2=1) p0=tabday_l; else if(

32、flag2=0) p0=tabsec_l; else if(flag2=2) p0=tabweek; delay(1); p1_2=1; p1_3=0; if(flag2=1) p0=tabday_h; if(flag2=0) p0=tabsec_h; if(flag2=2) p0=tab0; delay(1); p1_3=1; p1_4=0; if(flag2=1) p0=tabmonth_l|0x80; else if(flag2=0) p0=tabmin_l|0x80; else if(flag2=2) p0=tab0; delay(1); p1_4=1; p1_5=0; if(flag

33、2=1) p0=tabmonth_h; else if(flag2=0) p0=tabmin_h; else if(flag2=2) p0=tab0; delay(1); p1_5=1; p1_6=0; if(flag2=1) p0=tabyear_l|0x80; else if(flag2=0) p0=tabhour_l|0x80; else if(flag2=2) p0=tab0; delay(1); p1_6=1; p1_7=0; if(flag2=1) p0=tabyear_h; else if(flag2=0) p0=tabhour_h; else if(flag2=2) p0=tab0; delay(1); p1_7=1;void keyscan() disp(); while(!key_set) /日期/时间键 disp( ); if(key_set) flag2+;if(flag2=3)flag2=0; while(!key_y_h) /年/时键 disp( ); if(key_y_h) if(flag2=1) year_l+; if(year_l=10) year_l=0; year_h+; year=year_l+year_h*10; else if(flag2=0) hour_l+; if(hour_l=10) hour_l=0; ho

温馨提示

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

评论

0/150

提交评论