📄 clock.asm
字号:
XC BIT 00H ;调时标志位
XT BIT 01H ;测温标志位
XS BIT 02H ;闪烁标志位
XU BIT 03H
XD BIT 04H
FLAG1 BIT 06H ;是否检测到DS18B20标志位
DIS EQU 30H ;显示缓冲
MSEC EQU 39H ;计时缓冲区
SEC EQU 3AH
MIN EQU 3BH
HOUR EQU 3CH
TEM_H EQU 28H
TEM_L EQU 29H
T_1 EQU 40H
T_2 EQU 41H
T_3 EQU 42H
T_4 EQU 43H
ORG 0000H
AJMP START
ORG 000BH
AJMP INT_0
ORG 0030H
START: MOV R7,#26H
MOV R0,#1FH
CLR A
S1: MOV @R0,A
INC R0
DJNZ R7,S1
MOV SP,#60H
MOV DPTR,#TABLE
MOV TMOD,#01H
MOV TH0,#03CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
MAIN: LCALL KEY ;检测标志位判断工作模式
JB XC,CD
JB XT,TD
lCALL CLOCK
LCALL DISPLAY
AJMP MAIN
CD: CLR TR0
CLR XC
MOV P3,#0BFH
MOV R0,#SEC
CD1: LCALL KEY
LCALL FLASH
JNB XC,CD1
CLR XC
SETB TR0
MOV P3,#0FFH
AJMP MAIN
TD: CLR P3.7
LCALL GET_TEMPER
MOV A,TEM_L
ANL A,#0F0H
SWAP A
MOV TEM_L,A
MOV A,TEM_H
ANL A,#0FH
SWAP A
ORL TEM_L,A
TD3: LCALL TOBCD
LCALL T_DISPLAY
CLR XT
SETB P3.7
AJMP MAIN
TOBCD: CLR A
MOV R2,#08H
MOV R3,A
TO1: MOV A,TEM_L
RLC A
MOV TEM_L,A
MOV A,R3
ADDC A,R3
DA A
MOV R3,A
DJNZ R2,TO1
RET
T_DISPLAY: MOV A,R3
ANL A,#0FH
MOV DIS+2,A
MOV A,R3
ANL A,#0F0H
SWAP A
MOV DIS+3,A
MOV DIS,#0CH
MOV DIS+1,#0DH
MOV DIS+4,#0BH
MOV DIS+5,#0BH
MOV DIS+6,#0BH
MOV DIS+7,#0BH
MOV R3,#200
T_D1: LCALL DISPLAY
DJNZ R3,T_D1
RET
KEY:
JB P3.2,KEY1
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
JB P3.2,KEY1
SETB XC
KEY1: JB P3.3,KEY2
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
JB P3.3,KEY2
SETB XT
KEY2: JB P3.5,KEY3
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
JB P3.5,KEY3
SETB XD
KEY3: JB P3.4,KEY_DONE
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
JB P3.4,KEY_DONE
SETB XU
KEY_DONE: RET
TAN:
JB XU,TAN1
JB XD,TAN2
AJMP TAN4
TAN1: INC R0
CLR XU
CJNE R0,#3DH,TAN4
MOV R0,#SEC
AJMP TAN3
TAN2: CLR XD
MOV A,@R0
ADD A,#01H
DA A
CJNE R0,#3CH,TAN5
CJNE A,#24H,TAN3
MOV A,#00H
TAN5: CJNE A,#60H,TAN3
MOV A,#00H
TAN3: MOV @R0,A
TAN4: RET
FLASH: JB XD,F3
MOV 44H,@R0
MOV R5,#20
MOV @R0,#0BBH
LCALL KEY
F1: LCALL CLOCK
LCALL DISPLAY
DJNZ R5,F1
MOV @R0,44H
F3: MOV R5,#20
F2: LCALL CLOCK
LCALL DISPLAY
LCALL KEY
LCALL TAN
DJNZ R5,F2
RET
DISPLAY: MOV A,#01H
MOV R1,#DIS
DIS1: MOV P2,A
PUSH ACC
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
POP ACC
RL A
INC R1
CJNE R1,#38h,DIS1
RET
;**********************************时间送显示子程序
CLOCK: PUSH PSW
PUSH ACC
MOV A,SEC
ANL A,#0FH
MOV DIS,A
MOV A,SEC
SWAP A
ANL A,#0FH
MOV DIS+1,A
MOV DIS+2,#0AH
MOV A,MIN
ANL A,#0FH
MOV DIS+3,A
MOV A,MIN
ANL A,#0F0H
SWAP A
MOV DIS+4,A
MOV DIS+5,#0AH
MOV A,HOUR
ANL A,#0FH
MOV DIS+6,A
MOV A,HOUR
ANL A,#0F0H
SWAP A
MOV DIS+7,A
POP ACC
POP PSW
RET
;**********************************计时程序
INT_0: PUSH PSW ;保护现场
PUSH ACC
MOV A,#0B0H ;初值加上当前TL0值校正时间
ADD A,TL0
MOV TL0,A
MOV TH0,#3CH
INC MSEC
MOV A,MSEC
CJNE A,#20,DONE
MOV MSEC,#00H
MOV A,SEC
ADD A,#01H
DA A ;进制转换
MOV SEC,A
CJNE A,#60H,DONE
MOV SEC,#00H
MOV A,MIN
ADD A,#01H
DA A
MOV MIN,A
CJNE A,#60H,DONE
MOV MIN,#00H
MOV A,HOUR
ADD A,#01H
DA A
MOV HOUR,A
CJNE A,#24H,DONE
MOV HOUR,#00H
DONE: POP ACC
POP PSW
RETI
DELAY: MOV R7,#50
D1: MOV R6,#25
DJNZ R6,$
DJNZ R7,D1
RET
DELAY1:MOV R3, #0
DLOOP: DJNZ R3, DLOOP
DJNZ R2, DELAY1
RET
;************************温度读取程序
INIT_1820: ; 这是DS18B20复位初始化子程序
SETB P1.0
NOP
CLR P1.0
MOV R1,#3 ;主机发出延时537微秒的复位低脉冲
TSR1:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P1.0 ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:JNB P1.0,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:MOV R0,#117
TSR6:DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:SETB P1.0
RET
GET_TEMPER: ; 读出转换后的温度值
SETB P1.0
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL DELAY1 ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ; 将读出的温度数据保存到35H/36H
RET
WRITE_1820: ;写DS18B20的子程序(有具体的时序要求)
MOV R2,#8 ;一共8位数据
CLR C
WR1: CLR P1.0
MOV R3,#6
DJNZ R3,$
RRC A
MOV P1.0,C
MOV R3,#23
DJNZ R3,$
SETB P1.0
NOP
DJNZ R2,WR1
SETB P1.0
RET
READ_18200: ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:MOV R2,#8 ; 数据一共有8位
RE01:CLR C
SETB P1.0
NOP
NOP
CLR P1.0
NOP
NOP
NOP
SETB P1.0
MOV R3,#9
RE10:DJNZ R3,RE10
MOV C,P1.0
MOV R3,#23
RE20:DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
TABLE:
DB 0C0H ;"0"
DB 0F9H ;"1"
DB 0A4H ;"2"
DB 0B0H ;"3"
DB 99H ;"4"
DB 92H ;"5"
DB 82H ;"6"
DB 0F8H ;"7"
DB 80H ;"8"
DB 90H ;"9"
DB 0BFH ;'-'
DB 0FFH ;熄灭
DB 0c6H ;"C"
DB 09CH ;"'"
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -