51单片机做数字电子钟

51单片机做数字电子钟,第1张

源程序如下: ORG 0000H 程序开始入口

LJMP START

ORG 0003H 外中断0中断程序入口

RETI

ORG 000BH 定时器T0中断程序入口

LJMP INTT0 跳至INTTO执行

ORG 0013H 外中断1中断程序入口

RETI

ORG 001BH 定时器T1中断程序入口

LJMP INTT1

ORG 0023H 串行中断程序入口地址

RETI

---------------主程序----------------------

START:MOV R0,#70H 70给R0,清70-7FH显示内存

MOV R7,#0FH

CLEARDISP:MOV @R0,#00H0给R0中的数为地址的内存中存放(70H)

INC R0

DJNZR7,CLEARDISP

MOV 78H,#2 默认时间为12:00,闹钟5:00

MOV 79H,#1

MOV 74H,#2 防止上电时数码管显示00小时

MOV 75H,#1

MOV 66H,#1 中断退出时66H为1时,分、时计时单元数据移入显存标志

MOV 68H,#1 上电默认闹钟开状态

MOV 7DH,#6 闹钟时十位

MOV 7CH,#3

MOV 69H,#0

MOV 7AH,#0AH放入"熄灭符"数据

MOV TMOD,#11H 设T0、T1为16位定时器

MOV TL0,#0B0H 50MS定时初值(T0计时用)

MOV TH0,#3CH

SETBEA 总中断开放

SETBET0 允许T0中断

SETBTR0 T0定时器开始计时

MOV R4,#14H 1秒定时用初值(50MS×20)

START1:LCALL DISPLAY 显示子程序

LCALL BEEP闹钟查询

JNB P1.7,SETTIMEP1.7口为0时转时间调整程序

JMP START1 P1.7口为1时跳回START1

-----------------------时间闹钟调整系统--------------------------

NFLAG:MOV A,68H 设置闹钟开关状态

CJNE A,#1,BEE68

MOV 68H,#0

JMP E6

BEE68:MOV 68H,#1

E6:MOV 66H,#8 中断退出66H不为1时分、时计时单元数据移入显存标志

MOV 72H,7BH

MOV 73H,7CH

MOV 74H,7DH

MOV 75H,7EH

LCALLDDL

LCALLDDL

MOV 72H,68H

MOV 73H,69H

MOV 74H,7AH

MOV 75H,7AH

LCALLDDL

LCALLDDL

MOV 66H,#1

LJMP START1

SETTIME:LCALLDDL

JB P1.7,NFLAG 键按下时间小于1秒,设置闹钟开关状态并查看闹钟时间,不关走时,确保准确,大于1秒调时

MOV TL1,#0B0H T1闪烁定时初值

MOV TH1,#3CH

MOV R2,#06H进入调时状态,赋闪烁定时初值

MOV 66H,#8 调闹钟时保持走时,关闭时钟显示数据

SETB ET1允许T1中断

SETB TR1开启定时器T1

SET1:LCALLDISPLAY调用显示,防止键按下无显示

JNB P1.7,SET1 P1.7口为0等待键释放

MOV R5,#00H清设置类型闪烁标志

SETN1:INC R5 闹钟分调整

SET5:LCALLDISPLAY

JB P1.7,SET5

SEETN1:LCALLDDL有键按下大于1秒分时间连续加(0.5秒加1),小于1秒转调时状态

JB P1.7,SET6 键释放查询,键释放自动转调时

MOV R0,#7CH

LCALL ADD1

MOV A,R3

CLR C

CJNEA,#60H,HHN1

HHN1:JCSEETN1

LCALL CLR0

JMP SEETN1

SET6:INC R5 闹钟时调整

SEET6:LCALLDISPLAY

JB P1.7,SEET6

SEETNH1:LCALLDDL

JB P1.7,SETF

MOV R0,#7EH

LCALLADD1

MOV A,R3

CLR C

CJNEA,#24H,HOUU1

HOUU1:JC SEETNH1

LCALL CLR0

JMP SEETNH1

SETF:LCALLDISPLAY

JB P1.7,SETF

LCALLDDL

JNB P1.7,SETOUT 短按调时,长按退出

CLR ET0

CLR TR0

MOV 70H,#00H设定后的时间从00秒开始走时

MOV 71H,#00H

INC R5

SET3:LCALLDISPLAY

JB P1.7,SET3

SETMM:LCALLDDL

JB P1.7,SET4

MOV R0,#77H

LCALL ADD1

MOV A,R3

CLR C

CJNEA,#60H,MMH

MMH:JC SETMM

LCALL CLR0

AJMP SETMM

SET4:INC R5

SEET4:LCALLDISPLAY

JB P1.7,SEET4

SETHH:LCALLDDL

JB P1.7,SETOUT1

MOV R0,#79H

LCALLADD1

MOV A,R3

CLR C

CJNEA,#24H,HOUU

HOUU:JC SETHH

LCALL CLR0

AJMP SETHH

SETOUT1:SETB ET0

SETB TR0 计时开始

SETOUT:MOV R5,#00H 清设置类型闪烁标志

CLRTR1 关闭T1

CLRET1 关T1中断

MOV 66H,#1

SETOUT2:LCALLDISPLAY

JNB P1.7,SETOUT2

LJMPSTART1

--------------------------延时1秒钟-----------------------

DDL:MOV 18H,#36

DDL0:MOV 17H,#239

DDL1:LCALLDISPLAY

DJNZ 17H,DDL1

DJNZ 18H,DDL0

RET

----------------------------T0中断程序------------------------

INTT0: PUSH ACC 打包

PUSH PSW

CLR ET0

CLR TR0

MOV A,#0B7H

ADD A,TL0

MOV TL0,A

MOV A,#3CH

ADDC A,TH0

MOV TH0,A

SETB TR0

DJNZ R4, OUTT0 20次中断未到中断退出

ADDSS: MOV R4,#14H 20次中断到(1秒)重赋初值

MOV R0,#71H 指向秒计时单元(70-71H)

ACALL ADD1 调用加1程序(加1秒 *** 作)

MOV A,R3 秒数据放入A(R3为2位十进制数组合)

CLR C 清进位标志

CJNE A,#60H,ADDMM

ADDMM: JC OUTT01小于60秒退出

ACALL CLR0 等于或大于60秒清0

MOV R0,#77H 指向分计时单元(76H-77H)

ACALL ADD1

MOV A,R3

CLR C

CJNE A,#60H,ADDHH

ADDHH: JC OUTT0

ACALL CLR0

MOV R0,#79H 指向小时计时单元(78H-79H)

ACALL ADD1

MOV A,R3

CLR C

CJNE A,#24H,HOUR

HOUR: JCOUTT0

ACALL CLR0

OUTT0: MOV A,66H 查询标志

CJNE A,#1,OUTT01

MOV 72H,76H 中断退出时将分、时计时单元数据移入对应显示单元

MOV 73H,77H

MOV 74H,78H

MOV 75H,79H

OUTT01:POP PSW 出栈

POP ACC

SETB ET0 开放T0

RETI中断返回

---------------------------加1程序--------------------------

ADD1: MOV A,@R0 取当前计时单元数据到A

DEC R0 指向前一地址

SWAP A A中数据高四位与低四位交换

ORL A,@R0 前一地址中数据放入A中低四位

ADD A,#01H A加1 *** 作

DA A 十进制调整

MOV R3,A 移入R3寄存器

ANL A,#0FH 高四位变0

MOV@R0,A 放回前一地址单元

MOV A,R3 取回R3中暂存数据

INCR0 指向当前地址单元

SWAP A A中数据高四位与低四位交换

ANL A,#0FH 高四位变0

MOV @R0,A 数据放入当削地址单元中

RET

CLR0: CLR C

CLR A 清累加器

MOV @R0,A 清当前地址单元

DEC R0 指向前一地址

MOV @R0,A 前一地址单元清0

RET 子程序返回

-------------------------调时闪烁程序----------------------

INTT1: PUSHACC

PUSHPSW

MOV TL1,#0B0H

MOV TH1,#3CH

DJNZR2,INTT1OUT0.3秒未到退出中断(50MS中断6次)

MOV R2,#06H 重装0.3秒定时用初值

CPL 02H0.3秒定时到对闪烁标志取反

JB 02H,FLASH1 02H位为1时显示单元"熄灭"

MOV A,R5

CJNEA,#01H,NL

JMP NNN1

NL:CJNEA,#02H,NL1

LJMPNNN1

NL1:CJNEA,#03H,NL2

LJMPNLL

NL2:CJNEA,#04H,INTT1OUT

LJMPNLL

NLL:MOV 72H,76H

MOV 73H,77H

MOV 74H,78H

MOV 75H,79H

AJMPINTT1OUT

NNN1:MOV 72H,7BH

MOV 73H,7CH

MOV 74H,7DH

MOV 75H,7EH

INTT1OUT:POP PSW 恢复现场

POP ACC

RETI 中断退出

FLASH1:MOV A,R5

CJNEA,#01H,ML

LJMPMNN1

