📄 单片机程序.asm
字号:
TEMP_ZH DATA 24H ;实时温度值存放单元
TEMPL DATA 25H ;
TEMPH DATA 26H ;
TEMP_TH DATA 27H ;高温报警值存放单元
TEMP_TL DATA 28H ;低温报警值存放单元
TEMPHC DATA 29H ;
TEMPLC DATA 2AH
ZHFUBJ EQU 20H.1
flag1 equ 20H.0
date_line equ p3.7
;*************************************************************
org 00H
AJMP MAIN
MAIN: MOV SP,60H
clr F0
MOV TMOD,#20H ; 定时器1工作于8位自动重载模式,用于产生波特率
MOV TH1,#0F3H
MOV TL1,#0F3H ; 波特率4800
MOV SCON,#50H ; 设定串行口工作方式
MOV PCON,#80H ; 波特率倍增
clr ES ; 关闭串行中断
SETB TR1 ; 启动定时器1
MOV A,#00H
MOV R0,#20H
MOV R1,#0FH
CLR0: MOV @R0,A
INC R0
DJNZ R1,CLR0 ;20-2F清零
LCALL resb1820 ;设定18b20为12为精度
L1:jnb RI,L2
call JIESHOU
L2:jnb F0,L1
call send
ajmp L1
;***********************************************************
resb1820: CALL RESET
JNB flag1,WTHTL1 ;检测18b20是否存在,不存在转
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#7FH ;12位精确度
LCALL WRITE
CLR flag1 ;清存在标志
WTHTL1: RET
;**********************************************************
RESET:setb date_line
nop
clr date_line
mov r0,#6bh ;主机发出延时复位低脉冲
mov r1,#04h
tsr1: djnz r0,$
mov r0,#6bh
djnz r1,tsr1
setb date_line ;然后拉高数据线
nop
nop
nop
mov r0,#32h
tsr2: jnb date_line,tsr3 ;等待DS18B20回应
djnz r0,tsr2
jmp tsr4 ; 延时
tsr3: setb flag1 ; 置标志位,表示DS1820存在
jmp tsr5
tsr4: clr flag1 ; 清标志位,表示DS1820不存在
jmp tsr7
tsr5: mov r0,#06bh
tsr6: djnz r0,$ ; 时序要求延时一段时间
tsr7: setb date_line
ret
;**********************************************************
write: mov r2,#8 ;一共8位数据
CLR C
wr1:
clr date_line ;开始写入DS18B20总线要处于复位(低)状态
mov r3,#07
djnz r3,$ ;总线复位保持16微妙以上
rrc a ;把一个字节DATA 分成8个BIT环移给C
mov date_line,c ;写入一个BIT
mov r3,#3CH
djnz r3,$ ;等待100微妙
setb date_line ;重新释放总线
nop
djnz r2,wr1 ;写入下一个BIT
setb date_line
ret
;********************************************************
caiji:
CALL RESET
JNB FLAG1,TUICHU ;DS1820不存在
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#44H ; 发出温度转换命令
CALL WRITE
CALL RESET
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#0BEH ; 发出读温度命令
CALL WRITE
CALL READ
call CONVTEMP
Call DISPBCD
TUICHU: RET
;*************************************************************
read: mov r4,#4 ; 将温度低位、高位、TH、TL从DS18B20中读出
mov r1,#TEMPL ; 存入25H、26H、27H、28H
re00: mov r2,#8
re01: clr cy
setb date_line
nop
nop
clr date_line ;读前总线保持为低
nop
nop
nop
setb date_line ;开始读总线释放
mov r3,#09 ;延时18微妙
djnz r3,$
mov c,date_line ;从DS18B20总线读得一个BIT
mov r3,#3CH
djnz r3,$ ;等待100微妙
rrc a ;把读得的位值环移给A
djnz r2,re01 ;读下一个BIT
mov @r1,a
inc r1
djnz r4,re00
ret
;*****************************************************
; 处理温度 BCD 码子程序
;****************************************************
CONVTEMP: MOV A,TEMPH ;判温度是否零下
ANL A,#80H
JZ TEMPC1 ;温度零上转
CLR C
MOV A,TEMPL ;二进制数求补(双字节)
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
JMP TEMPC11
TEMPC1: SETB 20H.1 ;是正数,至正数标志
TEMPC11: MOV A,TEMPL
ANL A,#0FH ;乘0.0625
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ;TEMPLC LOW=小数部分 BCD
MOV A,TEMPL ;整数部分
ANL A,#0F0H ;取出高四位
SWAP A
MOV TEMPL,A
MOV A,TEMPH ;取出低四位
ANL A,#0FH
SWAP A
ORL A,TEMPL ;重新组合
MOV TEMP_ZH,A
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H
SWAP A
ORL A,TEMPHC ;TEMPHC LOW = 十位数 BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
SWAP A ;TEMPLC HI = 个位数 BCD
ORL A,TEMPLC
MOV TEMPLC,A
MOV A,R4
JZ TEMPC12
ANL A,#0FH
SWAP A
MOV R4,A
MOV A,TEMPHC ;TEMPHC HI = 百位数 BCD
ANL A,#0FH
ORL A,R4
MOV TEMPHC,A
TEMPC12: RET
;---------------------------------------------------------------
HEX2BCD1: ;原理是用除法原理如:255/100=2百位数字BCD码,余数55/10=5十位数字BCD码余数5个位数字BCD码
MOV B,#064H ;十六进制-> BCD
DIV AB ;B= A % 100
MOV R4,A ;R7 = 百位数
MOV A,#0AH
XCH A,B
DIV AB ;B = A % B
SWAP A
ORL A,B
RET
;-------------------------------------------------------------
; 小数部分码表
;-------------------------------------------------------------
TEMPDOTTAB:
DB 00H,00H,01H,01H,02H,03H,03H,04H
DB 05H,05H,06H,06H,07H,08H,08H,09H
;=====================================================
DISPBCD:
MOV A,TEMPLC
ANL A,#0FH
MOV 70H,A ;小数位
MOV 71H,#'.'
MOV A,TEMPLC
SWAP A
ANL A,#0FH
MOV 72H,A ;个位
MOV A,TEMPHC
ANL A,#0FH
MOV 73H,A ;十位
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 74H,A ;百位
JNB 20H.1,FU
MOV 75H,#'+' ;如果是正的温度,把“+”给75H
JMP STAR
FU: MOV 75H,#'-' ;如果是负的温度,把“-”给75
STAR: MOV A,74H
JZ F1
ADD A,#30H
MOV 74H,A
JMP M1
F1: MOV 74H,75H
MOV 75H,#' '
MOV A,73H
JZ F2
M1: mov a,73h
add a,#30H
mov 73h,a
JMP M2
F2: MOV 73H,74H
MOV 74H,#' '
M2: mov a,72h
add a,#30H
mov 72h,a
mov a,70h
add a,#30H
mov 70h,a
RET
;*********************************************************************
SEND: MOV R0,#75H
send1: mov a,@r0
mov sbuf,a
jnb TI,$
clr TI
dec r0
cjne r0,#6fh,send1
clr f0
ret
;**********************************************************************
JIESHOU:
clr ri
mov a,sbuf
M0: cjne a,#30h,s1
lcall C0
jmp M8
s1: cjne a,#31h,s2
lcall C1
jmp M8
s2: cjne a,#32h,s3
lcall C2
jmp M8
s3: cjne a,#33h,s4
lcall C3
jmp M8
s4: clr F0
M8: ret
;***********************************************************************
C0:setb p1.0
setb p1.1
clr F0
ret
C1:lcall caiji
setb F0
ret
C2:
setb p1.0
clr p1.1
ret
C3:
clr p1.0
setb p1.1
ret
C4:
setb p1.1
ret
C5:
clr p1.1
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -