《单片机设计报告万年历设计与实现.doc》由会员分享,可在线阅读,更多相关《单片机设计报告万年历设计与实现.doc(28页珍藏版)》请在三一办公上搜索。
1、 单片机设计报告万年历设计与实现 学校:西安电子科技大学 学院:计算机学院作者: 2011年11月20日 目录 目录第1章 概述1第2章 STC89C52单片机22.1 STC89C52简介22.2 STC89C52引脚及功能2第3章 LCD1602显示器 43.1 LCD1602显示器简介 43.2 LCD1602显示器的引脚及功能 4第4章 作品介绍 64.1 硬件电路说明64.2 软件设计及源码64.3 作品使用说明94.4 作品特色及可扩展性94.5 作品成本及性能9第5章 设计总结11第6章 附录12参考文献 25 第1章 概述 第1章 概述在日常生活中,我们对液晶显示器并不陌生。液
2、晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,LCD1602都有很大的作用。STC89S52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。51单片机以其体积小,功耗低,重量轻,功能强大等优点,在人们日常生活中随处可见,在当今这个电子时代,真是无处不有单片机啊。而lcd是一种智能仪器,可以显示数字,字母,甚至汉字
3、,是很多产品不可或缺的材料,其自带指令集,利用方便,功耗低。本作品采用STC89C52和LCD1602液晶显示器实现万年历时钟。主要工作及过程如下:1. 对设想进行电路实现,最终采用8个发光二极管分别指示时钟各位的调节.2. 软件程序设计,软件流程分析与绘制流程图,之后编写代码,并进行多次调试,计算并调整时间的精确度,最终实现如下:(1).万年历时钟正常工作时,8个发光二极管即为一个流水灯。(2).当按下调整时钟键(中断)时,8与发光管亮。(3).其余七个发光管分别对应年、月、日、星期、时、分、秒的设置指示。硬件电路焊接,采用两块板,将所有器件固定在一面,包括电池。电路采用四节干电池供电。25
4、 第2章 stc89c52单片机 第2章STC89C52单片机 2.1 STC89C52简介STC89S52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外 STC89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择
5、节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 8K 字节在系统可编程 Flash。 图2.1单片机总控制电路 2.2 STC89C52引脚及功能1.主电源引脚(2根)VCC(Pin40):电源输入,接5V电源。GND(Pin20):接地线。2外接晶振引脚(2根)XTAL1(Pin19):片内振荡电路的输入端。XTAL2(Pin20):片内振荡电路的输出端。3.控制引脚(4根)RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电
6、平将使单片机复 第2章 stc89c52单片机 ALE/PROG(Pin30):地址锁存允许信号。PSEN(Pin29):外部存储器读选通信号。EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。4.可编程输入/输出引脚(32根)STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。P0口(Pin39Pin32):8位双向I/O口线,名称为P0.0P0.7P1口(Pin1Pin8):8位准双向I/O口线,名称为P1.0P1.7 P2口(Pin21Pin28):8
7、位准双向I/O口线,名称为P2.0P2.7 P3口(Pin10Pin17):8位准双向I/O口线,名称为P3.0P3.7STC89C52主要功能如表二所示。表2.2.1 STC89C52主要功能主要功能特性兼容MCS51指令系统8K可反复擦写Flash ROM32个双向I/O口256x8bit内部RAM3个16位可编程定时/计数器中断时钟频率0-24MHz2个串行中断可编程UART串行通道2个外部中断源共6个中断源2个读写中断口线3级加密位低功耗空闲和掉电模式软件设置睡眠和唤醒功能 第3章 LCD1602显示器 第3章LCD1602显示器 3.1 LCD1602显示器简介在日常生活中,我们对液
8、晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单,在此不作介绍,本章重点介绍字符型液晶显示器的应用。在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。数字式接口液晶显示器都是数字式的,和单
9、片机系统的接口更加简单可靠,操作更加方便。体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。如图: 图3.1 LCD实物图 3.2 LCD1602显示器的引脚及功能1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表3.1所示:编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6
10、数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极 表3.1 引脚接口说明表第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
11、第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。 第4章 作品介绍 第4章 作品介绍 4.1 硬件电路说明本作品采用一个STC89C52单片机和一个LCD1602液晶显示器以及八个发光二极管,附加一些电阻电容器件,实现可调万年历时钟显示功能。并采用七个发光二极管分别对应年、月、日、星期、时、分、秒的设置指示,另一个发光二极管对应中断响应,即当调整时间键按下时,此发光管亮。电源由四个干电池供电,没有设置电源开关。当系统受到干扰出现错误时,采用手动复位(复位电路)的方式还原。电路板完全是手工焊接
12、而成。硬件焊接电路图见附件: 4.2 软件设计及源码软件流程图 main函数开始 Lcd1602初始化 定时器初始化 初始日期显示2011-9-10 sat 初始时间显示10:58:00 计数器count计数计数器计数是否够80次 否 是秒second加1 second计数是否够60次 否是 分minute加1 是minute计数是否够60次 否 hour计数是否够24次 否 是时hour加1day计数是否够29次或平年day计数是否够28是否为闰年非二月 否 是 day计数是否够31次或平年day计数是否够30是月month加1month是否够12 是 year3加1year3是否够10是y
13、ear2加1,year3=0 year2是否够10 是year1加1,year2=0year1是否够10是year0加1,year1=0 year0是否够10 是year0=year1=year2=year3=0源码清单本程序全部采用C语言编写,函数清单如下:check() dalay(unsigned char t) dateout() timeout() key(void)lcdinit()timerinit()timer0()writecom()writedata()详细源码见附件 4.3 作品使用说明打开电源,即显示初始化数据见附录:按键调节日期和时间(1).当按下设置键(即中断键)时
14、,灯8(从右到左排序)亮,并且计数停止。(2).当按下位选择键的次数分别为1、2、3、4、5、6、7次时,分加对应灯1、2、3、4、5、6、7亮。同时对应秒、分、时、星期、日、月、年的设置。 4.4 作品特色及可扩展性作品正常工作时,八个发光二极管为流水灯功能,增加美感本作品可进一步扩展一个计算器,用一个选择键使计算器和时钟可以切换使用。本作品可进一步扩展一个闹钟功能,定时到,则蜂鸣器响。可扩展一个秒表功能。可扩展一个温度计4.5 作品成本及性能本作品所用材料清单如下:序号器件数量1STC89C5212LCD160213电容34排阻9引脚25电阻10k16晶振17板子28电池49按键6 表4.
15、1材料清单作品性能(1).作品所用的器件数量少,板面干净,且稳定。(2).利用两块板子使电池与其他器件固定与板上,方便。(3).经多次调试程序,使时间的误差精确到了很小: 10秒/6.5小时=1/(3600*3600*6.5) =1.187*10-8 即精确到了ns级。 第5章 设计总结 第5章 设计总结这次单片机设计,我很用心的去完成,当做好的那一刻,心里有说不出的满足感。从这次课程设计中,我真正学到了很多有用的知识。我首先学习了单片机STC89C52和LCD的指令集,以及常用的编程实例;然后设计原理图;进行编程,调试;焊接硬件电路。本作品实为51单片机与lcd1602的应用,制作本作品的过
16、程中无疑会对51单片机的引脚及控制性能进一步熟悉,并对lcd1602的各控制引脚及相关指令熟练掌握。本作品具有一定的实用性,万年历时钟随处可见,其最难的部分是时间的精确度,本作品通过与现有时钟进行比较,精确度很高,可以满足日常应用。经过一段时间的设计,从一无所知到有所收获,内心感到欣慰,也感谢各位组员的辛勤劳动,感谢同学的帮助。 刚开始还真不知道怎么下手,找了一些资料但看不大懂,而且不知道怎样将实际电路与总原理图联系起来。我和我们组的同学一起讨论分析,仔细研究资料,终于搞清楚了。回过头来一想,其实设计这些电路也并不是很困难,而且还十分有意思。课程设计是一个学习新知识、巩固加深所学课本理论知识的
17、过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。它不仅加深了我对单片机相关设计的理解,还让我感受到了其中的乐趣。在这次设计中,我一点也不怕麻烦,就是希望能把这次课程设计做好。因此对我来说,这次课程设计是非常有意义的。 第6章 附录 第6章 附录1.程序详细清单#include#include#include/*使能位定义*/sbit rs=P30;sbit rw=P31;sbit en=P32;sbit TIMESET=P33;sbit SETEXIT=P34;sbit SETSELECT=P36;sbit SETCOUNT=P37;/*初始化定义及全局变量声明*/unsign
18、ed char idata table1= 2011-09-10 sat ;unsigned char idata table2= 00:00:00 ;unsigned char idata week=SatSunMonTueWesThuFri;unsigned char idata day=10;unsigned char month=9;unsigned char idata year=2011;unsigned char second=0;unsigned char minute=58;unsigned char hour=10;unsigned char weekct=0;unsign
19、ed char count=0;/计数变量unsigned char LIGHT=0xfe;/*函数声明*/void dalay(unsigned int t);void lcdinit();unsigned char check();void writecom(unsigned char t);void writedata(unsigned char t);void dateout();void timerinit();void timeout();unsigned char runnian(unsigned char idata year4);/*按键中断处理,即调时间和日期处理函数*/v
20、oid key(void) interrupt 2 unsigned char k=0; EA=0; /关中断 count=0; LIGHT=0x7f; P1=LIGHT; while(1) if(SETSELECT=0) dalay(5); k+; switch(k%8) case 0: LIGHT=0x7f; P1=LIGHT; break; case 1: LIGHT=0xfe; P1=LIGHT; if(SETCOUNT=0) second+; if(second=60) second=0; break; case 2: LIGHT=0xfd; P1=LIGHT; if(SETCOUN
21、T=0) minute+; if(minute=60) minute=0;break; case 3: LIGHT=0xfb; P1=LIGHT; if(SETCOUNT=0) hour+; if(hour=24) hour=0;break; case 4: LIGHT=0xf7; P1=LIGHT; if(SETCOUNT=0) weekct+=3; if(weekct18) weekct=0; break; case 5: LIGHT=0xef; P1=LIGHT; if(SETCOUNT=0) day+; if(month=1|month=3|month=5|month=7|month=
22、8|month=10|month=12) if(day=32) day=0; else if(month=4|month=6|month=9|month=11) if(day=31) day=0; else if(month=2)if(day=29) day=0; break; case 6: LIGHT=0xdf; P1=LIGHT; if(SETCOUNT=0) month+; if(month=13) month=0; break; case 7: LIGHT=0xbf; P1=LIGHT; if(SETCOUNT=0) year3+; if(year39) year3=0; year2
23、+; if(year29) year2=0; year1+; if(year19) year1=0; year0+; if(year09) year3=0; year2=0; year1=0; year0=0; break; default:k=0;break; dateout(); timeout(); if(SETEXIT=0) break; EA=1; /开中断 LIGHT=0xfe; P1=0xfe;/*溢出中断处理函数*/void timer0(void) interrupt 1 count+; if(count=80) count=0;second+; P1=LIGHT;if(LI
24、GHT=0xfe) dalay(500); LIGHT18) weekct=0; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) if(day=32) day=0; month+; else if(month=2|month=4|month=6|month=9|month=11) if(day=31) day=0; month+; if(month12) month=0;year3+; if(year39) year3=0; year2+; if(year29) year2=0; year1+; if(year19)
25、year1=0; year0+; if(year09) year3=0; year2=0; year1=0; year0=0; /dateout(); TH0=(65535-10000)/256; TL0=(65535-10000)%256; /*日期显示函数*/void dateout() unsigned char i; unsigned char weekc=weekct; for(i=1;i5;i+) table1i=yeari-1; table16=month/10+0x30;table17=month%10+0x30; table19=day/10+0x30;table110=da
26、y%10+0x30; for(i=12;i15;i+) table1i=weekweekc;weekc+; writecom(0x80);for(i=0;i16;i+) writedata(table1i);dalay(5); /*定时器初始化函数*/void timerinit() TMOD=0x01; TH0=(65535-10000)/256; TL0=(65535-10000)%256; EA=1; ET0=1; EX1=1; TR0=1;void timeout() unsigned char t; table22=hour/10+0x30;/ 第二行第一位显示时的十位 table2
27、3=hour%10+0x30;/ 第二位显示时的个位 table24=0x3a;/ 第三位显示: table25=minute/10+0x30; /分的十位 table26=minute%10+0x30; /分的个位 table27=0x3a; /: table28=second/10+0x30; /秒的十位 table29=second%10+0x30; /秒的个位 writecom(0xc0);for(t=0;t16;t+) writedata(table2t);dalay(5);/*延时函数*/void dalay(unsigned int t) unsigned int j; whil
28、e(-t) for(j=0;j120;j+); /*忙信号检查*/ unsigned char check() unsigned char x; rs=0; rw=1; en=1; dalay(2); x=P0; dalay(5); en=0; return x; /*命令写入函数*/void writecom(unsigned char t)/ while(check()&0x80=0x80); rs=0; rw=0; en=0; P0=t; dalay(2); en=1; dalay(2); en=0; dalay(2); P0=0xfe;/*数据写入函数*/void writedata(
29、unsigned char t) / while(check()&0x80=0x80);rs=1;rw=0;en=0; P0=t;dalay(2);en=1; dalay(2);en=0;P0=0xfe;/*LCD1602初始化函数*/void lcdinit() dalay(2);writecom(0x38);dalay(2);writecom(0x38);dalay(2);writecom(0x38);writecom(0x38);writecom(0x08);writecom(0x01);/清屏writecom(0x06); writecom(0x0c);/开显示屏/*主函数入口*/void main() lcdinit(); timerinit();while(1) dateout(); timeout();2.硬件电路图 参考资料 参考资料【1】.杨振江、冯军 单片机原理与实践指导 中国电力出版社【2】.lcd1602中文资料 百度文库【3】.stc89c52应用课程设计 百度文库【4】.弟子学习板C51编程学习视频教程 新浪网