用数码管显示实时日历时钟的应用设计.docx
《用数码管显示实时日历时钟的应用设计.docx》由会员分享,可在线阅读,更多相关《用数码管显示实时日历时钟的应用设计.docx(27页珍藏版)》请在冰点文库上搜索。
用数码管显示实时日历时钟的应用设计
(用数码管显示实时日历时钟的应用设计)
一、设计内容及要求
利用DS1302实现年月日时分秒,并用数码管显示。
(用proteus实现)
二、设计原始资料
单片机原理及应用教程范立南2006年1月
单片机原理及应用教程刘瑞新2003年07月
三、设计完成后提交的文件和图表
1.计算说明书部分
1)方案论证报告打印版或手写版
2)程序流程图
3)具体程序
2.图纸部分:
具体电路原理图打印版
四、进程安排
教学内容学时地点
资料查阅与学习讨论1天单片机实验室
分散设计5天单片机实验室
编写报告3天单片机实验室
成果验收1天单片机实验室
五、主要参考资料
《电子设计自动化技术基础》马建国、孟宪元编清华大学出版2004年4月
《实用电子系统设计基础》姜威2008年1月
《单片机系统的PROTEUS设计与仿真》张靖武2007年4月
指导老师成绩
答辩小组成绩
总成绩
摘要
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
本课程设计是基于DS1302实现实时时钟日历的应用设计。
通过对AT89C51写入程序实现对DS1302读写,读写过正确的年月日时分秒,然后通过74LS164串行输出再输入到七段数码管显示出时间日期。
本设计利用外部中断实现分别显示时间和日期,当按键按下的时候数码管显示年月日,松开则显示时分秒。
具体的读写及显示程序将在下文中做详细介绍。
关键字:
DS1302AT89C5174LS164数码管
一、设计目的:
(1)掌握组合逻辑电路、时序逻辑电路及数字逻辑电路系统的设计、测试方法;
(2)进一步巩固所学的理论知识,提高运用所学知识分析和解决实际问题的能力;利用软件设计程序仿真运行
(3)学习使用仿真软件做线路图,提高电路布局﹑布线及检查和排除故障的能力
二、设计内容及要求
利用DS1302实现实时年月日时分秒,用数码管显示,并用proteus实现仿真效果。
三、数码管显示实时时钟日历的基本原理
DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。
数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。
时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为
8加最多可达248的数据。
DS1302的寄存器和控制命令
对DS1302的操作就是对其内部寄存器的操作,DS1302内部有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。
DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
我们现在已经知道了控制寄存器和RAM的逻辑地址,接着就需要知道如何通过外部接口来访问这些资源。
单片机是通过简单的同步串行通讯与DS1302通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧,这个帧的格式如表1所示,最高位BIT7固定为1,BIT6决定操作是针对RAM还是时钟寄存器,接着的5个BIT是RAM或时钟寄存器在DS1302的内部地址,最后一个BIT表示这次操作是读操作抑或是写操作。
物理上,DS1302的通讯接口由3个口线组成,即RST,SCLK,I/O。
其中RST从低电平变成高电平启动一次数据传输过程,SCLK是时钟线,I/O是数据线。
具体的读写时序参考图5,但是请注意,无论是哪种同步通讯类型的串行接口,都是对时钟信号敏感的,而且一般数据写入有效是在上升沿,读出有效是在下降沿(DS1302正是如此的,但是在芯片手册里没有明确说明),如果不是特别确定,则把程序设计成这样:
平时SCLK保持低电平,在时钟变动前设置数据,在时钟变动后读取数据,即数据操作总是在SCLK保持为低电平的时候,相邻的操作之间间隔有一个上升沿和一个下降沿。
四、元件明细表如下表1
表1
元件民称
数量
AT89C51
1
DS1302
1
74LS164
6
LED显示器
6
晶振
1
电容
2
开关
1
电源
若干
导线
若干
五、主要元件介绍
5.1、AT89C52芯片如图1
图1
AT89C52是51系列单片机的一个型号,有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时\计数器,2个全双工串行通信口,2个读写口线。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振;RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路;VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端;P0~P3口为可编程通用I/O脚,其功能用途由软件定义。
本设计中,31脚接高电平VCC,提供电源;D0~D7接74HC573译码器,XTAL1和XTAL2引脚外接晶振,晶振CYS的振荡频率为12MHz。
5.2、DS1302图2
图2
各引脚的功能为:
Vcc1:
主电源;Vcc2:
备份电源。
当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2SCLK:
串行时钟,输入,控制数据的输入与输出;
I/O:
三线接口时的双向数据线;
CE:
输入信号,在读、写数据期间,必须为高。
该引脚有两个功能:
第一,CE开始控制字访问移位寄存器的控制逻辑;其次,
CE提供结束单字节或多字节数据传输的方法。
DS1302有下列几组寄存器:
①DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器
(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如下表所示。
②DS1302有关RAM的地址
DS1302中附加31字节静态RAM的地址如下表所示。
③DS1302的工作模式寄存器
所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。
突发模式寄存器如下表所示。
5.3、74LS164
C、74LS164
图3
引脚功能:
CLOCK:
时钟输入端CLEAR:
同步清除输入端(低电平有效)A,B:
串行数据输入端QA-QH:
输出端
当清除端(CLEAR)为低电平时,输出端(QA-QH)均为低电平。
串行数据输入端(A,B)可控制数据。
当A、B任意一个为低电平,则禁止新数据输入,在时钟端(CLOCK)脉冲上升沿作用下Q0为低电平。
当A、B有一个为高电平,则另一个就允许输入数据,并在CLOCK上升沿作用下决定Q0的状态。
5.4、LED显示器
图3
八段LED数码管显示器由8个发光二极管组成,其中7个长条形的发光管排列成“日”字形,另一个发光管在数码管显示器的右下角作为显示小数点。
8个笔划段hgfedcba对应于一个字节(8位)的D7D6D5D4D3D2D1D0,因此用8位二进制码就能表示欲显示字符的字形代码。
六、流程图
七、程序设计
IOEQUP1.0;实时时钟数据线引脚
SCLKEQUP1.1;实时时钟时钟线引脚
RSTEQUP1.2;实时时钟复位线引脚
SECONDEQU40H
MINUTEEQU41H
HOUREQU42H
DAYEQU43H
MONTHEQU44H
WEEKEQU45H
YEAREQU46H
ORG0000H
JMPMAIN
ORG0003H
jmpINT_0
ORG0020H
MAIN:
CLRIT0
SETBEX0
SETBEA
LCALLGET;从DS1302读取时间
DISPALY:
MOVa,40H;显示秒
ANLa,#0FH;低位保留
lcallwww
lcalldelay
mova,40h
anla,#0f0h
swapa;高位低位互换
lCALLaaa
lcalldelay
MOVa,41H;显示分
ANLa,#0FH;低位保留
lcallwwwf
lcalldelay
mova,41h
anla,#0f0h
swapa;高位低位互换
lCALLaaaf
lcalldelay
MOVa,42H;显示时
ANLa,#0FH;低位保留
lcallwwws
lcalldelay
mova,42h
anla,#0f0h
swapa;高位低位互换
lCALLaaas
lcalldelay
ljmpmain
sjmp$
INT_0:
MOVa,43H;显示日
ANLa,#0FH;低位保留
lcallwwwr
mova,43h
anla,#0f0h
swapa;高位低位互换
lCALLaaar
lcalldelay
MOVa,44H;显示月
ANLa,#0FH;低位保留
lcallwwwy
lcalldelay
mova,44h
anla,#0f0h;高位低位互换
swapa
lCALLaaay
lcalldelay
MOVa,46H;显示年
ANLa,#0FH;低位保留
lcallwwwn
lcalldelay
mova,46h
anla,#0f0h
swapa;高位低位互换
lCALLaaan
lcalldelay
RETI
;把寄存器中的内容传给74ls164的子程序
www:
;给秒的低四位数码管赋值
mov49h,#8h
lcallL0
eee:
jbacc.7,rrr
clrp0.0
jmpttt
rrr:
setbp0.0
ttt:
clrp2.0
setbp2.0
rla
djnz49h,eee
ret
aaa:
;给秒的高四位数码管赋值
mov49h,#8h
lcallL0
sss:
jbacc.7,ddd
clrp0.1
jmpfff
ddd:
setbp0.1
fff:
clrp2.1
setbp2.1
rla
djnz49h,sss
ret
wwwf:
;给分的低四位数码管赋值
mov49h,#8h
lcallL0
eeef:
jbacc.7,rrrf
clrp0.2
jmptttf
rrrf:
setbp0.2
tttf:
clrp2.2
setbp2.2
rla
djnz49h,eeef
ret
aaaf:
;给分的高四位数码管赋值
mov49h,#8h
lcallL0
sssf:
jbacc.7,dddf
clrp0.3
jmpffff
dddf:
setbp0.3
ffff:
clrp2.3
setbp2.3
rla
djnz49h,sssf
ret
wwws:
;给时的低四位数码管赋值
mov49h,#8h
lcallL0
eees:
jbacc.7,rrrs
clrp0.4
jmpttts
rrrs:
setbp0.4
ttts:
clrp2.4
setbp2.4
rla
djnz49h,eees
ret
aaas:
;给时的高四位数码管赋值
mov49h,#8h
lcallL0
ssss:
jbacc.7,ddds
clrp0.5
jmpfffs
ddds:
setbp0.5
fffs:
clrp2.5
setbp2.5
rla
djnz49h,ssss
ret
wwwr:
;给日的低四位数码管赋值
mov49h,#8h
lcallL0
eeer:
jbacc.7,rrrr
clrp0.0
jmptttr
rrrr:
setbp0.0
tttr:
clrp2.0
setbp2.0
rla
djnz49h,eeer
ret
aaar:
;给日的高四位数码管赋值
mov49h,#8h
lcallL0
sssr:
jbacc.7,dddr
clrp0.1
jmpfffr
dddr:
setbp0.1
fffr:
clrp2.1
setbp2.1
rla
djnz49h,sssr
ret
wwwy:
;给月的低四位数码管赋值
mov49h,#8h
lcallL0
eeey:
jbacc.7,rrry
clrp0.2
jmpttty
rrry:
setbp0.2
ttty:
clrp2.2
setbp2.2
rla
djnz49h,eeey
ret
aaay:
;给月的高四位数码管赋值
mov49h,#8h
lcallL0
sssy:
jbacc.7,dddy
clrp0.3
jmpfffy
dddy:
setbp0.3
fffy:
clrp2.3
setbp2.3
rla
djnz49h,sssy
ret
wwwn:
;给年的低四位数码管赋值
mov49h,#8h
lcallL0
eeen:
jbacc.7,rrrn
clrp0.4
jmptttn
rrrn:
setbp0.4
tttn:
clrp2.4
setbp2.4
rla
djnz49h,eeen
ret
aaan:
;给年的高四位数码管赋值
mov49h,#8h
lcallL0
sssn:
jbacc.7,dddn
clrp0.5
jmpfffn
dddn:
setbp0.5
fffn:
clrp2.5
setbp2.5
rla
djnz49h,sssn
ret
delay:
;延时60ms
mov47h,#60
lop11:
mov48h,#0ffh
lop22:
nop
nop
djnz48h,lop22
djnz47h,lop11
ret
;判断时钟每位是几(1,2,3,4,5,6,7,8,,9,)
L0:
cjnea,#0h,L1
mova,#0c0h
ret
L1:
cjnea,#1h,L2
mova,#0f9h
ret
L2:
cjnea,#2h,L3
mova,#0a4h
ret
L3:
cjnea,#3h,L4
mova,#0b0h
ret
L4:
cjnea,#4h,L5
mova,#99h
ret
L5:
cjnea,#5h,L6
mova,#92h
ret
L6:
cjnea,#6h,L7
mova,#82h
ret
L7:
cjnea,#7h,L8
mova,#0f8h
ret
L8:
cjnea,#8h,L9
mova,#80h
ret
L9:
mova,#90h
RET
从DS1302读取时间
GET:
MOVR0,#40H
MOVR1,#81H;DS1302中读时间的首地址
MOVR7,#7
GETLOOP:
CLRRST
nop
CLRSCLK
nop
SETBRST
nop
MOVB,R1
LCALLWRITE;写命令字
LCALLREAD;读时间
MOV@R0,A
;将从DS1302中读取的时间从内存中保存
INCR0;修改地址指针
INCR1
INCR1
SETBSCLK
nop
CLRRST
nop
DJNZR7,GETLOOP
RET
WRITE:
MOV30H,#8;写入命令子程序DS1302
LOP1:
MOVA,B
RRCA
MOVB,A
MOVP1.0,C
SETBP1.1
CLRP1.1
DJNZ30H,LOP1
RET
READ:
;读出数据子程序DS1302
MOV30H,#8
LOP2:
MOVC,P1.0
RRCA
SETBP1.1
CLRP1.1
DJNZ30H,LOP2
RET
END
八、电路图及其显示结果
1、电路图的连接如图4
图4
2、时分秒的显示如图5
图5
3、年月日的显示
图5
3、年月日的显示图6
图6
九、心得体会
历经两个周的课程设计很快就结束了,不得不感叹时间的飞逝!
通过这次的课程设计我学到了很多东西:
1、当面对一个毫无头绪的题目时,我学会了如何去着手以及慢慢找到解决的方法!
2、通过这次设计我加强了自己的思考以及动手能力,最主要的就是对一个整天解体,对其每一模块思考理解,进而对整体理解!
3、这次设计也让我对课本的知识进行了巩固,尤其是一条条繁琐的指令,平时背背忘忘,这次的实践使其深深扎根于我脑海中。
同时,对keil以及proteus软件运用的更加熟练,相信在今后的实验设计中操作上不会出现问题了。
4、再次体会到细节问题有多么的重要,这次设计,很多次都是一个小小的错误使得整体运行错误。
而这些错误却是一些字母符号的输错、少输。
除了上述之外,我的耐心及毅力也得到了很大的锻炼,这不仅对我的学业,而且对我的整个人生也会产生巨大的作用。
十、参考文献
1、《电子设计自动化技术基础》马建国、孟宪元编清华大学出版200年4月
2、《实用电子系统设计基础》姜威2008年1月
3、《单片机系统的PROTEUS设计与仿真》张靖武2007年4月