《单片机课程设计(论文电子万年历.doc》由会员分享,可在线阅读,更多相关《单片机课程设计(论文电子万年历.doc(14页珍藏版)》请在三一办公上搜索。
1、摘要本设计是电子万年历。具备两个功能:能显示年月日时分秒及星期信息,并具有可调整日期和时间功能。我选用的是单片机(8051)来实现电子万年历的功能。该电子万年历能够成功实现时钟运行、调整、显示年月日时分秒信息。该电子万年历使用DS1302与单片机8051相连接,通过软件编程的方法实现了以24小时为一个周期同时显示小时,分钟和秒的要求。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用点阵字符型液晶显示模块动态扫描显示单片机内部处理的数据。同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。本电子万年历采用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完
2、成,这就降低了硬件电路的复杂性,也降低了成本。在该设计与制作中我选用了单片机8051,它是低功耗、高性能的CMOS型8位单片机。片内带有4KB的存储器,且允许在系统内改写或用编程器编程。另外, 8051片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。因此,采用8051原理制作的电子万年历,不仅仅在原理上能够成功实现计时等功能,也更经济,更适用,更符合我们实际生活的需要。目录1 设计的意义及主要功能31.1 意义31.2 主要功能32 方案论证32.1 显示模块方案选择和论证32.2 时钟芯片方案选择和论证32.3 最终电路设计方案33 硬件电路
3、的设计44 总结65 参考文献6附录71 设计的意义及主要功能1.1 意义电子万年历作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很常用的题目。因为它有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。所以,电子万年历无论作为竞赛题目还是毕业设计题目都是很有价值。1.2 主要功能设计一台电子万年历,主控芯片采用8051单片机,日历时钟芯片采用美国DALLAS公司推出的高性能、低功耗、带RAM的实时时钟DS1302,显示器采用点阵字符型液晶显示模块,分2行显示,第1
4、行显示日、月、年,第2行显示时、分、秒。2 方案论证2.1 显示模块方案选择和论证方案一:采用LED数码管动态扫描,LED数码管价格适中,对于显示数字合适,采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示。方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见2.2 时钟芯片方案选择和论证方案一:直接采用单片机定时计数器提供秒信号,使用程
5、序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大,所以不采用此方案。方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V5.5V。2.3 最终电路设计方案对此次作品的方案选定: 采用8051作为主控制系统; DS1302提供时钟;LCD液晶显示屏作为显示。(注:在这学期的专业课中主要学习了8051单片机,对8051单片机的功能有了较为全面的认识,故本次设计采用8051单片机)3 硬件电路的设计图1所示为电子万年
6、历的硬件电路图,主要包括8051单片机、日历时钟芯片DS1302、点阵字符型液晶显示模块。日历时钟芯片DS1302是一种串行接口的实时时钟,芯片内部具有可编程日历时钟和31个字节的静态RAM,日历时钟可自动进行闰年补偿,计时准确,接口简单,使用方便,工作电压范围宽(2.5V5.5V),功耗低,芯片自身还具有对备份电池进行涓流充电功能,可有效延长备份电池的寿命。 图1图2DS1302采用8脚DIP封装,其引脚排列如图2所示,各引脚功能如下。l Vcc1,Vcc2:电源输入。l GND:地。l X1,X2:外接32.768KHz石英晶振输入。l RST:复位/通信允许。l I/O:数据输入/输出端
7、。l SCLK:串行时钟输入。 8051单片机与DS1302之间采用3线串行通信方式。复位/通信允许信号RST接到单片机的P1.5引脚,RST=1允许通信,RST=0禁止通信;串行时钟信号SCLK接到单片机的P1.6引脚;数据输入/输出信号I/O接到单片机的P1.7引脚。8051作为主机通过控制RST、SCLK和I/O信号实现两芯片间的数据传送。DS1302芯片的X1和X2端外接32.768KHz的石英晶振,Vcc1和Vcc2是电源引脚,单电源供电时接Vcc1脚,双电源供电时主电源接Vcc2,备份电池接Vcc1,如果采用可充电镍镉电池,可启用内部涓流充电器在主电压正常时向电池充电,以延长电池使
8、用时间。备份电池也可用1F以上的超容量电容代替,需要注意备份电池电压应略低于主电源工作电压。数据传送是以8051单片机为主控芯片进行的,每次传送时由8051向DS1302写入一个命令字节开始。命令字节的格式如下:命令字节的最高位必须为1。RAM/CK位为DS1302片内RAM/时钟选择位,RAM/CK=1选择RAM操作,RAM/CK=0选择时钟操作。RD/W位为读写控制位,RD/W=1为读操作,表示DS1302接受完命令字节后,按指定的选择对象及寄存器(或RAM)地址,读取数据并通过I/O线传送给单片机8051.RD/W=0为写操作,表示DS1302接受完命令字节后,紧跟着再接收来自单片机80
9、51的数据字节,并写入到DS1302相应的寄存器或RAM单元中。A4A0为片内日历时钟寄存器或RAM的地址选择位。DS1302与8051之间通过I/O线进行同步串行数据传送,SCLK为串行通信时的位同步时钟,一个SCLK脉冲传送一位数据。每次数据传送时都以字节为单位,低位在前,高位在后,传送一个字节需要8个脉冲。数据传送可以单字节方式或多字节突发方式进行。数据单字节方式传送时序如图3所示,在RST=1期间,8051单片机先向DS1302发送一个命令字节,紧接发送一个字节的数据,DS1302在接收的命令字节后自动将数据写入指定的片内地址或从该地址读取数据。 图3数据多字节突发方式传送时序如图4所
10、示。RST=1期间,若8051单片机向DS1302发送的命令字节中A0A4全为1,则DS1302在接收到这个命令字节后可以一次进行8个字节日历时钟数据或是31个片内RAM单元数据的读写操作。 图4从以上时序可知,单字节方式传送一次数据需要16个SCLK脉冲,多字节传送方式传送一次数据在对日历时钟进行读写时需要72个SCLK脉冲,而在对片内RAM单元读写时则最多需要256个SCLK脉冲。单字节操作方式可保证数据传送时的安全性和可靠性,多字节操作方式则可提高数据传送速度,两种方式可视需要灵活选用。另外DS1302的外接晶振推荐采用32.768KHz,电容推荐6pF,由于晶振频率较低,也可以不接电容
11、,对计时精度影响不大。DS1302共有12个寄存器,其中7个寄存器与日历时钟有关,存放的数据为BCD码格式,日历、时钟寄存器地址及其内容如图5所示。秒寄存器的第7位为时钟暂停控制位,该位为1时暂停时钟振荡器,DS1302进入低功耗状态,该位为0时启动时钟。时寄存器的第7位为12或24小时方式选择,该位为1时选择12小时方式,该位为0时选择24小时方式。在12小时方式下,时寄存器的第5位为AM/PM选择,该位为1时选择PM,该位为0时选择AM,在24小时方式下,时寄存器的第5位为第2个小时位(2023)。 图5电子万年历的显示部分采用点阵字符型液晶显示模块,以直接方式与8051单片机进行接口。将
12、单片机的P2.7通过适当逻辑门电路组合接到液晶显示模块的E端,P0口通过外部锁存器得到的最低2位地址线A0和A1分别接到液晶显示模块的RW和RS端,从而可得该接口电路的命令写入地址为7FF0H,命令读取地址为7FF1H,数据操作地址为7FF2H,分别对这3个地址进行操作即可将DS1302中的日历时钟信息显示在LCD屏幕上。4 总结这次课程设计从开始到制作成功前后超过了一个星期。当电子万年历可以成功实现时,那种激动和喜悦只有自己可以体会。在整个设计过程中,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。较好的完成了设计,达到了预期的目的,完了最初的设想。对电路的设计、布局要先有一个好的
13、构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同学讨论,理清了思路,反而得心应手。在此次设计中,知道了做事要有一颗平常的心,不要想着走捷径,一步一个脚印。此次课程设计中学到了很多很多东西,这是最重要的。总之,此次课程设计使我的能力得到了全方位的提高,使得我的操作能力和专业技能都有了很大的提高。5 参考文献1.徐爱钧.单片机原理实用教程基于Proteus虚拟仿真.北京:电子工业出版社,2009年1月2.李全利.单片机原理及接口技术.北京:高等教育出版社,2009年1月.3. 魏立峰、王宝兴.单片机原理与应用技术.北京:北京大学出版社,200
14、6年3月.4. 王守中.51单片机开发入门与经典实例.北京:人民邮电出版社,20075. 张毅刚.MCS-51单片机原理及应用.高等教育出版社,20036. 李海涛.单片机应用开发典型模块.人民邮电出版社, 2007附录在8051单片机内RAM中开辟30H36H作为万年历的秒、分、时、日、月、周和年计时单位,并将初始时间设为23:59:55,初始日期设为07年12月31日第一周。采用8051单片机片内定时器T0来定时刷新LCD显示内容,T0定时初值设为50ms,以查询方式检查T0溢出标志,每当溢出次数达到20时,读取一次DS1302的日历时钟数据,同时对LCD显示信息进行更新。电子万年历的软件
15、程序:T_RST Bit P1.5 ;实时时钟复位线引脚T_CLK Bit P1.6 ;实时时钟时钟线引脚T_IO Bit P1.7 ;实时时钟数据线引脚SECOND EQU 30HMINUTE EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HWEEK EQU 35HYEARL EQU 36H;*/ ORG 0000HSTART: LJMP MAIN ORG 0060HMAIN: MOV SP,#60H ;修改堆栈;* MOV SECOND,#55H ;初始时间设为23:59:55 MOV MINUTE,#59H MOV HOUR,#23H MOV DAY
16、,#31H ;初始日期设为07年12月31日第一周 MOV MONTH,#12H MOV WEEK,#01H MOV YEARL,#07H LCALL SETDS1302 LCALL LCD_INIT ;调用液晶模块初始化子程序 MOV R3,#20 MOV TMOD,#01H MOV TH0,#3CH ;置定时器初值(定时50ms) MOV TL0,#0B0H SETB TR0 ;启动定时器0LP1: JBC TF0,LP2 ;查询计数溢出 SJMP LP1 ;未到50 ms继续计数LP2: MOV TH0,#3CH ;重新置定时器初值 MOV TL0,#0B0H MOV R2,#81H ;
17、从第1行第2位开始,设置DDRAM地址 LCALL WRTC MOV DPTR,#ZIFU1 ;指向显示字符代码首地址 MOV R4,#06H LCALL WP1 ;第1行字符代码写入DDRAM LCALL DISPYMD ;显示年月日 MOV R2,#0C1H ;设置第2行DDRAM地址 LCALL WRTC MOV DPTR,#ZIFU2 ;指向显示字符代码首地址 MOV R4,#06H LCALL WP1 ;第1行字符代码写入DDRAM LCALL DISPHMS ;显示时分秒 DJNZ R3,LP1 ;未到1s继续循环 LCALL GET1302 ;每到1s从DS1302读取一次时间
18、MOV R3,20 SJMP lp1ZIFU1: DB Date: ZIFU2: DB Time: ;*DISPHMS:MOV A,HOUR ;时分秒显示子程序 SWAP A ANL A,#03H ADD A,#30H MOV R2,A LCALL WRTD MOV A,HOUR ANL A,#0FH ADD A,#30H MOVR2,A LCALL WRTD MOV R2,#2DH LCALL WRTD MOV A,MINUTE ;显示分 SWAP A ANL A,#07H ADD A,#30H MOV R2,A LCALL WRTD MOV A,MINUTE ANL A,#0FH ADD
19、A,#30H MOV R2,A LCALL WRTD MOV R2,#2DH LCALL WRTD MOV A,SECOND ;显示秒 SWAP A ANL A,#07H ADD A,#30H MOV R2,A LCALL WRTD MOV A,SECOND ANL A,#0FH ADD A,#30H MOV R2,A LCALL WRTD RET;*DISPYMD:MOV A,YEARL ;年月日显示子程序 SWAP A ANL A,#03H ADD A,#30H MOV R2,A LCALL WRTD MOV A,YEARL ANL A,#0FH ADDA,#30H MOVR2,A LCA
20、LL WRTD MOV R2,#2DH LCALL WRTD MOV A,MONTH ;显示月 SWAP A ANL A,#07H ADD A,#30H MOV R2,A LCALLWRTD MOV A,MONTH ANL A,#0FH ADD A,#30H MOV R2,A LCALL WRTD MOV R2,#2DH LCALL WRTD MOV A,DAY ;显示日 SWAP A ANL A,#07H ADD A,#30H MOV R2,A LCALL WRTD MOV A,DAY ANL A,#0FH ADD A,#30H MOVR2,A LCALL WRTD RET ;*SETDS1
21、302: CLR T_RST;设置DS1302初始时间,并启动计时 NOP CLR T_CLK NOP SETB T_RST NOP MOV B,#8EH ;写控制命令字 LCALL INPUTBYTE MOV B,#00H ;写保护关闭 LCALL INPUTBYTE SETB T_CLK NOP CLR T_RST MOV R0,#SECOND ;内存中的时间首地址 MOV R1,#80H ;DS1302中的时间首地址 MOV R7,#7 ;字节数SETLOOP:CLR T_RST NOP CLR T_CLK NOP SETB T_RST NOP MOV B,R1 ;写命令字 LCALL
22、INPUTBYTE MOV A,R0 ;设置时间 MOV B,A LCALL INPUTBYTE INC R0 INC R1 INC R1 SETB T_CLK NOP CLR T_RST NOP DJNZ R7,SETLOOP CLR T_RST NOP CLR T_CLK NOP SETB T_RST NOP MOV B,#8EH LCALL INPUTBYTE MOV B,#80H ;开写保护 LCALL INPUTBYTE SETB T_CLK NOP CLR T_RST NOP RET;*GET1302: ;从DS1302读取时间 MOV R0,#SECOND MOV R1,#81H
23、 ;DS1302中读时间的首地址 MOV R7,#7GETLOOP:CLR T_RST NOP CLR T_CLK NOP SETB T_RST NOP MOV B,R1 LCALL INPUTBYTE ;写命令字 LCALL OUTPUTBYTE ;读时间 MOV R0,A ;将从DS1302中读取的时间从内存中保存 INC R0 ;修改地址指针 INC R1 INC R1 SETB T_CLK NOP CLR T_RST NOP DJNZ R7,GETLOOP RET;*INPUTBYTE:MOV R4,#8;向DS1302写一个字节INPUTLOOP:MOV A,B RRC A MOV
24、B,A MOV T_IO,C SETB T_CLK NOP CLR T_CLK DJNZ R4,INPUTLOOP RET;*OUTPUTBYTE:CLR A ;从DS1302读一个字节 CLR C MOV R4,#8OUTPUTLOOP:NOP MOV C,T_IO RRC A SETB T_CLK NOP CLR T_CLK DJNZ R4,OUTPUTLOOP RET;*LCD_INIT:LCALL TIM1 ;LCD初始化子程序 MOV R2,#38H ;功能设置命令,设定8位字长,2行,5*7点阵 LCALL WRTC ;写入 LCALL TIM3 ;延时100us MOV R2,#
25、38H LCALL WRTC ;写入 LCALL TIM3 ;延时100us MOV R2,#38H LCALL WRTC ;写入 LCALL TIM3 ;延时100us MOV R2,#01H ;清屏命令 LCALL WRTC ;写入 MOV R2,#06H ;输入方式命令 LCALL WRTC ;写入 MOV R2,#0EH ;开显示、光标不闪命令 LCALL WRTC ;写入 RET;*WAIT:MOV P2,#7FH ;忙标志判断子程序 MOV R0,#0F1H ;读忙标志地址 MOVX A,R0 JB ACC.7,WAIT RET;*WRTC:LCALL WAIT ;写指令代码子程序
26、 MOV A,R2 MOV R0,#0F0H ;写指令地址 MOVX R0,A RET;*WRTD:LCALL WAIT ;写数据子程序 MOV R0,#0F2H ;写数据地址 MOV A,R2 MOVX R0,A RET;*WP1: CLR A MOVC A,A+DPTR MOV R2,A LCALL WRTD ;写入1字节字模数据 INC DPTR DJNZ R4,WP1 RET;*TIM1:MOV R5,#03H ;延时15ms子程序TT1:LCALL TIM2 DJNZ R5,TT1 RET;*TIM2:MOV R4,#50 ;延时5ms子程序TT2:LCALL TIM3 DJNZ R4,TT2 RET;*TIM3:MOV R3,#50 ;延时100us子程序TT3:DJNZ R3,TT3 RETEND14