?? 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 + -