电子万年历.docx
《电子万年历.docx》由会员分享,可在线阅读,更多相关《电子万年历.docx(30页珍藏版)》请在冰点文库上搜索。
![电子万年历.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/70fbb3bd-1658-4ce8-aba4-3f49364f27f3/70fbb3bd-1658-4ce8-aba4-3f49364f27f31.gif)
电子万年历
浙江海洋学院
单片机课程设计报告
设计题目电子万年历
摘要
随着科技的发展,在市场上出现了各种电子产品,电子万年历的功能也越来越强大,也有很多不同类型的电路能够成不同种功能的电子万年历。
单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。
单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。
将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。
本设计就是应用单片机强大的控制功能制作而成的电子万年历,该电子万年历能
实时显示年、月、日、时、分、秒
本设计采用的是AT89S52单片机,该单片机采用的MCU51内核,因此具有很好的兼容性,内部带有8KB的ROM,能够存储大量的程序,最突出特点是具有ISP在烧写功能,使得烧写程序更加方便。
计时芯片采显示器件采用通用型1602液晶,可显示32个字符,如果使用数码管来做显示器件需消耗大量的系统资源,因此采用低功耗的1602液晶,该液晶显示方便,功能强大,完全能满足数字万年历的显示要求。
用DALLAS公司的涓细充电时钟芯片DS1302,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。
通过此次设计能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。
关键词:
单片机DS13021602液晶
目录
1引言………………………………………………………………………………1
2方案设计
2.1设计要求………………………………………………………………1
2.2系统基本方案选择………………………………………………………1
2.2.1单片机芯片的选择方案…………………………………………………1
2.2.2显示模块选择方案方案…………………………………………………1
2.2.3时钟芯片的选择方案……………………………………………………1
2.2.4电路设计最终方案决定…………………………………………………1
3系统硬件设计及实现
3.1主要单元电路的设计……………………………………………………2
3.2显示电路的设计…………………………………………………………3
3.3时钟电路的设计…………………………………………………………4
3.4时钟振荡电路的设计……………………………………………………5
3.5复位电路的设计…………………………………………………………5
4系统软件设计
4.1流程图设计…………………………………………………………………6
5Proteus软件仿真
5.1实验仿真……………………………………………………………………7
5.2结果讨论……………………………………………………………………8
6课程设计体会……………………………………………………………………8
7参考文献…………………………………………………………………………………7
8附录,源程序………………………………………………………………………7
1引言
随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。
为了在观测时间的同时,能够了解其它与人类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期和温度功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势。
伴随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。
由其是单片机技术的应用产品已经走进了千家万户。
电子万年历的出现给人们的生活带来的诸多方便,作为一种附加功能,现在越来越广泛的被应用于各种电子产品中,具有广阔的市场前景。
电子万年历作为电子类小产品不仅是市场上的宠儿,也是是单片机设计培训中一个很实用的题目。
本电子万年历的设计在硬件方面主要采用AT89S52片机作为主控核心,由DS1302时钟芯片提供时钟、1602LCM点阵液晶显示屏显示。
AT89S52片机功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。
此外,该电子万年历还具有时间校准等功能。
在软件方面,主要包括日历程序、时间调整程序,显示程序等。
所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。
2系统总体方案
2.1方案要求
用单片机(8052)来实现电子万年历的功能,共具备两个功
(1)显示年月日及分秒信息
(2)具有可调整日期和时间功能
(3)合理安排数码管位置,并显示结果
该电子万年历能够成功实现时钟运行,且精确度经调试一天的误差在2S内。
2.2系统基本方案选择
2.2.1单片机芯片的选择方案:
STC89C52,宏晶公司的52系列单片机,价格便宜,在国内使用者非常多。
支持串口下载,使用非常方便,且具有很大的价格优势。
缺点是仅支持串口下载,不支持在线下载,使用中会有些不方便。
由于本设计对控制芯片的要求不高,因此选用此方案
2.2.2显示模块选择方案:
LED数码管价格适中,对于数字显示效果较好,而且使用单片机的端口也较少;LCD1602液晶显示屏,显示功能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED数码管来说要昂贵些,但是基于本设计显示的东西较多,若采用LED数码管的话,所需数码管较多,而且不利于控制,因此选择LCD1602作为显示模块。
2.2.3时钟芯片的选择方案:
DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的应用,实时时钟有秒、分、时、星期、日、月和年,月小于31天时可以自动调整,并具有闰年补偿功能,而且在掉电时能够在外部纽扣电池的供电下继续工作。
单片机有定时器的功能,但时间误差较大,且需要编写时钟程序,因此采用DS1302作为时钟电路。
综上各方案所述,对此次作品的方案选定:
采用AT89S52作为主控制系统;DS1302提供时钟;;LCD1602液晶显示屏作为显示。
图2-1系统设计图
3硬件设计
3.1主要单元电路的设计
单片机中央处理系统的方案设计,选用AT89C52单片机作为中央处理器,如图3-1所示。
该单片机除了拥有MCS-51系列单片机的所有优点外,内部还具有8K的在系统可编程FLASH存储器,低功耗的空闲和掉电模式,极大的降低了电路的功耗,还包含了定时器、程序存储器、数据存储器等硬件,其硬件能符合整个控制系统的要求,不需要外接其他存储器芯片和定时器件,方便地构成一个最小系统。
整个系统结构紧凑,抗干扰能力强,性价比高。
单片机主控制模块的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。
单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出,第9引脚为复位输入端,接上电容,电阻及开关后够电复位电路,20引脚为接地端,40引脚为电源端。
图3-1AT89S52单片机
3.2显示电路的设计
1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
显示电路采用LCD1602液晶显示,如图3-2所示图中只画出了其相应的接口,3脚用于调节LCD1602的背光,4、5、6为LCD1602的控制口,用于控制其写入或是读出指令,7至14脚为LCD1602的数据口,将数传送到LCD1602中
图3-2LCD显示电路
LCD1602液晶显示屏
图3-3LCD1602液晶显示屏
(1)LCD1602的特性
+5V电压,对比度可调;内含复位电路;9/23提供各种控制命令,如:
清屏、字符闪烁、光标闪烁、显示移位等多种功能;有80字节显示数据存储器DDRAM;内建有160个5X7点阵的字型的字符发生器CGROM,8个可由用户自定义的5X7的字符发生器CGRAM;
(2)基本操作时序:
读状态:
输入:
RS=L,RW=H,E=H;输出:
DB0~DB7=状态字;
写指令:
输入:
RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码;输出:
无。
读数据:
输入:
RS=H,RW=H,E=H;输出:
DB0~DB7=数据;
写数据:
输入:
RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据;输出:
无。
3.3时钟电路模块的设计
时钟电路主要由时钟芯片DS1302、备用电池、晶振等几部分组成,如图3-3所示。
DS1302采用3线串行接口,占用引脚少,内部集成了可编程日历时钟,用户可以根据需要通过单片机的控制来自行设置,支持双电源供电,可以使用外部主电源和备用电源,备份电源能够使时钟芯片继续工作
图3-3DS1302时钟电路
DS1302时钟芯片:
图3-4DS1302芯片
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
工作电压与单片机的输入电压比较适合。
上面是它的一些基本的应用介绍。
图3-5是它的引脚介绍。
图3-5DS1302引脚
DS1302和单片机的连接很简单。
只需一根复位线,一根时钟线,一根数据线即可。
同时它本身还需要接一个32.768KHz的晶振来提供时钟源。
对于晶振的两端可以分别接一个6PF左右的电容以提高晶振的精确度。
同时可以在第8脚接上一个3.6V的可充电的电池。
当系统正常工作时可以对电池进行涓流充电。
当系统掉电时DS1302由这个电池提供的能量继续工作。
3.4时钟振荡电路的设计
图3-6所示,时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个30pF的瓷片电容和一个12MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处,使单片机工作于内部振荡模式。
此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,
其振荡频率主要由石英晶振的频率决定。
电路中两个电容C1、C2的作用使电路快速起振,提高电路的运行速度,对于AT89S52其工作频率为0至33MHz,在这个范围内单片机能够正常的工作。
图3-6时钟振荡电路
3.5复位电路的设计
复位电路由电阻和极性电容组成,如图3-7,通过高电平使单片机复位,在时钟电路开始工作后,当高电平的时间超过大约2us时,即可实现复位。
此复位电路同时具备了上电复位和手动复位的功能,上电复位发生在开机加电时,由系统自动完成,手动复位通过一个按键来实现,在程序运行时,若遇到死机,死循环或程序“跑飞”等情况,通过手动复位就可以实现重新启动的操作。
手动按钮复位需要人为在复位输入端RST上加入高电平。
一般采用的办法是在RST端和正电源Vcc之间接一个按钮和一个电阻,如图所示,当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端,由于人的动作再快也会使按钮保持接通达数十豪秒,所以,完全能够满足复位的时间要求。
上电复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间,由图可知充电时间为:
T=2.3RC=2.3*10*10-6*5.1*103=0.1173s,保证系统能够可靠地复位。
图3-7复位电路
4软件设计
程序流程框图:
Y
N
图4-1主程序流程图
5Proteus软件仿真
5.1实验仿真
依据各功能模块的功能要求和工作过程画出程序的流程图,然后根据流程图和系统的硬件连接写出详细的程序,接着对各个子程序进行编译,调试,运行,看看是否能达到其功能,然后再将整个程序糅合在一起进行整体软件调试。
实验仿真如图所示。
图5-1电子万年历仿真总电路
图5-2实验仿真结果
5.2结果讨论
本设计以AT89C52片机为系统的控制核心,采用proteus仿真软件进行测试。
Proteus是一款比较常用的单片机仿真软件,用proteus和keil配合进行仿真提高系统运行效率与稳定性。
由于采用了动态扫描的方式实现对LED电子显示屏的控制,使系统能够稳定、清晰地显示文字。
6课程设计体会
在这学期的单片机课程序设计中,我通过查找大量资料,请教老师,在各种其它能力上也都有了提高。
更重要的是,在课程序设计里,我学会了很多学习的方法。
而这是以后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
同时将知识融会贯通,提高自己了的能力,提高自己的学习意思。
我不会忘记这难忘的几个月的时间。
在我查找资料的日子里,面对无数书本的罗列,最难忘的是每次找到资料时的激动和兴奋;记忆最深的是每一步小小思路实现时那幸福的心情;这段旅程看似荆棘密布,实则蕴藏着无尽的宝藏。
我从资料的收集中,掌握了很多单片机及其接口应用的知识,让我对我所学过的知识有所巩固和提高,并且让我对当今单片机的最新发展技术有所了解。
在整个过程中,我学到了新知识,增长了见识。
在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。
7文献资料
[1]李凤霞.C语言程序设计教程(第二版):
北京理工大学出版社
[2]楼然苗,李光飞单片机课程设计指导:
北京航航天大学出版社
[3]张毅刚单片机原理及应用。
高等教育出版社
[4]张毅刚MCS-51单片机应用设计。
哈张尔滨工业大学出版社
[5]彭伟.单片机C语言程序设计实训100例.电子工业出版社
[6]赵亮侯国锐.单片机C语言编程与实例:
人民邮电出版社
8附录源程序
#ifndef__AT89X52_H__
#define__AT89X52_H__
sfrP0=0x80;
sfrSP=0x81;
sfrDPL=0x82;
sfrDPH=0x83;
sfrPCON=0x87;
sfrTCON=0x88;
sfrTMOD=0x89;
sfrTL0=0x8A;
sfrTL1=0x8B;
sfrTH0=0x8C;
sfrTH1=0x8D;
sfrP1=0x90;
sfrSCON=0x98;
sfrSBUF=0x99;
sfrP2=0xA0;
sfrIE=0xA8;
sfrP3=0xB0;
sfrIP=0xB8;
sfrT2CON=0xC8;
sfrT2MOD=0xC9;
sfrRCAP2L=0xCA;
sfrRCAP2H=0xCB;
sfrTL2=0xCC;
sfrTH2=0xCD;
sfrPSW=0xD0;
sfrACC=0xE0;
sfrB=0xF0;
sbitP0_0=0x80;
sbitP0_1=0x81;
sbitP0_2=0x82;
sbitP0_3=0x83;
sbitP0_4=0x84;
sbitP0_5=0x85;
sbitP0_6=0x86;
sbitP0_7=0x87;
#defineIDL_0x01
#defineSTOP_0x02
#definePD_0x02/*Alternatedefinition*/
#defineGF0_0x04
#defineGF1_0x08
#defineSMOD_0x80
sbitIT0=0x88;
sbitIE0=0x89;
sbitIT1=0x8A;
sbitIE1=0x8B;
sbitTR0=0x8C;
sbitTF0=0x8D;
sbitTR1=0x8E;
sbitTF1=0x8F;
#defineT0_M0_0x01
#defineT0_M1_0x02
#defineT0_CT_0x04
#defineT0_GATE_0x08
#defineT1_M0_0x10
#defineT1_M1_0x20
#defineT1_CT_0x40
#defineT1_GATE_0x80
#defineT1_MASK_0xF0
#defineT0_MASK_0x0F
sbitP1_0=0x90;
sbitP1_1=0x91;
sbitP1_2=0x92;
sbitP1_3=0x93;
sbitP1_4=0x94;
sbitP1_5=0x95;
sbitP1_6=0x96;
sbitP1_7=0x97;
sbitT2=0x90;/*ExternalinputtoTimer/Counter2,clockout*/
sbitT2EX=0x91;/*Timer/Counter2capture/reloadtrigger&dirctl*/
sbitRI=0x98;
sbitTI=0x99;
sbitRB8=0x9A;
sbitTB8=0x9B;
sbitREN=0x9C;
sbitSM2=0x9D;
sbitSM1=0x9E;
sbitSM0=0x9F;
sbitP2_0=0xA0;
sbitP2_1=0xA1;
sbitP2_2=0xA2;
sbitP2_3=0xA3;
sbitP2_4=0xA4;
sbitP2_5=0xA5;
sbitP2_6=0xA6;
sbitP2_7=0xA7;
sbitEX0=0xA8;/*1=EnableExternalinterrupt0*/
sbitET0=0xA9;/*1=EnableTimer0interrupt*/
sbitEX1=0xAA;/*1=EnableExternalinterrupt1*/
sbitET1=0xAB;/*1=EnableTimer1interrupt*/
sbitES=0xAC;/*1=EnableSerialportinterrupt*/
sbitET2=0xAD;/*1=EnableTimer2interrupt*/
sbitEA=0xAF;/*0=Disableallinterrupts*/
sbitP3_0=0xB0;
sbitP3_1=0xB1;
sbitP3_2=0xB2;
sbitP3_3=0xB3;
sbitP3_4=0xB4;
sbitP3_5=0xB5;
sbitP3_6=0xB6;
sbitP3_7=0xB7;
sbitRXD=0xB0;/*Serialdatainput*/
sbitTXD=0xB1;/*Serialdataoutput*/
sbitINT0=0xB2;/*Externalinterrupt0*/
sbitINT1=0xB3;/*Externalinterrupt1*/
sbitT0=0xB4;/*Timer0externalinput*/
sbitT1=0xB5;/*Timer1externalinput*/
sbitWR=0xB6;/*Externaldatamemorywritestrobe*/
sbitRD=0xB7;/*Externaldatamemoryreadstrobe*/
sbitPX0=0xB8;
sbitPT0=0xB9;
sbitPX1=0xBA;
sbitPT1=0xBB;
sbitPS=0xBC;
sbitPT2=0xBD;
sbitCP_RL2=0xC8;/*0=Reload,1=Captureselect*/
sbitC_T2=0xC9;/*0=Timer,1=Counter*/
sbitTR2=0xCA;/*0=Stoptimer,1=Starttimer*/
sbitEXEN2=0xCB;/*Timer2externalenable*/
sbitTCLK=0xCC;/*0=SerialclockusesTimer1overflow,1=Timer2*/
sbitRCLK=0xCD;/*0=SerialclockusesTimer1overflow,1=Timer2*/
sbitEXF2=0xCE;/*Timer2externalflag*/
sbitTF2=0xCF;/*Timer2overflowflag*/
#defineDCEN_0x01/*1=Timer2canbeconfiguredasup/downcounter*/
#defineT2OE_0x02/*Timer2outputenable*/
sbitP=0xD0;
sbitF1=0xD1;
sbitOV=0xD2;
sbitRS0=0xD3;
sbitRS1=0xD4;
sbitF0=0xD5;
sbitAC=0xD6;
sbitCY=0xD7;
#defineIE0_VECTOR0/*0x03ExternalInterrupt0*/
#defineTF0_VECTOR1/*0x0BTimer0*/
#defineIE1_VECTOR2/*0x13ExternalInterrupt1*/
#defineTF1_VECTOR3/*0x1BTimer1*/
#defineSIO_VECTOR4/*0x23Serialport*/
#defineTF2_VECTOR5/*0x