有没有 大神帮我看一下这个程序里的时钟为什么不会走啊
;定义区
;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
|