ML:CJNEA,#02H,ML1

LJMPMNN2

ML1:CJNEA,#03H,MN

LJMPMLL

MN:CJNEA,#04H,INTT1OUT

LJMPMHL

MLL:MOV 72H,7AH

MOV 73H,7AH 显示单元(72-73H),将不显示分数据

MOV 74H,78H

MOV 75H,79H

AJMPINTT1OUT

MHL:MOV 72H,76H

MOV 73H,77H

MOV 74H,7AH 显示单元(74-75H),小时数据将不显示

MOV 75H,7AH

AJMPINTT1OUT

MNN1:MOV 72H,7AH

MOV 73H,7AH 显示单元(72-73H),将不显示闹钟分数据

MOV 74H,7DH

MOV 75H,7EH

AJMPINTT1OUT

MNN2:MOV 72H,7BH

MOV 73H,7CH

MOV 74H,7AH

MOV 75H,7AH 显示单元(74-75H),闹钟小时数据将不显示

AJMPINTT1OUT

-------------------------显示-------------------------------

DISPLAY:MOVDPTR,#DISDATA

MOVA,70H

MOVC A,@A+DPTR

MOVP3,A

CLRP1.0

NOP

NOP

NOP

SETB P1.0

MOVA,71H

MOVC A,@A+DPTR

MOVP3,A

CLRP1.1

NOP

NOP

NOP

SETB P1.1

MOVA,72H

MOVC A,@A+DPTR

MOVP3,A

CLRP1.2

NOP

NOP

NOP

SETB P1.2

MOVA,73H

MOVC A,@A+DPTR

MOVP3,A

CLRP1.3

NOP

NOP

NOP

SETB P1.3

MOVA,74H

MOVC A,@A+DPTR

MOVP3,A

CLRP1.4

NOP

NOP

NOP

SETB P1.4

MOVA,75H

MOVC A,@A+DPTR

MOVP3,A

CLRP1.5

NOP

NOP

NOP

SETB P1.5

RET

BEEP:MOV A,68H 查询标志

CJNE A,#1,BEERE

MOV A,78H 查询闹钟时个位

CJNE A,7DH,BEERE

MOV A,79H 查询闹钟时十位

CJNE A,7EH,BEERE

MOV A,76H 查询闹钟分个位

CJNE A,7BH,BEERE

MOV A,77H 查询闹钟分十位

CJNE A,7CH,BEERE

BB:CLR P1.6

LCALL DDL

SETB P1.6

LCALL DDL

JNB P1.7,BEERR

BEERE:RET

BEERR:SETB P1.6

MOV 68H,#0

LCALL DISPLAY

JNB P1.7,BEERR

JMP BEERE

DISDATA:DB 0C0H,0F9H,64H,70H,59H,52H,42H,0F8H,40H,50H,0FFH 0123456789空白

END

一、时钟电路原理

时钟电路,就是产生象时钟一样准确的振荡电路。时钟电路主要由晶体振荡器、晶震控制芯片和电容三部分构成,具有价格低廉、接口简单、使用方便等特点,目前已有了很广泛的应用,如电子表的时钟电路、电脑的时钟电路、MP3/4的时钟电路等。目前流行的串行时钟电路有DS1302、DS1307、PCF8485等,其中,DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,采用串行数据传输,并为掉电保护电源提供可编程的充电功能。本文我们就以DS1302为例来对时钟电路原理进行详细的讲解。

二、时钟电路原理- -引脚

实时时钟电路DS1302包括VCC1、VCC2、X1、X2、SCLK、I/O、RST、GND八个引脚。其中,VCC1用作主电源,VCC2用作备用电源,当满足VCC1>VCC2时,由主电源向DS1302供电,当满足VCC2>VCC1+0.2时,由备用电源向DS1302进行供电X1和X2是32867Hz的晶振管脚,主要用于为芯片提供时钟脉冲SCLK为串行时钟,主要用于提供时钟信号以控制数据的输入与输出I/O为输入输出设备,用作三线接口时的双向数据线RST主要提供复位功能,其在数据的读写过程中,必须保持为高电位GND引脚用于和大地相连。

三、时钟电路原理

DS1302的控制字节的最高有效位即位7必须是逻辑1,若该位为0,则不能把该数据写入进DS1302中位6为1表示存取RAM数据,为0表示存取日历时钟数据位5至位1表示 *** 作单元的地址最低有效位即位0为1表示要进行读 *** 作,为0表示要进行写 *** 作其控制字节总是从最低位开始进行输出。

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低有效位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,数据输出时也是从最低有效位即位0开始。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11067728.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存