基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx
《基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
因此,电子万年历的出现带来了钟表计时业界跨跃性的进步……
我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。
商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。
除了采用集成化的时钟芯片外,还有采用MCU的方案,利用STC89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:
硬件电路简单,安装方便易于实现,软件设计独特,可靠。
在21世纪的今天,单片机仍然有着它不可替代的地位和独特的作用在学完单片机后,为了进一步学习51单片机的控制和编程,我们利用51单片机自己设计并制作数字钟。
1.3参考资料
【1】8051系列单片机C程序设计完全手册求是科技编著
人民邮电出版社2006
【2】51单片机应用从零开始杨欣编著清华大学出版社2008
【3】单片机原理及接口技术(第三版)李朝青编著北京航空航天大学出版社2008
【4】51单片机C语言教程郭天祥编著电子工业出版社2009
二、总体设计
此数字钟利用单片机STC89C52和时钟芯片DS1302设计完成。
2.1设计与运行环境
数字钟的程序设计和调试均在KeiluVision2环境下完成的。
设计并完成的程序下载至STC89C52单片机后,即可初始化时钟芯片DS1302从而开始计时,系统开始正常运行。
2.2硬件功能描述
数字钟能够完成24小时制计时,计时初始化值为00:
00:
00,用户可以通过按键调整时钟的初值实现校时功能,并且可以通过按键设定一个24小时以内任意时刻的闹铃,用户可以手动选择闹铃的开或者关两种状态。
三、数字钟软件和硬件设计
3.1硬件电路设计
数字钟的电路主要有电源模块、显示模块、按键模块、复位电路模块、时钟芯片模块、主控芯片STC89C52模块和闹铃模块等7大模块组成。
3.1.1电源
电源模块采用7805进行稳压,保证+5V电压的稳定输出,进一步提高系统的抗干扰能力和稳定性。
3.1.2独立按键模块
系统有三个独立按键,独立按键S1、S2、S3分别接至单片机P3.2、P3.3、P3.4口。
S1用来功能选择,其功能可以用按键次数N来表示:
N=1:
校准计时的小时位N=2:
校准计时的分钟位
N=3:
校准闹铃的小时位N=1:
校准闹铃的分钟位
N=5:
退出
S2主要功能用来进行加一操作。
在有功能选择的情况下,无论选中那一种功能操作,按下S2即进行一次加一操作,在没有功能选择的情况下,系统不响应此按键的任何操作。
S3用来控制闹铃的开或者关,在任意时间只要按下此键即可打开(或关闭)闹铃,在按键一次就可以关闭(或打开)闹铃。
3.1.3显示模块
一个良好的显示模块对一个系统非常重要,所有操作结果和计时结果,都要通过显示模块来显示出来。
同时显示模块提供了良好的人机交互平台。
常用的显示模式有LED7段数码管显示、点阵显示和液晶显示。
液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点。
但由于液晶其成本也偏高。
在使用时,不能有静电干扰,否则易烧坏液晶的显示芯片。
鉴于LED7段数码管成本低,也比较容易实现的特点,最终确定使用共阴极数码管来显示。
本系统显示模块电路由一块74HC573、一块74HC138芯片和两个四位一体7段数码管组成。
74HC573用来驱动数码管,74HC573的Q0~Q7分别接四位一体数码管的A~dp。
74HC138控制位选。
3.1.4复位电路模块
复位电路主要的功能是是整个系统初始化,在每次上电时系统自动初始化,如果在程序运行的过程中程序没有响应或者需要进行一次初始化,这是可以通过按复位开关来实现需要的有效操作。
3.1.5时钟芯片模块
DS1302时钟芯片是本系统实现高精度计时的关键。
利用DS1302时钟芯片独立于单片机来计时,在提高计时进度的同时也提高了整个系统的抗干扰能力。
DS1302通过SCLK、I/O、RES端口和单片机STC90C52进行通信。
SCLK接至单片机P1.7口,在读写操作时给DS1302提供相应的时钟脉冲;
I/O接至P3.5用来传送所有的数据;
RES接至单片机P1.6上用来控制单片机与时钟芯片间的数据传送的开始于结束。
DS1302的工作原理及使用方法见附录Ⅰ。
3.1.6主控模块
主控模块的核心组成部分是单片机STC89C52,承担着所有操作任务的调控与分派工作。
3.1.7闹铃模块
闹铃模块由蜂鸣器和蜂鸣器的驱动组成。
在有闹铃发生的时候,蜂鸣器的驱动电路驱动蜂鸣器发声,产生闹铃的效果。
3.2软件设计
3.2.1程序设计流程图
1、主程序流图
2、读DS1302中断及闹铃检测流程图
3、功能选择中断操作的程序流程图
4、加一中断操作的程序流程图
3.2.2源程序
/*本程序主要实现的功能:
利用时钟芯片DS1302和STC89C52进行高精度计时,能够实现时、分、秒的显示,具有校时,调整闹铃的功能。
设计者:
****2011/1/24*/
ORG0000H
SJMPMAIN;
主程序入口地址
ORG0003H
AJMPANJIAN_FUNCTION;
功能选择操作入口
ORG000BH
AJMPDELAY_10MS;
防抖延时以及闹铃
ORG0013H
AJMPCOUNT_UP;
按键加1操作入口
ORG001BH
AJMPDU_1302;
每300ms读ds1302中断入口
MAIN:
T_CLKBITP1.7;
实时时钟
T_IOBITP3.5;
数据线
T_RSTBITP1.6;
复位线
MOVTMOD,#11H
MOVTH1,#15H;
设置扫描ds1302的计数初值
MOVTL1,#0A0H
MOVTH0,#0C5H;
设置按键防抖延时
MOVTL0,#68H
SEC0DATA40H;
定义秒显示的个位
SEC1DATA41H;
定义秒显示的十位
LINE0DATA42H;
定义秒-时分隔符
MIN0DATA43H;
定义分显示个位
MIN1DATA44H;
定义分显示十位
LINE1DATA45H;
定义时-分分隔符
HOUR0DATA46H;
定义时显示个位
HOUR1DATA47H;
定义时显示十位
;
--------预读计数位寄存器-----------
SECONDDATA52H;
秒寄存器,用于暂存当前由DS1302读的的秒的数据
MINUTEDATA53H;
分-用于暂存当前由DS1302读的的分的数据
HOURDATA54H;
时-用于暂存当前由DS1302读的的时的数据
SMJSDATA55H;
设置ds1302扫描定时控制位(扫描计数)
FUNCDATA56H;
定义按键功能选择控制位
ZANCUN0DATA57H;
定义按键操作时存储校准值的个位
ZANCUN1DATA58H;
定义按键操作时存储校准值的十位
ZANCUN_SECONDDATA59H;
用于校时和对闹铃时对秒的显示值清零
NLHOUR_0DATA60H;
闹铃小时值存储单元
NLMINUTE_0DATA61H;
闹铃分值存储单元
NLHOUR_1DATA62H
NLMINUTE_1DATA63H
TEMPDATA64H;
闹铃发生标志位
NLJSDATA65H;
闹铃计时标志
MOVTEMP,#00H;
闹铃发生标志位初始化为0,表示没有闹铃的发生
MOVNLJS,#00H;
闹铃铃声长短控制单元
MOVNLHOUR_0,#08H;
闹铃符初值
MOVNLMINUTE_0,#30H
MOVLINE0,#40H;
显示分和秒的间隔符
MOVLINE1,#40H;
显示小时和分的间隔符
MOVSMJS,#00H
MOVSECOND,#00H;
时钟计时初始化值
MOVMINUTE,#25H
MOVHOUR,#08H
MOVZANCUN_SECOND,#00H
MOVR1,#40H;
--------------------------------R1
MOVR3,#07H;
确定当前选通的显示位------R3
SETBEX0
SETBIT0;
外部中断葿边沿触发
SETBIT1
SETBET0
SETBET1
SETBPT0;
设置定时器T0中断位高优先级
SETBPX1;
外部中断1中断为高优先级,用来在有功能操作
;
时来中断功能选择的中断
SETBEA;
开总中断
SETBTR1;
T1主要进行显示扫描中断
LCALLSET1302;
DS1302初始化
;
--------------------数码管显示程序------------------
XIANSHI:
-----检测闹铃是否发生-------------------------
MOVZANCUN0,R6
PUSHZANCUN0;
R6压栈
MOVR6,TEMP
CJNER6,#01H,XIANSHI_1;
检测闹零定时是否到时
SETBTR0;
XIANSHI_1:
MOVA,@R1;
读计数位的计数值----R1
CJNER3,#05H,NEXTWEI;
判断当前为是否需要显示分隔符"
-"
MOVP2,R3
MOVP0,LINE0
NEXTWEI:
CJNER3,#02H,SEL_0
MOVP0,LINE1
SEL_0:
MOVP2,R3;
送位选信号
/*--对计数位的计数值译码输出--开始-*/
CJNEA,#00H,SEL_1
MOVP0,#3FH;
0,如果当前计数位的计数值位0,则将0的共阴极七段数码管编码3FH送出显示
SJMPSEL_10
SEL_1:
CJNEA,#01H,SEL_2
MOVP0,#06H;
1
SEL_2:
CJNEA,#02H,SEL_3
MOVP0,#5BH;
2
SEL_3:
CJNEA,#03H,SEL_4
MOVP0,#4FH;
3
SEL_4:
CJNEA,#04H,SEL_5
MOVP0,#66H;
4
SEL_5:
CJNEA,#05H,SEL_6
MOVP0,#6DH;
5
SEL_6:
CJNEA,#06H,SEL_7
MOVP0,#7DH;
6
SEL_7:
CJNEA,#07H,SEL_8
MOVP0,#07H;
7
SEL_8:
CJNEA,#08H,SEL_9
MOVP0,#7FH;
8
SEL_9:
CJNEA,#09H,SEL_10
MOVP0,#6FH;
9
/*--对计数位的计数值译码输出--结束-*/
SEL_10:
INCR1;
R1加一,使当前计数位后移一位
DECR3;
位扫描控制位减一,因为初始位扫描是从111开始的
ACALLDELAY
CJNER3,#0FFH,SEL_11
MOVR3,#07H
SEL_11:
CJNER1,#48H,SEL_12
MOVR1,#40H
SEL_12:
POPZANCUN0
MOVR6,ZANCUN0
AJMPXIANSHI
---------------------扫描延时程序--------
DELAY:
MOVR5,#4;
----------------R5
D1:
MOV48H,#120
DJNZ48H,$
DJNZR5,D1
RET
--功能:
对当前由ds1302读得的计数值进行转换---(寄存器均已压栈)---
JSZH:
功能:
计数转换子程序,用于对当前读得的ds1302的计数值转换成sec0-houro的格式,便于显示
PUSHACC
MOVA,R0
PUSHACC;
R0压栈
MOVA,R1
R1压栈
PUSHPSW
计数数据sec0---hour0的存储首地址
MOVR0,#52H;
由ds1302读得的数据存放首地址
LOOP_1:
MOVA,@R0
ANLA,#0FH
MOV@R1,A
INCR1
MOVA,@R0
ANLA,#0F0H
SWAPA
INCR1
地址加一跳过分隔符"
_"
的存储单元
INCR0
CJNER1,#49H,LOOP_1
POPPSW
POPACC;
R1弹栈
MOVR1,A
R0弹栈
MOVR0,A
A弹栈
RET
-------读取DS1302计数程序(T1中断)-------(寄存器均已压栈)
DU_1302:
PUSHACC
R1压栈
DU_1302_1:
INCSMJS
MOVR1,SMJS
CJNER1,#03H,BELL;
每300ms读一次ds1302的计数值,避免在ds1302定时一秒
计数值改变时发生错读
LCALLGET1302
LCALLJSZH;
调计数转换子程序
设置扫描ds1302的计数60MS初值
MOVTL1,#0A0H
BELL:
-------------闹铃----------------
MOVA,NLHOUR_0
CJNEA,HOUR,DU_1302_RET
MOVA,NLMINUTE_0
CJNEA,MINUTE,DU_1302_RET
MOVTEMP,#01H;
定义TEMP为闹铃发生的标志
MOVNLMINUTE_0,#00H
MOVNLHOUR_0,#00H
DU_1302_RET:
POPACC
MOVR1,A;
RETI
************DS1302初始化子程序************************************
SET1302:
设置ds1302初始时间,并启动计时
A断点保护
CLRT_RST
CLRT_CLK
SETBT_RST
MOVB,#8EH;
控制寄存器
LCALLWRITEBYTE
MOVB,#00H;
写操作前WP=0
SETBT_CLK
movR0,#SECOND
MOVR7,#3;
秒/时/分;
-----R7
MOVR1,#80H;
秒写地址;
-----R1
S1302:
MOVB,R1;
写秒/时/分地址;
---R1
MOVA,@R0;
写秒数据;
-----R0
MOVB,A
DJNZR7,S1302
MOVB,#80H;
控制,wp=1,写保护
A恢复数据
-------------------------------------
GET1302:
从ds1302读时间秒/时/分
MOVR0,#SECOND;
------R0
MOVR7,#03H;
MOVR2,#81H;
-----R2
G13021:
CLRT_RST
MOVB,R2
LCALLWRITEBYTE;
写操作时,将一字节的内容由B写至DS1302中
LCALLREADBYTE;
读操作时,将一字节的内容读至A中
MOV@R0,A
INCR2
DJNZR7,G13021
--------------------------------------------
WRITEBYTE:
写B寄存器中的内容至1302一字节
MOVR4,#08H;
------R4
INBIT1:
MOVA,B
RRCA
SETBT_IO;
T_IO口做输入口
MOVT_IO,C
DJNZR4,INBIT1
-------------------------------------------
READBYTE:
读1302一字节至A寄存器
MOVR4,#8;
----R4
OUTBIT1:
MOVC,T_IO
DJNZR4,OUTBIT1
--------------------ENDDS0302--------------------------------
********************按键操作*********************
ANJIAN_FUNCTION:
功能选择键中断接至P3.2
WAIT:
JBP3.2,WAIT
启动定时器0,延时10ms
JNBTF0,$
JNBP3.2,$;
检测按键是否弹起
SETBEX1;
在有功能选择的时候开中断1
INCFUNC
保存A中的数值
MOVA,FUNC
CJNEA,#03H,FUN_1