📄 数字温度计完整源代码.txt
字号:
源程序
TemperL EQU 30H
TemperH EQU TemperL+1
TemperDotL EQU TemperH+1
TemperDotH equ TemperDotL+1
TemperZer equ TemperDotH+1
show equ 40h
s1 bit p0.1
s2 bit p0.2
s3 bit p0.3
bell bit p0.0
DQ BIT P3.2
Ds18b20F BIT 00H
SkipDs18b20 equ 0cch
StartDs18b20 equ 44h
ReadDs equ 0beh
KEY1 BIT P3.3 ;设置上限温度键
KEY2 BIT P3.2 ;设置下限温度键
KEY3 BIT P3.5 ;加一键
KEY4 BIT P3.4 ;减一键
ST EQU 25H ;状态
TEMPB1 EQU 26H
TEMPB2 EQU 27H
SXH EQU 28H ;上限温度
SXL EQU 29H
XXH EQU 2AH ;下限温度
XXL EQU 2BH
SJH EQU 2CH ;实际温度
SJL EQU 2DH
ORG 0000H
JMP MAIN
ORG 0100H
MAIN:
NOP
NOP
NOP
MOV SP,#58H
MOV ST,#00H
MAIN_2:
CALL GETKEY ;判键
CJNE A,#00H,MAIN_1
SJMP MAIN_2
MAIN_1: MOV B,A
MOV R6,#20H ;键盘去抖动
CALL DELAY
CALL GETKEY
CJNE A,B,MAIN_13
CJNE A,#01H,MAIN_4 ;设置上限温度键
MOV A,ST
CJNE A,#00H,MAIN_20
MOV R6,SXH ;显示上限温度
MOV R7,SXL
CALL TOSHOW
MOV ST,#01H
JMP MAIN_3
MAIN_20:CJNE A,#01H,MAIN_13
MOV R6,SJH ;显示实际温度
MOV R7,SJL
CALL TOSHOW
MOV ST,#00H
MAIN_13:JMP MAIN_3
MAIN_4: CJNE A,#02H,MAIN_5 ;设置下限温度键
MOV A,ST
CJNE A,#00H,MAIN_22
MOV R6,XXH ;显示下限温度
MOV R7,XXL
CALL TOSHOW
MOV ST,#02H
JMP MAIN_3
MAIN_22:CJNE A,#02H,MAIN_13
MOV R6,SJH ;显示实际温度
MOV R7,SJL
CALL TOSHOW
MOV ST,#00H
JMP MAIN_3
MAIN_5: CJNE A,#03H,MAIN_6
MOV A,ST
CJNE A,#01H,MAIN_23
MOV A,SXL ;上限增加一度
ADD A,#01H
MOV SXL,A
MOV A,SXH
ADDC A,#00H
MOV SXH,A
MOV R6,SXH
MOV R7,SXL
CALL TOSHOW
JMP MAIN_3
MAIN_23:CJNE A,#02H,MAIN_13
MOV A,XXL ;下限增加一度
ADD A,#01H
MOV XXL,A
MOV A,XXH
ADDC A,#00H
MOV XXH,A
MOV R6,XXH
MOV R7,XXL
CALL TOSHOW
MOV R6,XXH
MOV R7,XXL
CALL TOSHOW
JMP MAIN_3
MAIN_6: CJNE A,#04H,MAIN_3
MOV A,ST
CJNE A,#01H,MAIN_24
CLR C
MOV A,SXL ;上限减少一度
SUBB A,#01H
MOV SXL,A
MOV A,SXH
SUBB A,#00H
MOV SXH,A
MOV R6,SXH
MOV R7,SXL
CALL TOSHOW
JMP MAIN_3
MAIN_24:CJNE A,#02H,MAIN_3
CLR C
MOV A,XXL ;下限减少一度
SUBB A,#01H
MOV XXL,A
MOV A,XXH
SUBB A,#00H
MOV XXH,A
MOV R6,XXH
MOV R7,XXL
CALL TOSHOW
JMP MAIN_3
MAIN_3: CALL SHOWBUFF
CALL GetTemper
CALL TemperDo
MOV TemperDotL,SJL
MOV TemperDotH,SJH
MOV A,SJH
CJNE A,SXH,MAIN_30
MOV A,SJL
CJNE A,SXL,MAIN_30 ;超上限
MAIN_31:SETB BELL ;报警
JMP MAIN_32
MAIN_30:JNC MAIN_31
JMP MAIN_32
MAIN_32:
MOV A,XXH
CJNE A,SJH,MAIN_33
MOV A,XXL
CJNE A,SJL,MAIN_33 ;超下限
MAIN_34:SETB BELL ;报警
JMP MAIN_2
MAIN_33:JNC MAIN_34
JMP MAIN_2
SHOWBUFF:
MOV A,SHOW ;点亮百位
MOV DPTR,#GYTAB
MOVC A,@A+DPTR
MOV P1,A
SETB S1
CLR S2
CLR S3
MOV A,SHOW+1 ;点亮十位
MOV DPTR,#GYTAB
MOVC A,@A+DPTR
MOV P1,A
SETB S2
CLR S1
CLR S3
MOV A,SHOW+2 ;点亮个位
MOV DPTR,#GYTAB
MOVC A,@A+DPTR
MOV P1,A
SETB S3
CLR S1
CLR S2
RET
TOSHOW:
CALL HB2 ;十六进制变十进制并拆开放入显示缓冲区
MOV A,R4
CALL GETHALF
MOV SHOW,TEMPB1
MOV A,R5
CALL GETHALF
MOV SHOW+1,TEMPB2
MOV SHOW+2,TEMPB1
RET
GETHALF: ;拆开A 高位在temp2内,低位在temp1内
MOV B,A
ANL A,#0F0H
SWAP A
MOV TEMPB2,A
MOV A,B
ANL A,#0FH
MOV TEMPB1,A
RET
GETKEY: ;判键程序
JB KEY1,GET_1
MOV A,#01H
JMP GET_5
GET_1: JB KEY2,GET_2
MOV A,#02H
JMP GET_5
GET_2: JB KEY3,GET_3
MOV A,#03H
JMP GET_5
GET_3: JB KEY4,GET_4
MOV A,#04H
JMP GET_5
GET_4: MOV A,#00H
GET_5: RET
HB2:
CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到 CY 中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
GetTemper:
;***************************
SETB DQ ; 定时入口
call InitDs18b20
JB Ds18b20F,S22
ret
S22:call Delay64uS
MOV A,#SkipDs18b20 ; 跳过ROM匹配------0CC
call WriteByteDs1820
MOV A,#StartDs18b20 ; 发出温度转换命令
call WriteByteDs1820
call DELAY1s
call InitDs18b20
JB Ds18b20F,ABC
ret
ABC:call Delay64uS
MOV A,#SkipDs18b20 ; 跳过ROM匹配
call WriteByteDs1820
MOV A,#ReadDs ; 发出读温度命令
call WriteByteDs1820
call ReadDs18b20 ;READ_1820
RET
;------------------读DS18B20的程序,从DS18B20中读出一个字节的数据
ReadByteDs1820:
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的程序
WriteByteDs1820:
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中读出两个字节的温度数据
ReadDs18b20:
Call ReadByteDs1820
MOV TemperL,A
Call ReadByteDs1820
MOV TemperH,A
RET
;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:
JB Ds18b20F,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 发SKIP ROM命令
call WriteByteDs1820
MOV A,#4EH ; 发写暂存存储器命令
call WriteByteDs1820
MOV A,#00H ; TH(报警上限)中写入00H
;call WriteByteDs1820
MOV A,#00H ; TL(报警下限)中写入00H
;call WriteByteDs1820
MOV A,#7FH ; 选择12位温度分辨率
call WriteByteDs1820
RET
;------------------延时子程序
DELAY:
MOV R7,#00H
Dey1:
DJNZ R7,Dey1
RET
Delay500uS:
MOV R6,#00H
DJNZ R6,$
RET
Delay64uS:
MOV R6,#20H
DJNZ R6,$
RET
;-------------------将从DS18B20中读出的温度数据进行转换
;2^3,2^2,2^1,2^0,2^-1,2^-2,2^-3,2^4 ;L
;SSSSSSS2^6,2^5,2^4;H
;************************
TemperDo:
JB Ds18b20F,Do1
ret
do1:
clr a
mov TemperDotL,a
mov TemperDotH,a
mov TemperZer,a
mov a,TemperH
jnb acc.7,ZhenData ;>0
;<0
mov a,TemperL
cpl a
add a,#01 ;cpl+1
mov TemperL,a
mov a,TemperH
cpl a
addc a,#0
mov TemperH,a
ZhenData:
call FenLiDot
call FenLiZer
ret
;-------------------DS18B20初始化程序
InitDs18b20:
CLR DQ
MOV R7,#80h
DJNZ R7,$ ; 延时
SETB DQ
MOV R7,#25h ;
DJNZ R7,$
SETB Ds18b20F ; 置标志位,表示DS1820存在
JNB DQ,TSR5
CLR Ds18b20F ; 清标志位,表示DS1820不存在
Jmp TSR7
TSR5: MOV R7,#06BH ;200US
DJNZ R7,$ ; 延时
TSR7: SETB DQ
RET
;***************
Delay1S:
mov b,#130
Dela11:
push b
pop b
djnz b,Dela11
ret
;****************************
FenLiDot:
mov a,TemperL
jnb acc.3,Fen1 ;2^-1
mov r5,#low(5000)
mov r4,#High(5000)
call Add2
Fen1: jnb acc.2,Fen2 ;2^-2
mov r5,#low(2500)
mov r4,#High(2500)
call Add2
Fen2: jnb acc.1,Fen3 ;2^-3
mov r5,#low(1250)
mov r4,#High(1250)
call Add2
Fen3: jnb acc.0,Fen4 ;2^-4
mov r5,#low(625)
mov r4,#High(625)
call Add2
Fen4: ret
;****************
;TemperDorHL+r4r5=r2r3
;*****************
Add2:
push a
mov a,TemperDotL
add a,r5
mov TemperDotL,a
mov a,TemperDotH
addc a,r4
mov TemperDotH,a
pop a
ret
;**********************
FenLiZer:
mov a,TemperL
jnb acc.4,Fz1
mov a,#01
add a,TemperZer
mov TemperZer,a
Fz1: mov a,TemperL
jnb acc.5,Fz2
mov a,#02
add a,TemperZer
mov TemperZer,a
Fz2: mov a,TemperL
jnb acc.6,Fz3
mov a,#04
add a,TemperZer
mov TemperZer,a
Fz3: mov a,TemperL
jnb acc.7,Fz4
mov a,#08
add a,TemperZer
mov TemperZer,a
Fz4: mov a,TemperH
jnb acc.0,Fz5
mov a,#16
add a,TemperZer
mov TemperZer,a
Fz5: mov a,TemperH
jnb acc.1,Fz6
mov a,#32
add a,TemperZer
mov TemperZer,a
Fz6: mov a,TemperH
jnb acc.2,Fz7
mov a,#64
add a,TemperZer
mov TemperZer,a
Fz7: ret
GYTAB: DB 0C0H, 0F9H, 0A4H, 0B0H ;00-03H 0 1 2 3 共阳
DB 99H, 92H, 82H, 0F8H ;04-07H 4 5 6 7
DB 80H, 90H, 0FFH ;08-09H 8 9
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -