利用单片机及DS302制作电子时钟.docx
《利用单片机及DS302制作电子时钟.docx》由会员分享,可在线阅读,更多相关《利用单片机及DS302制作电子时钟.docx(30页珍藏版)》请在冰点文库上搜索。
利用单片机及DS302制作电子时钟
单片机原理及应用
——基于Proteus和KeilC
实习报告
课程名:
利用单片机及DS1302制作电子时钟
指导教师:
专业:
年级:
组员:
设计时间:
XXX大学XXX学院
摘要
为了进一步熟悉51单片机的编程以及学习电子时钟的相关设计方法,在老师的指导下我们进行了本次电子时钟的设计。
我们在实习期间基于51单片机——AT89C51和时钟芯片DS1302设计并实现了电子时钟显示。
在PCB板制作完成并且调试成功之际,为了进一步提高自己的动手能力和编程能力,对这次电子时钟的设计和制作的过程中遇到的问题及设计思路做一次总结。
本电子时钟是一种利用时钟芯片DS1302及51单片机来显示时、分、秒和年、月的装置。
默认显示为时间,由四个按键分别控制定时设置、时间调整、分钟调整、日期显示;设计电路工作电源为5V;由4位LED数码管显示时间,格式为时时分分,中间点每隔1S亮暗;有备用电池,掉电后再上电能正常显示时间。
电子时钟大体可以分为三大模块,数码管的显示模块、DS1302时钟芯片与单片机的时钟模块和按键与单片机的模块。
单片机在5V电压下,各个模块正常工作。
单片机从DS1302芯片中读出一组时间日期数据,同时单片机通过按键设置当前要求显示的信息给单片机。
单片机接收到各个数据时,把各个数据显示出来。
一、总体设计
此电子时钟利用AT89C51单片机和时钟芯片DS1302设计完成。
1.1设计目的
1、通过对电子时钟的设计,进一步熟练掌握单片机编程方法及思想。
2、通过对电子时钟的设计,掌握实时时钟芯片DS1302的使用方法。
3、通过对电子时钟的设计,进一步掌握独立式键盘的编程控制并认识独立式键盘在实际中的运用。
4、通过对电子时钟的设计,增强对单片机的兴趣及动手能力。
并在此过程中学会对程序的逐步调试。
1.2硬件功能描述
数字钟能够完成24小时制计时,计时初始化值为00:
00:
00,用户可以通过按键调整时钟的初值实现校时功能,并且可以通过按键设定一个24小时以内任意时刻的闹铃,用户可以手动选择闹铃的开或者关两种状态。
1.3设计方案选择
计时方案:
方案1:
采用实时时钟芯片
现在市场上有许多实时时钟集成电路,如:
DS1287、DS2887、ds1302等。
这些实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新每秒自动进行一次,不需要程序干预。
因此,在工业实时测控系统中多采用这这一类专用芯片来实现实时时钟功能。
方案2:
是用单片机内的可编程定时器。
利用单片机内部的定时计数器进行中断定时,配合软件延时实现时分秒的计时。
该方案节省硬件成本,但程序设计较复杂。
显示方案:
一个良好的显示模块对一个系统非常重要,所有操作结果和计时结果,都要通过显示模块来显示出来。
同时显示模块提供了良好的人机交互平台。
常用的显示模式有LED7段数码管显示、点阵显示和液晶显示。
液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点。
但由于液晶其成本偏高。
在使用时,不能有静电干扰,否则易烧坏液晶的显示芯片。
鉴于LED7段数码管成本低,也比较容易实现的特点,最终确定使用共阳极数码管来显示。
1.4设计任务及要求
任务:
设计一个可调时及日期显示的电子时钟
要求:
1、用DS1302来实现对时间的计算
2、用7段LED来显示时间
3、加独立式键盘来进行调时
二、电子时钟软件和硬件设计
2.1硬件电路设计
2.1.1工作原理
此电子时钟可显示的时间范围为:
2000年1月1日0点至2100年12月31日23时59分。
此时钟在正常计时模式下具有自动调整每月的天数的变化,并用内接电池对时间保持。
时间为24小时至。
接通电源对时间进行调整,按定时设置键确定被修改位的值。
用时钟芯片记忆当前时间并保持,待下次接通电源无须调整能正确显示当前时间。
定时设置:
菜单按键,松开按键时有效
此按键实现闹铃功能,设定一个时间,此时四位数码管第四位的小数点亮起,表示有闹铃设置;当闹铃是可按此键结束闹铃。
时、分调整:
加一键,松开按键有效
当定时设置键选中要修改的位时,如分(分闪烁时),按此键可以使分的值从当前值开始加一,加至60时变为00(59过后即显示00,不显示60);而时则在加至24时变为00(23过后即显示0,不显示24);日在加至32时变为00(即31过后即显示0,不显示32);月在加至13时变为00(即12过后即显示0,不显示13);年在至2100时变为2000(即2099过后即显示2000,不显示2100)
日期显示:
年、月显示键,松开按键有效
按下此键松开后,显示为日期,5秒后自动返回时间显示。
2.1.2单元模块电路
1独立按键模块
系统有四个独立按键,分别接至单片机P1.4、P1.5、P1.6、P1.7口。
2显示模块
本系统显示模块电路由四个PNP三极管和一个四位一体7段LED数码管组成。
PNP三极管用来驱动数码管。
3复位电路模块
复位电路主要的功能是使整个系统初始化,在每次上电时系统自动初始化。
使CPU及其他功能部件处于一个确定的初始状态,并从这个状态开始工作,单片机应用程序必须以此作为设计的前提。
4时钟芯片模块
DS1302时钟芯片是本系统实现高精度计时的关键。
利用DS1302时钟芯片独立于单片机来计时,在提高计时进度的同时也提高了整个系统的抗干扰能力。
DS1302通过SCLK、I/O、RES端口和单片机AT89C51进行通信。
SCLK接至单片机P1.1口,在读写操作时给DS1302提供相应的时钟脉冲;I/O接至P1.2用来传送所有的数据;RES接至单片机P1.3上用来控制单片机与时钟芯片间的数据传送的开始与结束。
DS1302的工作原理及使用方法见附录Ⅰ。
5主控模块
主控模块的核心组成部分是单片机AT89C51,承担着所有操作任务的调控与分派工作。
6闹钟模块
闹铃模块由蜂鸣器和蜂鸣器的驱动组成。
在有闹铃发生的时候,蜂鸣器的驱动电路驱动蜂鸣器发声,产生闹铃的效果。
2.1.3元器件清单
元件名称
规格型号
数量(个)
单片机
AT89S51
1
时钟芯片
DS1302
1
4位一体的共阳LED显示器
7SEG-MPX4-CA-BLUE
1
按键
BUTTON
3
电阻
2K
4
排阻
4.7K
1
三极管
PNP
4
电阻
10K
10
2.2软件设计
2.2.1程序设计流程
Y
N
NY
YNN
Y
N
三、电路调试
各程序模块具有一定的独立性,因此可以先调试模块,在模块功能都能实现的前提下,再调试总程序,这样能快捷地检查判断硬件或软件上的问题。
调试结果及解决办法如下:
1.测试DS读写模块时,从LED显示能正确写入与读取当前时间,但DS1302的工作情况不太理想,主要表现在实时时间稍微偏快。
DS1302时钟的产生基于外接的晶体振荡器,振荡器的频率为32768HZ,该晶振通过引脚X1、X2直接连接至DS1302,即DS1302是依靠外部晶振与其内部的电容配合来产生时钟脉冲,由于DS1302在芯片本身已经集成了5pF的电容。
所以,为了获得稳定的可靠的时钟,必须选用具有5pF负载电容的晶振。
然而,许多人在选用晶振时仅仅注意了晶振的额定频率值,而忽视了晶振的负载电容大小,甚至连许多经销商也不能提供所售晶振的负载电容,所以即使在使用中选用了符合32768Hz的晶振,但如果该晶振的负载电容与DS1302提供的5pF不一致时,就会影响晶振的起振或导致振荡频率的偏移。
2.测试显示模块时,数码显示管全亮显示“8.8.8.8.”而不是预设”的初值。
利用Proteus软件仿真,发现仿真显示正常,再检查硬件,发现段码位选线与P0口接线错误。
按原理图重新焊接后能正常显示。
3.测试蜂鸣模块时,没有时间显示一直保持蜂鸣,不能返回主程序。
重新检查程序再次赋值给DS1302和闹钟时实物正常工作,证明现有程序语法和逻辑上没有错误。
从赋值过的数字中找规律,发现当DS初值的“分”个位为9而闹钟的“分”为0时,蜂鸣出现错误。
查阅DS的显示有关资料,由于DS的数据是BCD码形式读取,因此“X9”的数据加1后为“*0”;但程序所用为十六进制,“X9”加1后为“*A”,所以当DS刚到达闹钟时间准备蜂鸣时,程序中用INC指令对“分”加1后只达到“*A”,与DS一分钟后读取到的“*0”一直不相等,程序无法向下执行,也就是无法同步显示当前时间以及关闭蜂鸣。
解决办法:
进入蜂鸣状态时,先对比是否是个位为9的数据,是则按照BCD码形式直接赋值为“*0”到暂存区,再加1;否则直接用INC指令加1。
不断读取DS“分”的数据与暂存区数据比较,相等则表示满一分钟,关闭蜂鸣。
修改程序后该模块运行正常。
4.测试调整模块,进入中断时,按键后有时出现显示错乱,按键失灵,出现连续加减的情况。
有了蜂鸣模块的前例,增加了数据个位为9时的处理程序;分析出现连续加减可能是因为消抖延时不够,造成程序误判断为按键连击,因此增大延时时间。
修改程序后该模块正常运作。
5.综合总程序测试,各部分功能运作正常,但是实际硬件与软件结合后没有达到达到任务要求,此次设计失败。
四、心得体会
五、参考文献
【1】51单片机应用从零开始杨欣编著清华大学出版社2008
【2】单片机原理及接口技术(第三版)李朝青编著
北京航空航天大学出版社2008
【3】51单片机C语言教程郭天祥编著电子工业出版社2009
附录Ⅰ:
DS1302时钟芯片的工作原理和使用方法
1、DS1302的基本组成和工作原理
DS1302的管脚排列及描述如下图及表所示:
2、DS1302内部寄存器
CH:
时钟停止位bit7=1,12小时模式
CH=0振荡器工作允许bit7=0,24小时模式
CH=1振荡器停止寄存器2的第5位:
AM/PM定义
WP:
写保护位AP=1下午模式
WP=0寄存器数据能够写入AP=0上午模式
WP=1寄存器数据不能写入DS:
二极管选择位
TCS:
涓流充电选择DS=01选择一个二极管
TCS=1010使能涓流充电DS=10选择两个二极管
TCS=其它禁止涓流充电寄存DS=00或11,即使TCS=1010,充电
器2的第7位12/24小时标志功能也被禁
3、DS1302使用说明及注意的问题
DS1302的控制字如表1所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6如果为0,则表示存取日历时钟数据;为1则表示存取RAM数据。
位5~1(A4~A0)指示操作单元的地址。
最低有效位(位0)如果为0,则表示要进行写操作;为1表示进行读操作。
控制字节总是从最低位开始输入/输出。
表1DS1302控制字
时钟暂停:
秒寄存器的位7定义位时钟暂停位。
当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。
当它为0时,时钟将开始启动。
AM-PM/12-24小时方式:
小时寄存器的位7定义为12或24小时方式选择位。
它为高电平时,选择12小时方式。
在此方式下,位5为第二个10小时位(20~23h)。
DS1302的晶振选用32768Hz,电容推荐值为6pF。
因为振荡频率较低,也可以不接电容,对计时精度影响不大。
附录Ⅱ:
程序清单
SecondEQU41H
MinuteEQU42H
HourEQU43H
DayEQU44H
MonthEQU45H
WeekEQU46H
YearLEQU47H
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVSP,#5FH
MOVR0,30H
MOVR2,#30H
MOVA,#00H
LP0:
MOV@R0,A
INCR0
DJNZR2,LP0
LCALLDISPLAY
MOV41H,#00H;启动时钟工作.秒分时日月星期年
MOV42H,#00H;分单元
MOV43H,#01H;时单元
MOV44H,#18H;日单元
MOV45H,#07H;月单元
MOV46H,#04H;星期单元
MOV47H,#0DH;年后两位单元
MOV52H,#00H
MOV53H,#00H
CLR30H
SETB31H
LCALLSet1302
LCALLDISPLAY
LP1:
LCALLGet1302
MOV40H,41H
LP11:
LCALLDISPLAY
LCALLGET1302
MOVA,41H
CJNEA,40H,LP2
LJMPLP21
LP2:
CPL30H
MOV40H,41H
LJMPLP11
LP21:
JB31H,LP22;31H=0,定时报警
LCALLDSBJ
LCALLDISPLAY
LP22:
LCALLKEYSCAN
MOVDPTR,#TAB
MOVA,30H
RLA
ADDA,30H
JMP@A+DPTR
TAB:
LJMPLP11;无按键
LJMPTSSZ;定时设置
LJMPSJY;时加1
LJMPFJY;分加1
LJMPRQXS;日期显示
TSSZ:
CPL31H
TSSZ0:
JBP1.4,TSSZ1
LCALLTSDISPLAY
SJMPTSSZ0
TSSZ1:
JNB31H,TSSZ00;31H=1,定时关闭;31H=0,定时设置
LCALLDISPLAY
LJMPLP11
TSSZ00:
MOV51,#20H
TSSZ10:
MOV50H,#00H
TSSZ11:
JBP1.5,TSSZ3;定时时设置
MOVA,53H
ADDA,#01H
DAA
CJNEA,#24H,TSSZ2
MOVA,#00H
TSSZ2:
MOV53H,A
TSS1:
LCALLTSDISPLAY
JNBP1.5,TSS1
TSSZ3:
LCALLTSDISPLAY;定时显示
JBP1.4,TSSZ11
JNBP1.4,$
MOV51H,#20H
TSSZF0:
MOV50H,#00H
TSSZF1:
JBP1.6,TSSZF3;定时分设置
MOVA,52H
ADDA,#01H
DAA
CJNEA,#60H,TSSZF2
MOVA,#00H
TSSZF2:
MOV52H,A
TSF1:
LCALLTSDISPLAY
JNBP1.6,TSF1
TSSZF3:
LCALLTSDISPLAY
JBP1.4,TSSZF1
JNBP1.4,$
LCALLTSDISPLAY
LJMPLP11
DSBJ:
MOVA,53H
CJNEA,43H,DSBJ1
MOVA,52H
CJNEA,42H,DSBJ1
MOV50H,#06H
DSBJ0:
CLRP1.3
LCALLDISPLAY
SETBP1.3
LCALLD2MS
DJNZ50H,DSBJ0
SETB31H
DSBJ1:
RET
SJY:
MOVA,43H;时加1处理
ADDA,#01H
DAA
CJNEA,#24H,SJY0
MOVA,#00H
SJY0:
MOV43H,A
LCALLSET1302
SJY1:
JBP1.5,SJY2
LCALLDISPLAY
SJMPSJY1
SJY2:
LJMPLP11
FJY:
MOVA,42H;分加1处理
ADDA,#01H
DAA
CJNEA,#60H,FJY0
MOVA,#00H
FJY0:
MOV42H,A
LCALLSET1302
FJY1:
JBP1.6,FJY2
LCALLDISPLAY
SJMPFJY1
FJY2:
LJMPLP11
RQXS:
LCALLRQDISPLAY
RQXS1:
JBP1.7,RQXS2
LCALLRQDISPLAY
SJMPRQXS1
RQXS2:
MOVR3,#00H
RQXS3:
LCALLRQDISPLAY
LCALLRQDISPLAY
DJNZR3,RQXS3
LCALLDISPLAY
LJMPLP11
KEYSCAN:
PUSHACC
MOV30H,#00H
ORLP1,#0F0H
MOVA,P1
SWAPA
ANLA,#0FH
JBACC.0,K1
MOV30H,#01H
SJMPKEYEND
K1:
JBACC.1,K2
MOV30H,#02H
SJMPKEYEND
K2:
JBACC.2,K3
MOV30H,#03H
SJMPKEYEND
K3:
JBACC.3,KEYEND
MOV30H,#04H
KEYEND:
POPACC
RET
KEYPLAY:
MOVR5,#04H
MOVR0,#42H;51H为秒,52H分,53H为时,54H为日,55H为月
MOVR3,#08H
DIS2:
MOVDPTR,#TABLE
MOVA,@R0
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
MOVA,R3
MOVP2,A
LCALLD2MS
MOVA,@R0
ANLA,#0F0H
SWAPA
MOVCA,@A+DPTR
MOVP0,A
MOVA,R3
RRA
MOVR3,A
MOVP2,A
INCR0
MOVA,R3
RRA
MOVR3,A
LCALLD2MS
DJNZR5,DIS2
CLRP2.0
RET
DISPLAY:
PUSHACC
PUSHPSW
MOVDPTR,#TABLE
MOVR1,#42H
MOVA,@R1
ANLA,#0FH
MOVCA,@A+DPTR
MOVC,31H;有定时设置则在分钟个位显示点
MOVACC.7,C
MOVP0,A
MOVP2,#0FEH;实物值
;MOVP2,#08H;仿真值
LCALLD2MS
MOVP2,#00H
MOVA,@R1
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FDH
;MOVP2,#04H
LCALLD2MS
MOVP2,#00H
MOVR1,#43H
MOVA,@R1
ANLA,#0FH
MOVCA,@A+DPTR
MOVC,30H
MOVACC.7,C
MOVP0,A
MOVP2,#0FBH;MOVP2,#02H
LCALLD2MS
MOVP2,#00H
MOVA,@R1
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0F7H;MOVP2,#01H
MOVP2,#00H
POPPSW
POPACC
RET
RQDISPLAY:
PUSHACC;日期显示
PUSHPSW
MOVDPTR,#TABLE
MOVR1,#44H
MOVA,@R1
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FEH;实物值
;MOVP2,#08H;仿真值
LCALLD2MS
MOVP2,#00H
MOVA,@R1
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FDH;MOVP2,#04H
LCALLD2MS
MOVP2,#00H
MOVR1,#45H
MOVA,@R1
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FBH;MOVP2,#02H
LCALLD2MS
MOVP2,#00H
MOVA,@R1
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0F7H;MOVP2,#01H
LCALLD2MS
MOVP2,#00H
POPPSW
POPACC
RET
TSDISPLAY:
PUSHACC;定时显示
PUSHPSW
MOVDPTR,#TABLE
MOVR1,#52H
MOVA,@R1
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FEH;实物值
;MOVP2,#08H;仿真值
LCALLD2MS
MOVP2,#00H
MOVA,@R1
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FDH;MOVP2,#04H
LCALLD2MS
MOVP2,#00H
MOVR1,#53H
MOVA,@R1
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FBH;MOVP2,#02H
LCALLD2MS
MOVP2,#00H
MOVA,@R1
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0F7H;MOVP2,#01H
LCALLD2MS
MOVP2,#00H
POPPSW
POPACC
RET
D2MS:
MOVR6,#02H
DL1:
MOVR5,#249
DL2:
NOP
NOP
DJNZR5,DL2
NOP
DJNZR6,DL1
RET
TABLE:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
;DS1302时间处理程序
;******************************/公司名称:
;模块名称:
DS1302.asm
;功能