有沒有 大神幫我看一下這個程序里的時鐘為什么不會走啊
;定義區
;18B20參數區
FLAG1 BIT 00H ; FLAG1:標志位,為"1"時表示檢測到DS18B20
TEMPER_NUM EQU 50H ; TEMPER_NUM:保存讀出的溫度數據
T_DISBF EQU 37H ;溫度顯示緩沖區 37H/38H
SET_MIN EQU 39H ;39H
SET_HOU EQU 3AH ;3BH
TEMPER_L EQU 36H ;溫度的低位
TEMPER_H EQU 35H ;溫度的高位
TEMP EQU 34H ;臨時存放溫度數據的單元
SJGW EQU 30H ;存放顯示溫度的個位數
SJSW EQU 31H ;存放顯示溫度的十位數
GW BIT P2.1 ;個位顯示片選開關
SW BIT P2.0 ;十位顯示片選開關
DQ BIT P1.3 ; DQ:DS18B20的數據總線接腳
;計時參數區
DIS_SEC EQU 40H ;40,41H
DIS_MIN EQU 42H ;42,43H
DIS_HOU EQU 44H ;44,45H
;計時單元
DIS_CNT EQU 2EH
SECOND EQU 46H
MINUT EQU 47H
HOUR EQU 48H
CNT50MS EQU 49H
CNT0_5S EQU 4AH
CNT_NUM EQU 10 ;10x50MS=0.5S
CNT_05 EQU 2 ;2x0.5=1S
; 計數初值 延時50MS,常數3CB0H
TIMING_H EQU 3CH
TIMING_L EQU 0B0H
SEC_M EQU 41H ;倒計時分鐘
DIS_BUF EQU 38H
SECOND1 EQU 43H
;3CH加熱時間
;3DH粉碎
;4CH溫度十位
;PROGRAM
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP PR_T0
ORG 000BH
JMP T0_INTR
ORG 0003H
LJMP PINT0
ORG 0013H
LJMP PINT1
ORG 0030H
MAIN: MOV SP,#60H
MOV R0,#30H
MOV R2,#32
CLEAR: MOV A,#00
MOV @R0,#00
INC R0
DJNZ R2,CLEAR ;緩沖區清0
MOV DIS_CNT,A
MOV TEMPER_NUM,A
MOV TEMPER_L,#00
MOV TEMPER_H,#00
ACALL INIT_1820 ;18B20初始化
MOV HOUR,#22H
MOV MINUT,#11H
MOV CNT50MS,#CNT_NUM
MOV CNT0_5S,#CNT_05
MOV TMOD,#01H
MOV TH0,#TIMING_H
MOV TL0,#TIMING_L
SETB EA
SETB ET0
SETB TR0
CLR IT0 ;外部中斷
CLR IT1
MOV IE,#85H
MOV IP,#00H
//CLR P1
LOOP: CALL SCAN_KEY
MOV A,R5
CJNE A,#08H,C1 ;按下鍵九跳轉到時鐘自動校正
LJMP FUN_0
C1: CJNE A,#00H,C2 ;按下鍵一跳轉到模式一
LJMP MOD1
C2: CJNE A,#01H,C3 ;按下鍵二跳轉到模式二
LJMP MOD2
C3: CJNE A,#02H,C4 ;按下鍵三進入自定義加熱、粉碎時間
LJMP JIAYI1
C4: NOP
CALL TEMPER
CALL DISPLY
LJMP LOOP
;/////////////////////////////////
;鍵盤程序
SCAN_KEY: MOV P2,#0EH
MOV A,P2
ANL A,#0EH
XRL A,#0EH
JZ NO_KEY
ACALL DELAY
MOV P2,#0EH
MOV A,P2
ANL A,#0EH
XRL A,#0EH
JZ NO_KEY
MOV R2,#11011111B
SCAN: MOV A,R2
MOV P2,A
MOV A,P2
ANL A,#00001110B
MOV R3,A
CJNE A,#0EH,KEY_PRSD
MOV A,R2
RL A
MOV R2,A
XRL A,#11111110B
JNZ SCAN
KEY_PRSD: MOV A,R2
ANL A,#11100000B
ORL A,R3
MOV R4,A
MOV R5,#00H
MOV DPTR,#KEY_TAB
CAL_VAL: MOV A,R5
MOVC A,@A+DPTR
XRL A,R4
JZ FIXED
INC R5
SJMP CAL_VAL
FIXED: MOV A,P2
ANL A,#0EH
XRL A,#0EH
JNZ FIXED
ACALL DELAY
MOV A,P2
ANL A,#0EH
XRL A,#0EH
JNZ FIXED
RET
NO_KEY: MOV R5,#0FFH
RET
KEY_TAB:
DB 66H,6AH,6CH,0A6H,0AAH,0ACH,0C6H,0CAH,0CCH
;/////////////////////////////////
;設置時間
FUN_0: MOV SET_MIN,47H;取時間
MOV SET_HOU,48H;
LP3: CALL SCAN_KEY
MOV A,R5
CJNE A,#01H,N1
LJMP MINP
N1: CJNE A,#02H,N2
LJMP HOUP
N2: CJNE A,#03H,N3
LJMP ENTER
N3: CALL DIS_SET
MOV A,DIS_CNT
JMP LP3
MINP: MOV A, SET_MIN; 分+1
ADD A,#01
DA A
MOV SET_MIN,A
MOV 47H,A
CJNE A,#60H, CONT1
MOV SET_MIN,#0
CONT1: CALL DIS_SET
JMP LP3
HOUP: MOV A, SET_HOU; 時+1
ADD A,#01
DA A
MOV SET_HOU,A
MOV 48H,A
CJNE A,#24H, CONT2
MOV SET_HOU,#0
CONT2: CALL DIS_SET
JMP LP3
ENTER: JMP C3
;///////////////////////////
;工作模式1
MOD1: MOV R0,#DIS_BUF ;加熱狀態
MOV R3,#08
CLR A
CLRBUF: MOV @R0,A
INC R0
DJNZ R3,CLRBUF ; 淸顯示緩沖區
ACALL INI_T0 ; T0初始化
SETB P3.7
CLR P3.6
CLR P3.5
CLR P3.4
MOV SEC_M,20H ;自定義時間
MOV SECOND1,#20 ;溢出20次為1秒
MOV A,4CH
CJNE A,#02H,LIPPP
LJMP ALARMZC ;調用顯示程序
LIPPP: LJMP REDDO
XYB: MOV R0,#DIS_BUF ;粉碎時間
MOV R3,#08
CLR A
CLRBUF1: MOV @R0,A
INC R0
DJNZ R3,CLRBUF1 ; 淸顯示緩沖區
ACALL INI_T0 ; T0初始化 ; T0初始化
SETB P3.5
CLR P3.4
CLR P3.7
CLR P3.6
MOV SEC_M,21H ;分值
MOV SECOND1,#20 ;溢出20次為1秒
LCALL REDDO1 ;調用顯示程序
XYB1: MOV R0,#DIS_BUF ;加熱時間
MOV R3,#08
CLR A
CLRBUF2: MOV @R0,A
INC R0
DJNZ R3,CLRBUF2 ; 淸顯示緩沖區
ACALL INI_T0 ; T0初始化
SETB P3.7
CLR P3.6
CLR P3.5
CLR P3.4
MOV SEC_M,20H ;分值
MOV SECOND1,#20 ;溢出20次為1秒
LCALL REDDO2 ;調用顯示程序
XYB2: MOV R0,#DIS_BUF ;粉碎時間
MOV R3,#08
CLR A
CLRBUF3: MOV @R0,A
INC R0
DJNZ R3,CLRBUF3 ; 淸顯示緩沖區
ACALL INI_T0 ; T0初始化 ; T0初始化
SETB P3.5
CLR P3.4
CLR P3.7
CLR P3.6
MOV SEC_M,21H ;分值
MOV SECOND1,#20 ;溢出20次為1秒
LCALL REDDO3 ;調用顯示程序
XYB3: MOV R0,#DIS_BUF ;加熱時間
MOV R3,#08
CLR A
CLRBUF4: MOV @R0,A
INC R0
DJNZ R3,CLRBUF4 ; 淸顯示緩沖區
ACALL INI_T0 ; T0初始化
SETB P3.7
CLR P3.6
CLR P3.5
CLR P3.4
MOV SEC_M,20H ;分值
MOV SECOND1,#20 ;溢出20次為1秒
LCALL REDDO4
XYB4: CLR P3.4 ;完成后聲光報警
CLR P3.5
CLR P3.6
CLR P3.7
LCALL ALARMZC
CALL DL10MS
LJMP LOOP
;///////////////////////////
;工作模式2
MOD2:
MOV R0,#DIS_BUF ;加熱模式
MOV R3,#08
CLR A
CCLRBUF: MOV @R0,A
INC R0
DJNZ R3,CCLRBUF ; 淸顯示緩沖區
ACALL INI_T0 ; T0初始化
SETB P3.7
CLR P3.6
CLR P3.5
CLR P3.4
MOV SEC_M,20H ;分值
MOV SECOND1,#20 ;溢出20次為1秒
LCALL RREDDO ;調用顯示程序
XXYB: MOV R0,#DIS_BUF ;粉碎模式
MOV R3,#08
CLR A
CCLRBUF1: MOV @R0,A
INC R0
DJNZ R3,CCLRBUF1 ; 淸顯示緩沖區
ACALL INI_T0 ; T0初始化 ; T0初始化
SETB P3.5
CLR P3.4
CLR P3.7
CLR P3.6
MOV SEC_M,21H ;分值
MOV SECOND1,#20 ;溢出20次為1秒
LCALL RREDDO1 ;調用顯示程序
XXYB1: MOV R0,#DIS_BUF ;加熱模式
MOV R3,#08
CLR A
CCLRBUF2: MOV @R0,A
INC R0
DJNZ R3,CCLRBUF2 ; 淸顯示緩沖區
ACALL INI_T0 ; T0初始化
SETB P3.7
CLR P3.6
CLR P3.5
CLR P3.4
MOV SEC_M,20H ;分值
MOV SECOND1,#20 ;溢出20次為1秒
LCALL RREDDO2 ;調用顯示程序
XXYB2: MOV R0,#DIS_BUF ;粉碎模式
MOV R3,#08
CLR A
CCLRBUF3: MOV @R0,A
INC R0
DJNZ R3,CCLRBUF3 ; 淸顯示緩沖區
ACALL INI_T0 ; T0初始化 ; T0初始化
SETB P3.5
CLR P3.4
CLR P3.7
CLR P3.6
MOV SEC_M,21H ;分值
MOV SECOND1,#20 ;溢出20次為1秒
LCALL RREDDO3 ;調用顯示程序
XXYB3: ;加熱模式
MOV R0,#DIS_BUF
MOV R3,#08
CLR A
CCLRBUF4: MOV @R0,A
INC R0
DJNZ R3,CCLRBUF4 ; 淸顯示緩沖區
ACALL INI_T0 ; T0初始化
SETB P3.7
CLR P3.6
CLR P3.5
CLR P3.4
MOV SEC_M,20H ;分值
MOV SECOND1,#20 ;溢出20次為1秒
LCALL RREDDO4
XXYB4: CLR P3.4 ;完成后聲光報警
CLR P3.5
CLR P3.6
CLR P3.7
LCALL ALARMZC
CALL DL10MS
LJMP LOOP
///////////////
;TIAOJIE時間加一 ;自定義加熱粉碎時間
JIAYI1: MOV 20H,#00H
MOV 21H,#00H
JIA1: LCALL SCAN_KEY
MOV A,R5
CJNE A,#00H,O1
INC 20H
MOV A,20H
MOV R2,#00H
LCALL DISSS
CJNE A,#09H,JIA1
LJMP JNINE
O1: CJNE A,#01H,O2
INC 21H
MOV A,21H
MOV R2,#01H
LCALL DISSS
CJNE A,#09H,JIA1
LJMP JNINE1
O2: CJNE A,#02H,JIA1
LJMP LOOP
JNINE:SUBB A,#09H
MOV 20H,A
LJMP JIA1
JNINE1:SUBB A,#09H
MOV 21H,A
LJMP JIA1
///////////////////////////////
;顯示子程序
;顯示緩沖區地址:(R0)
;位控(R2)
DIS: MOV DPTR, #SEG_TAB
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A ;輸出
NOP
NOP
MOV A,R2
MOV P1,A ;片選
NOP
NOP
RET
DL10MS: MOV R5,#10
DL1: MOV R6,#20
DL: NOP
NOP
NOP
DJNZ R6,DL
DJNZ R5,DL1
RET
SEG_TAB: DB 3FH ;0
DB 06H ;1
DB 5BH ;2
DB 4FH ;3
DB 66H ;4
DB 6DH ;5
DB 7DH ;6
DB 07H ;7
DB 7FH ;8
DB 6FH ;9
DB 77H ;A
DB 7CH ;B
DB 39H;C
DB 00H ;BLANK
;//////////////////////////////
; BCD分離子程序
; 待轉換的數放在(R2)中
; 轉換結果放在(R0)指出的單元中
BCDS: MOV A, R2
ANL A,#00001111B
MOV @R0,A
INC R0
MOV A,R2
ANL A,#11110000B
SWAP A
MOV @R0,A
RET
;////////display///////////////
DISPLY: ;MOV R2, SECOND; 取秒值
;MOV R0, #DIS_SEC
;CALL BCDS
MOV R2, MINUT; 取分值
MOV R0, #DIS_MIN
CALL BCDS
MOV R2, HOUR; 取時值
MOV R0, #DIS_HOU
CALL BCDS
MOV R2,TEMPER_NUM; 取溫度值
MOV R0,#T_DISBF
CALL BCDS
MOV R0,#T_DISBF
MOV R2,#11111101B ;溫度個位
CALL DIS
CALL DL10MS
INC R0
MOV R2,#11111100B ;溫度十位
CALL DIS
CALL DL10MS
MOV R0,#DIS_MIN
;MOV R2,#00100000B ;秒個位
;CALL DIS
;CALL DL10MS
;INC R0
;MOV R2,#00010000B ;秒十位
;CALL DIS
;CALL DL10MS
;INC R0
MOV R2,#11111011B ;分個位
CALL DIS
CALL DL10MS
INC R0
MOV R2,#11111010B ;分十位
CALL DIS
CALL DL10MS
INC R0
MOV R2,#11111001B ;時個位
CALL DIS
CALL DL10MS
INC R0
MOV R2,#11111000B ;時十位
CALL DIS
CALL DL10MS
RET
;////////////////////////////////// 0
TEMPER: ACALL RE_CONFIG
ACALL GET_TEMPER
CAll TEMPER_COV
RET
;初始化程序
INIT_1820: SETB DQ
NOP
CLR DQ ;主機發出延時540us的復位低脈沖
MOV R0,#36
LCALL DELAY
SETB DQ ;然后拉高數據線
NOP
NOP
MOV R0,#36
TSR2: JNB DQ,TSR3 ;等待DS18B20的回應
DJNZ R0,TSR2
LJMP TSR4; 延時
TSR3: SETB FLAG1; 置標志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1; 清標志位,表示DS1820不存在
LJMP BBQ
TSR5: MOV R0,#06BH; 200us
TSR6: DJNZ R0,TSR6; 復位成功!時序要求延時一段時間
BBQ: SETB DQ
RET
/////////////////////////////////////////////; 重新寫DS18B20暫存存儲器設定值
RE_CONFIG: JB FLAG1,RE_CONFIG1; 若DS18B20存在,轉RE_CONFIG1
RET
RE_CONFIG1:MOV A,#0CCH; 發SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH; 發寫暫存存儲器命令
LCALL WRITE_1820
MOV A,#00H; 不 TH(報警上限)中寫入00H
LCALL WRITE_1820
MOV A,#00H; TL(報警下限)中寫入00H
LCALL WRITE_1820
MOV A,#1FH; 選擇9位溫度分辨率
LCALL WRITE_1820
RET
///////////////////////////////////////; 讀出轉換后的溫度值
GET_TEMPER: SETB DQ; 定時入口
LCALL INIT_1820
JB FLAG1,TSS2
RET; 若DS18B20不存在則返回
TSS2: MOV A,#0CCH; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#44H; 發出溫度轉換命令
LCALL WRITE_1820
MOV R0,#50;等待A/D轉換結束,12位的話750us
LCALL DELAY
LCALL INIT_1820
MOV A,#0CCH; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH; 發出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200
MOV TEMPER_NUM,A; 將讀出的溫度數據保存
RET
//////////////////////////////////////////////////////; 讀DS18B20的程序,從DS18B20中讀出一個字節的數據
READ_1820: MOV R2,#8
RE1: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET
//////////////////////////////////////; 寫DS18B20的程序
WRITE_1820: MOV R2,#8
CLR C
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
////////////////////////////////////////////// ; 讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據
READ_18200: MOV R4,#2; 將溫度高位和低位從DS18B20中讀出
MOV R1,#36H; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:MOV R2,#8
RE01:CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
////////////////////////////////////////; 將從DS18B20中讀出的溫度數據進行轉換
TEMPER_COV: MOV A,#0F0H
ANL A,TEMPER_L; 舍去溫度低位中小數點后的四位溫度數值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1; 四舍五入去溫度值
INC TEMPER_NUM
TEMPER_COV1: MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A; 保存變換后的溫度數據
LCALL BIN_BCD
RET
/////////////////////////////////////////; 將16進制的溫度數據轉換成壓縮BCD碼
BIN_BCD: MOV DPTR,#TEMP_TAB
MOV A,TEMPER_NUM
MOVC A,@A+DPTR
MOV TEMPER_NUM,A
RET
TEMP_TAB: DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H
////////////////////////////////////////////////////////////////
; 延時子程序
;為保證DS18B20的嚴格I/O時序,需做較精確的延時
;在DS18B20操作中,用到的延時有15us、90us、270us、540us、750us
;因為這些延時均為15us的倍數,因此可編寫一個DELAY15(n)函數
DELAY:
LOOP0:MOV R1,#06H
LOOP1:DJNZ R1,LOOP1
DJNZ R0,LOOP0
RET
//////////////////////////////////////////////;500毫秒延時子程序
DELAY500:MOV R4,#248
DA222:MOV R5,#248
DJNZ R5,$
DJNZ R4,DA222
RET
;///////////////////////////////////////////
DIS_SET: MOV R2,MINUT; 調分設置值
MOV R0, #DIS_MIN
CALL BCDS
MOV R0, #DIS_MIN
MOV R2,#11111011B ;分個位
CALL DIS
CALL DL10MS
INC R0
MOV R2,#11111010B ;分十位
CALL DIS
CALL DL10MS
MOV R2,HOUR; 調時設置值
MOV R0, #DIS_HOU
CALL BCDS
MOV R0, #DIS_HOU
MOV R2,#11111001B ;時個位
CALL DIS
CALL DL10MS
INC R0
MOV R2,#11111000B ;時十位
CALL DIS
CALL DL10MS
MOV R2, SECOND; 取秒值
MOV R0, #DIS_SEC
CALL BCDS
MOV R0,#DIS_SEC
MOV R2,#1111101B ;秒個位
CALL DIS
CALL DL10MS
INC R0
MOV R2,#1111100B ;秒十位
CALL DIS
CALL DL10MS
CALL DL10MS
RET
;//////////////////
DLL: MOV R6,#01H
DELX: MOV R7,#0FFH
DELX0: NOP
NOP
NOP
DJNZ R7,DELX0
DJNZ R6,DELX0
RET
;中斷處理程序
;ORG 0200H
PR_T0: PUSH ACC
PUSH PSW
MOV TH0,#TIMING_H
MOV TL0,#TIMING_L
DJNZ CNT50MS,CONT
MOV CNT50MS,#CNT_NUM; 1S OVER, RELOAD COUNTER NUMBER
CPL P1.7
DJNZ CNT0_5S,CONT
MOV CNT0_5S,#CNT_05; 1秒到
MOV A,SECOND ;秒處理
ADD A,#01H
DA A
MOV SECOND, A
CJNE A, #60H,CONT ;秒處理結束
MOV SECOND,#00 ;分處理
MOV A,MINUT
ADD A,#01H
DA A
MOV MINUT, A
CJNE A, #60H,CONT ;分處理結束
MOV MINUT,#00
MOV A,HOUR
ADD A,#01H
DA A
MOV HOUR, A
CJNE A, #24H,CONT ;分處理結束
MOV HOUR,#00
CONT: POP PSW
POP ACC
RETI
/////////////////////////////////////////
ALARMZC: ;聲光報警
MOV R0,#10
LOOP5: MOV A,#06H
MOV P1,A
LCALL DL1S
LCALL DL1S
INC A
MOV P1,A
LCALL DL1S
LCALL DL1S
DJNZ R0, LOOP5
MOV P1,#00H
LJMP LOOP
/////////////////////////////////////////
DSPLY1: MOV R0,#20H
MOV R2,#00H
REDO:ACALL DISP
INC R2
MOV A, R2
INC R0
XRL A, #06H
JNZ REDO
RET
DSPLY2: MOV R0,#25H
MOV R2,#03H
REDO2:ACALL DISP
INC R2
MOV A, R2
INC R0
XRL A, #06H
JNZ REDO2
RET
DISP: MOV P1,R2
MOV DPTR,#LED_SEG
MOV A ,@R0
MOVC A ,@A+DPTR ;字形碼
MOV P0,A
LCALL DL1MS
RET
DL1MS: MOV R1,#200
DL2:NOP
NOP
NOP
DJNZ R1,DL2
RET
LED_SEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
/////////////////////////////////////
DL1S:MOV R1,#250
DDL1:MOV R2,#250
DOQ: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R2,DOQ
DJNZ R1,DDL1
RET
/////////////////////////////////////////////////倒計時加熱23H
LOOOP6:LCALL DL1S
MOV A,27H
CJNE A,#09H,GOON1
MOV 27H,#00H
MOV A,26H
CJNE A,#05H,GOON2
MOV 26H,#00H
INC 25H
RET
GOON1:INC 27H
RET
GOON2:INC 26H
RET
//========================
REDDO: MOV A,#01H
MOV R2,#00H
LCALL DISS ;顯示模式一
ACALL TIM_VAL
ACALL DISPLAYY ;顯示倒計時
//ACALL ALARM
LCALL DDXXWD ;YOU BUG顯示溫度
LJMP XYB
//LCALL JIARE
MOV A,SEC_M
CJNE A ,#00,REDDO
LJMP XYB
REDDO1: MOV A,#01H
MOV R2,#00H
LCALL DISS ;顯示模式一
ACALL TIM_VAL
ACALL DISPLAYY ;顯示倒計時
MOV A,SEC_M
CJNE A ,#00,REDDO1
LJMP XYB1
REDDO2: MOV A,#01H
MOV R2,#00H
LCALL DISS ;顯示模式一
ACALL TIM_VAL
ACALL DISPLAYY ;顯示倒計時
MOV A,SEC_M
CJNE A ,#00,REDDO2
LJMP XYB2
REDDO3: MOV A,#01H
MOV R2,#00H
LCALL DISS ;顯示模式一
ACALL TIM_VAL
ACALL DISPLAYY ;顯示倒計時
MOV A,SEC_M
CJNE A ,#00,REDDO3
LJMP XYB3
REDDO4: MOV A,#01H
MOV R2,#00H
LCALL DISS ;顯示模式一
ACALL TIM_VAL
ACALL DISPLAYY ;顯示倒計時
MOV A,SEC_M
CJNE A ,#00,REDDO4
LJMP XYB4
////////////////////////////////////
RREDDO: MOV A,#01H
MOV R2,#00H
LCALL DISS ;顯示模式一
ACALL TIM_VAL
ACALL DISPLAYY ;顯示倒計時
LCALL DDXXWD ;YOU BUG顯示溫度
MOV A,TEMPER_NUM
CJNE A,#27H,UU
LJMP XXYB
UU: MOV A,SEC_M
CJNE A ,#00,RREDDO
LJMP XXYB
RREDDO1: MOV A,#01H
MOV R2,#00H
LCALL DISS ;顯示模式一
ACALL TIM_VAL
ACALL DISPLAYY ;顯示倒計時
MOV A,SEC_M
CJNE A ,#00,RREDDO1
LJMP XXYB1
RREDDO2: MOV A,#01H
MOV R2,#00H
LCALL DISS ;顯示模式一
ACALL TIM_VAL
ACALL DISPLAYY ;顯示倒計時
LCALL DDXXWD ;YOU BUG顯示溫度
MOV A,TEMPER_NUM
CJNE A,#27H,UU1
UU1: MOV A,SEC_M
CJNE A ,#00,RREDDO2
LJMP XXYB2
RREDDO3: MOV A,#01H
MOV R2,#00H
LCALL DISS ;顯示模式一
ACALL TIM_VAL
ACALL DISPLAYY ;顯示倒計時
MOV A,SEC_M
CJNE A ,#00,RREDDO3
LJMP XXYB3
RREDDO4: MOV A,#01H
MOV R2,#00H
LCALL DISS ;顯示模式一
ACALL TIM_VAL
ACALL DISPLAYY ;顯示倒計時
LCALL DDXXWD ;YOU BUG顯示溫度
MOV A,TEMPER_NUM
CJNE A,#27H,UU2
LJMP XXYB4
UU2: MOV A,SEC_M
CJNE A ,#00,RREDDO4
LJMP XXYB4
//========================
;顯示1位子程序
;R2中存放顯示位置,A中存放顯示字符信息
DISS: MOV DPTR,#SEG_TAB
MOVC A,@A+DPTR
MOV P0,A
NOP
MOV A,R2
MOV P1,A
INC A
MOV R2,A
ACALL DEL10
MOV P0,#00
MOV P2,#00
ACALL DEL10
RET
DISSS: MOV DPTR,#SEG_TAB
MOVC A,@A+DPTR
MOV P0,A
NOP
MOV A,R2
MOV P1,A
INC A
MOV R2,A
ACALL DL1S
MOV P0,#00
MOV P2,#00
ACALL DL1S
RET
DISS1: MOV DPTR,#SEG_TAB
MOVC A,@A+DPTR
MOV P0,A
NOP
MOV A,R2
MOV P1,A
ACALL DEL10
ACALL DEL10
RET
//========================
//延時
DEL10: MOV R7,#20
DEL01: MOV R6,#20
DEL: NOP
NOP
NOP
DJNZ R6,DEL
DJNZ R7,DEL01
RET//========================
//顯示6位子程序
DISPLAYY: MOV R0,#DIS_BUF
MOV R2,#01H
DISPLYY1: MOV A,@R0
ACALL DISS
INC R0
MOV A,R2
XRL A,#04H
JNZ DISPLYY1
RET
//========================
//定時器初始化
INI_T0: MOV TMOD,#00000001B ;方式1,定時
MOV TH0,#3CH ;12MHz晶振,定時50ms,X=3CB0H
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB PT0
SETB TR0
RET
//========================分離高低4位
SBCD: MOV B,#10H
DIV AB
MOV @R0,A
INC R0
MOV @R0,B
RET
//========================秒值分離并存顯示緩沖區
TIM_VAL: MOV R0,#DIS_BUF
INC R0
MOV A,SEC_M
ACALL SBCD
RET
//========================中斷處理程序(計秒程序)
T0_INTR: PUSH ACC
PUSH PSW
MOV TH0,#3CH ;12MHz晶振,定時50ms,X=3CB0H
MOV TL0,#0B0H
DJNZ SECOND1,GOON
MOV SECOND1,#20
MOV A,#9AH
CLR C ;采用十進制數計秒
SUBB A,#01
ADD A,SEC_M
DA A
MOV SEC_M,A
CJNE A,#99H,GOON
MOV SEC_M,#00H
MOV A,#9AH
GOON: POP PSW
POP ACC
RETI
//========================
;7段碼顯示字模表
DDXXWD: LCALL TEMPER ;單獨顯示溫度
MOV R2,TEMPER_NUM; 取溫度值
MOV R0,#T_DISBF
CALL BCDS
MOV R0,#T_DISBF
MOV R2,#11111101B ;溫度個位
CALL DIS
CALL DL10MS
INC R0
MOV R2,#11111100B ;溫度十位
MOV 4CH,R2
CALL DIS
CALL DL10MS
RET
ALARM1: ;聲光報警
LOOP55:MOV R0,#20
MOV A,#06H
MOV P1,A
LCALL DL10MS
LCALL DL10MS
INC A
MOV P1,A
LCALL DL10MS
LCALL DL10MS
DJNZ R0, LOOP55
RET
DL100MS:MOV R5,#100
DEL1:MOV R6,#200
DEL0:NOP
NOP
NOP
DJNZ R6,DEL0
DJNZ R5,DEL1
RET
///////////////////////////////////////////////////////////中斷
//ORG 0600H
PINT0:PUSH ACC
PUSH PSW
SETB RS0
MOV R1,#05
CLR P3.4
CLR P3.5
CLR P3.6
CLR P3.7
MOV P1,#06H
LCALL DL100MS
LCALL DL100MS
MOV P1,#07H
LCALL DL100MS
LCALL DL100MS
POP PSW
POP ACC
RETI
PINT1:
PUSH ACC
PUSH PSW
SETB RS0
CLR P3.6
CLR P3.7
CLR P3.5
CLR P3.4 //LCALL ALARM1
POP PSW
POP ACC
RETI
END
|