电子钟的设计与实现0.docx
《电子钟的设计与实现0.docx》由会员分享,可在线阅读,更多相关《电子钟的设计与实现0.docx(41页珍藏版)》请在冰豆网上搜索。
![电子钟的设计与实现0.docx](https://file1.bdocx.com/fileroot1/2023-1/8/ce0a746e-e522-4430-94e9-c4d4b7f1ba15/ce0a746e-e522-4430-94e9-c4d4b7f1ba151.gif)
电子钟的设计与实现0
实时电子时钟钟的设计与实现
(4个按键功能与作用简介)(程序流程图)
实时电子时钟的设计与实现是通过用单片机AT89S52与实时时钟芯片DS1302设计电路制作成用数码管显示实时时间与日期的电子钟。
一:
实时电子时钟功能特点:
·采用2个4位数码管作为显示时间与日期,显示亮度高,无视角,按钮k调节时间与日期交换显示。
·采用专业的时钟芯片DS1302和充电电容使时钟断电依然走时。
·去功能菜单操作,4个按键操作,可加减调时,操作方便。
(4个按键功能与作用简介)
二:
实时电子时钟制作元件清单:
品名
型号
数量
品名
型号
数量
共阳数码管
FJ5461BH
2
电阻
4.7k
8
电阻
470
7
单片机
AT89S52
1
晶振
12M
1
晶振
23.768KHZ
1
微动开关
5*5*6mm
4
极性电容
220uF
1
极性电容
10uF
1
电容
30PF
1
三极管
8550
8
时钟IC
DS1302
1
三:
主要元器件芯片简介
3.1)单片机AT89S52功能介绍:
AT89S52是一种低功耗、高性能COMS8位微控制器,具有8K在系统可编程Flash存储器。
使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8K可编程Flash存储器,256KRAM,32位I/O可编程口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
AT89S52可降至0HZ静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保护,振荡器被冻结,单片机一切工作停止,直至下一个中断或硬件复位为止。
AT89S52引脚图如下如所示:
AT89S52内部方框图如下:
AT89S52各引脚功能介绍:
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上拉电阻。
在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。
程序校验时,需要外部上拉电阻。
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。
在flash编程和校验时,P1口接收低8位地址字节。
引脚号
第二功能
P1.0
T2(定时器/计数器的外部计数输入),时钟输出
P1.1
T2EX(定时器/计数器的捕捉/重载触发信号和方向控制)
P1.5
MOSI(在系统编程用)
P1.6
MISO(在系统编程用)
P1.7
SCK(在系统编程用)
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。
在这种应用中,P2口使用很强的内部上拉发送1。
在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。
在flash编程和校验时,P3口也接收一些控制信号。
引脚号
第二功能
P3.0
RXD(串行输入)
P3.1
TXD(串行输出)
P3.2
INT0(外部中断0)
P3.3
INT1(外部中断1)
P3.4
T0(定时器0外部输入)
P3.5
T1(定时器1外部输入)
P3.6
WR(外部数据存储器写选通)
P3.7
RD(外部数据存储器读选通)
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
ALE/PROG:
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在flash编程时,此引脚(PROG)也用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
PSEN:
外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。
当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。
为了执行内部程序指令,EA应该接VCC。
在flash编程期间,EA也接收12伏VPP电压。
XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
特殊功能寄存器
AT89S52特殊寄存器映象及复位值
表一:
AT89S52特殊寄存器映像及复位值表
定时器2寄存器:
寄存器T2CON和T2MOD包含定时器2的控制位和状态位(如表二和表三所示),寄存器对RCAP2H和RCAP2L是定时器2的捕捉/自动重载寄存器。
中断寄存器:
各中断允许位在IE寄存器中,六个中断源的两个优先级也可在IE中设置。
双数据指针寄存器:
为了更有利于访问内部和外部数据存储器,系统提供了两路16位数据指针寄存器:
位于SFR中82H~83H和位于DP0中84H~85。
特殊寄存器AUXR1中DPS=0选择DP0;DPS=1选择DP1。
用户应该在访问数据指针寄存器前先初始化DSP至合理的值。
掉电标志位:
掉电标志位(POF)位于特殊寄存器PCON的第四位(PCON.4)。
上电期间POF置“1”。
POF可以软件控制使用与否,但不受复位影响。
看门狗定时器
WDT是一种需要软件控制的复位方式。
WDT由13位计数器和特殊功能寄存器中的看门狗定时器复位存储器(WDTRST)构成。
WDT在默认情况下无法工作;为了激活WDT,必须往WDTRST寄存器(地址:
0A6H)中依次写入01EH和0E1H。
当WDT激活后,晶振工作,WDT在每个机器周期都会增加。
WDT计时周期依赖于外部时钟频率。
除了复位(硬件复位或WDT溢出复位),没有办法停止WDT工作。
当WDT溢出,它将驱动RSR引脚一个高个电平输出。
WDT的使用
为了激活WDT,必须向WDTRST寄存器(地址为0A6H的SFR)依次写入0E1H和0E1H。
当WDT激活后,必须向WDTRST写入01EH和0E1H喂狗来避免WDT溢出。
当计数达到8191(1FFFH)时,13位计数器将会溢出,这将会复位器件。
晶振正常工作、WDT激活后,每一个机器周期WDT都会增加。
为了复位WDT,必须向WDTRST写入01EH和0E1H(WDTRST是只读寄存器)。
WDT计数器不能读或写。
当WDT计数器溢出时,将给RST引脚产生一个复位脉冲输出,这个复位脉冲持续96个晶振周期(TOSC),其中TOSC=1/FOSC。
为了很好地使用WDT,应该在一定时间内周期性写入那部分代码,以避免WDT复位。
3.2)时钟芯片DS1302功能介绍:
DS1302时钟芯片主要组成部分包括实时时钟/日历、31字节的静态RAM、移位寄存器、控制逻辑和振荡器,它经过一个简单的串行接口与微处理器通信。
实时时钟/日历提供秒、分、时、日、周、月和年等信息,对于小于31天的月,月末的日期自动进行调整,包括了闰年校正的功能,可以采用24小时或带AM/PM的12小时格式。
使用同步串行通信,简化与微处理器的通信。
数据可以以每次一个字节或多达31字节的多字节形式传送至时钟/RAM或从其中送出。
DS1302能在非常低的功耗下工作,消耗小于1微瓦的功率便能保持数据和时钟信息。
DS1302的命令字
命令字节如图所示:
每一数据传送由命令字节初始化。
最高有效位MSB(位7)必须为逻辑1,如果它是零,禁止写DS1302。
位6为逻辑0指定时钟/日历数据;逻辑1指定RAM数据。
位1至5指定进行输入或输出的特定寄存器。
最低有效位LSB(位0)为逻辑0指定进行写操作;逻辑1指定进行读操作。
DS1302引脚图如下如所示
引脚说明
引脚
名称
功能
2/3
X1/X2
32.768KHZ晶振引脚
1/8
VCC2/VCC1
电源引脚
4
GND
地
5
RST
复位
6
I/O
数据输入/输出
7
SCLK
串行时钟
DS1302时钟芯片时序图如下:
3.3):
4位7段数码管
4位7段数码管各引脚对应关系如下图所示:
四:
实时时钟设计电路图
运用Protel99se搭建好实时电子时钟电路图如下
五:
实时电子时钟程序实现:
(程序流程图)
;4位7段数码管显示
;P0为段码口、P2为位码口
;晶振12M
;时钟芯片:
DS1302
;**************DS1302端口位定义**************
IO_DATABITP1.1;数据传送总线
SCLKBITP1.0;时钟控制总线
RSTBITP1.2;复位总线
K1EQUP1.4;独立键
K2EQUP1.5
K3EQUP1.6
K4EQUP1.7
BEEPEQUP3.7;蜂鸣器
RELAYEQUP1.3;继电器
T_CONUEQU22H;中断计数
TIME_LEQU23H;定时初值
TIME_HEQU24H
TIME_DATAEQU50H;显示时间单元首地址
DATE_DATAEQU60H;显示日期单元首地址
DS_DATAEQU58H;显示定时时间单元首地址
;------------------------------------------------
ORG0000H
AJMPMAIN
ORG000BH
AJMPINT_T0
ORG0100H
;------------------------------------------------
MAIN:
MOVTMOD,#01H;T0,方式1
MOVTIME_L,#00H;50MS定时值
MOVTIME_H,#4CH
MOVT_CONU,#00H;中断次数
MOVIE,#82H;EA=1,ET0=1
MOVA,#00H
MOVR0,#40H;从40H单元开始
MOVR1,#40H;清64个单元
M_CLEAR:
MOV@R0,A
INCR0
DJNZR1,M_CLEAR
MOV7FH,#0AH;送熄灭符
SETBBEEP
LCALLTIME_DELAY;调显示延时
LCALLPROSET;DS1302初始化
MAIN1:
LCALLGET_TIME;从DS1302读数据程序
LCALLCHULI;实时时间数据处理
MOVR0,#TIME_DATA;显示时、分、秒
LCALLDISP
MOVR0,#TIME_DATA
LCALLTIME_DISPLAY
LCALLSET_KEY;键功能程序
LCALLCOMP;实时时间与定时时间比较
JBK1,MAIN1
CALLBEEP_BL
MAIN2:
LCALLCHULI;日期数据处理
MOVR0,#DATE_DATA
LCALLDISP;显示年、月、日
MOVR0,#DATE_DATA
LCALLTIME_DISPLAY
JBK1,MAIN2
CALLBEEP_BL
MAIN3:
LCALLDS_CHULI;定时时间数据处理
MOVR0,#DS_DATA
LCALLDS_SP;显示定时时间
MOVR0,#DS_DATA
LCALLDS_DISPLAY
JBK1,MAIN3
CALLBEEP_BL
AJMPMAIN1
;--------------------------------------------
;中断服务子程序
;300MS对闪动标记取反一次
;--------------------------------------------
INT_T0:
PUSHACC
PUSHPSW
MOVTL0,TIME_L
MOVTH0,TIME_H
INCT_CONU
MOVA,T_CONU
CJNEA,#06H,INT_END
MOVT_CONU,#00H
CPL0AH
INT_END:
POPPSW
POPACC
RETI
;--------------------------------------------
;DS1302初始化子程序
;(R0)=数据(R1)=地址
;--------------------------------------------
PROSET:
CLRRST;DS1302复位
CLRSCLK
NOP
NOP
SETBRST
;MOVR1,#80H;写秒寄存器
;MOVR0,#00H;启动振荡器
;LCALLWRITE
;MOVR1,#82H;写分寄存器
;MOVR0,#58H
;LCALLWRITE
;MOVR1,#84H;写时寄存器
;MOVR0,#80H
;LCALLWRITE
MOVR1,#90H;写充电寄存器
MOVR0,#0ABH
LCALLWRITE
RET
;===============================================
;读时间、日期数据子程序
;存放单元40H-46H
;===============================================
GET_TIME:
MOVR1,#81H;读秒
LCALLREAD
MOV40H,R0
MOVR1,#83H;读分
LCALLREAD
MOV41H,R0
MOVR1,#85H;读时
LCALLREAD
MOV42H,R0
MOVR1,#87H;读出日期
LCALLREAD
MOV43H,R0
MOVR1,#89H;读出月份
LCALLREAD
MOV44H,R0
MOVR1,#8BH;读出星期
LCALLREAD
MOV46H,R0
MOVR1,#8DH;读出年
LCALLREAD
MOV45H,R0
RET
;================================================
;写DS1302子程序
;================================================
WRITE:
CLRSCLK
NOP
NOP
SETBRST
NOP
MOVA,R1
MOVR2,#08H
WRI_01:
RRCA;传输地址到DS1302
NOP
NOP
CLRSCLK
NOP
NOP
MOVIO_DATA,C
NOP
NOP
SETBSCLK
NOP
NOP
DJNZR2,WRI_01
CLRSCLK
NOP
NOP
MOVA,R0
MOVR2,#08H
WRI_02:
RRCA;传输数据到DS1302
NOP
CLRSCLK
NOP
NOP
MOVIO_DATA,C
NOP
NOP
SETBSCLK
NOP
NOP
DJNZR2,WRI_02
CLRSCLK
NOP
NOP
CLRRST
NOP
NOP
RET
;=================================================
;读DS1302子程序
;=================================================
READ:
CLRSCLK
NOP
NOP
SETBRST
NOP
NOP
MOVA,R1
MOVR2,#08H
READ_01:
RRCA
NOP;先传输地址到DS1302
MOVIO_DATA,C
NOP
NOP
SETBSCLK
NOP
NOP
CLRSCLK
NOP
NOP
DJNZR2,READ_01
NOP
NOP
SETBIO_DATA
CLRA
CLRC
MOVR2,#08H
READ_02:
CLRSCLK
NOP
NOP
MOVC,IO_DATA
NOP
NOP
RRCA;再从DS1302接收数据
NOP
NOP
SETBSCLK
NOP
NOP
DJNZR2,READ_02
MOVR0,A
CLRRST
RET
;==============================================
;实时时间、日期数据处理子程序
;==============================================
CHULI:
MOVA,40H;处理秒数据
ANLA,#0FH
MOV50H,A
MOV70H,A
MOVA,40H
ANLA,#11110000B
SWAPA
MOV51H,A
MOV71H,A
;---------------------------------------------
MOVA,41H;处理分数据
ANLA,#0FH
MOV52H,A
MOV72H,A
MOVA,41H
ANLA,#11110000B
SWAPA
MOV53H,A
MOV73H,A
;---------------------------------------------
MOVA,42H;处理时数据
ANLA,#0FH
MOV54H,A
MOV74H,A
MOVA,42H
ANLA,#11110000B
SWAPA
MOV55H,A
MOV75H,A
;----------------------------------------------
MOVA,43H;处理日数据
ANLA,#0FH
MOV60H,A
MOV76H,A
MOVA,43H
ANLA,#11110000B
SWAPA
MOV61H,A
MOV77H,A
;---------------------------------------------
MOVA,44H;处理月数据
ANLA,#0FH
MOV62H,A
MOV78H,A
MOVA,44H
ANLA,#11110000B
SWAPA
MOV63H,A
MOV79H,A
;---------------------------------------------
MOVA,45H;处理年数据
ANLA,#0FH
MOV64H,A
MOV7AH,A
MOVA,45H
ANLA,#11110000B
SWAPA
MOV65H,A
MOV7BH,A
;----------------------------------------------
MOVA,46H;处理周数据
MOV66H,A
MOV7CH,A
RET
;=============================================
;实时时间、日期查表取数子程序
;=============================================
DISP:
;MOVR0,#TIME_DATA
MOVR3,#06H
DISP1:
MOVA,@R0
MOVDPTR,#TAB_NU
MOVCA,@A+DPTR
MOV@R0,A
INCR0
DJNZR3,DISP1
RET
;====================================================
;时间、日期显示子程序
;====================================================
TIME_DISPLAY:
;MOVR0,#TIME_DATA;取得显示单元首地址
MOVR1,#07FH;从第一个数码管开始
MOVR2,#08H;共8个数码管
DISLP:
MOVP0,@R0;获得当前单元数据
MOVA,R1
MOVP2,A;数码显示
JBACC.5,DISLP1;第三位数码管显示-
MOVP0,#0BFH
JMPDISLP3
DISLP1:
JBACC.2,DISLP2;第六位数码管显示-
MOVP0,#0BFH
JMPDISLP3
DISLP2:
INCR0
DISLP3:
MOVA,R1;为下一个数准备
RRA;下一个单元
MOVR1,A;保存
LCALLDELAY;为了保证数码管亮度,延时
DJNZR2,DISLP;重复显示,直到全部数据刷新过
RET;返回
DELAY:
MOVR4,#0AH
L15:
MOVR5,#64H
L16:
DJNZR5,L16
DJNZR4,L15
RET
;**********