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开始。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)