📄 xl18b20.asm
字号:
TEMP_COMP:
SETB TR0 ;启动中断
MOV A,TEMP_TH
SUBB A,TEMP_ZH ;减数>被减数,则
JC CHULI1 ;借位标志位C=1,转
MOV A,TEMP_ZH
SUBB A,TEMP_TL ;减数>被减数,则
JC CHULI2 ;借位标志位C=1,转
JNB FLAG2,T_COMP1 ;FLAG2=0,显示标记字符
MOV 71H,#0AH ;熄灭符
MOV TEMP_BUFF_S,#T_B_S
LCALL DISP1
JMP T_COMP2
T_COMP1: MOV 71H,#00H
MOV TEMP_BUFF_S,#T_B_S
LCALL DISP1 ;显示"O"
T_COMP2: CLR RELAY ;继电器吸合
CLR TR0 ;关闭中断
RET
;---------------------------------------------
;超温处理
;---------------------------------------------
CHULI1:
SETB RELAY ;继电器关闭
JNB FLAG2,CHULI10
MOV 71H,#0AH ;熄灭符
MOV TEMP_BUFF_S,#T_B_S
LCALL DISP1
JMP CHULI11
CHULI10: MOV 71H,#0DH
MOV TEMP_BUFF_S,#T_B_S
LCALL DISP1 ;显示"H"
;CALL BEEP_BL ;蜂鸣器响
CHULI11:
CLR TR0 ;关闭中断
RET
;---------------------------------------------
;欠温处理
;---------------------------------------------
CHULI2: ;欠温处理
JNB FLAG2,CHULI20
MOV 71H,#0AH ;熄灭符
MOV TEMP_BUFF_S,#T_B_S
LCALL DISP1
JMP CHULI21
CHULI20: MOV 71H,#0CH
MOV TEMP_BUFF_S,#T_B_S
LCALL DISP1 ;显示"L"
;CALL BEEP_BL ;蜂鸣器响
CHULI21: CLR TR0 ;关闭中断
RET
;------------------------------------------------------------
;把 DS18B20 暂存器里的温度报警值拷贝到EEROM
;------------------------------------------------------------
WRITE_E2:
CALL RESET
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#48H ;温度报警值拷贝到EEROM
LCALL WRITE
RET
;--------------------------------------------------------------
;把 DS18B20 EEROM 里的温度报警值拷贝回暂存器
;-------------------------------------------------------------
READ_E2:
CALL RESET
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#0B8H ;温度报警值拷贝回暂存器
CALL WRITE
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 ;TEMPHC HI =符号位
MOV TEMPHC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;
TEMPC11: MOV A,TEMPHC
SWAP A
MOV TEMPHC,A
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 ;组合后的值存入TEMP_ZH
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,R7
JZ TEMPC12
ANL A,#0FH
SWAP A
MOV R7,A
MOV A,TEMPHC ;TEMPHC HI = 百位数 BCD
ANL A,#0FH
ORL A,R7
MOV TEMPHC,A
TEMPC12: RET
;-----------------------------------------------------------
; 小数部分码表
;-----------------------------------------------------------
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;===========================================================
;显示区 BCD 码温度值刷新子程序
;===========================================================
DISPBCD: MOV A,TEMPLC
ANL A,#0FH
MOV 75H,A ;小数位
MOV A,TEMPLC
SWAP A
ANL A,#0FH
MOV 74H,A ;个位
MOV A,TEMPHC
ANL A,#0FH
MOV 73H,A ;十位
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 72H,A ;百位
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#010H,DISPBCD0
SJMP DISPBCD2
DISPBCD0: MOV A,TEMPHC
ANL A,#0FH
JNZ DISPBCD2 ;十位数是0
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 72H,#0AH ;符号位不显示
MOV 73H,A ;十位数显示符号
DISPBCD2: RET
;***************************************************************
; 温度显示子程序
;***************************************************************
;显示数据在70H - 73H 单元内,用4位共阳数码管显示,P0口输出段码数据,
;P2 口作扫描控制,每个 LED 数码管亮 2MS 时间再逐位循环。
;**********************************************************
; 数码管显示子程序
;**********************************************************
DISP1: ;显示子程序开始
MOV 70H,#0AH
MOV DIS_INDEX,#0
DISPLAY_START: ;显示一位开始
CALL OFF_ALL ;调用子程序关闭所有数码管的显示
MOV DIS_DATA,#00 ; 6个数目管的公共显示数据写0关闭
MOV A, DIS_INDEX
DIS0_B: CJNE A,#0X00,DIS1_B
CLR DIS_1
JMP MOV_DAT
DIS1_B:
CJNE A,#0X01,DIS2_B
CLR DIS_2
JMP MOV_DAT
DIS2_B:
CJNE A,#0X02,DIS3_B
CLR DIS_3
JMP MOV_DAT
DIS3_B:
CJNE A,#0X03,DIS4_B
CLR DIS_4
JMP MOV_DAT
DIS4_B:
CJNE A,#0X04,DIS5_B
CLR DIS_5
JMP MOV_DAT
DIS5_B:
CJNE A,#0X05,DIS_END
CLR DIS_6
JMP MOV_DAT ;以上程序根据现在的显示位数进行条件分支,分别打开相应的显示使能位
MOV_DAT:
MOV A, DIS_INDEX
MOV R1,TEMP_BUFF_S
ADD A,R1
MOV R0,A
MOV A,@R0 ;获得目前的显示位所对应自己的缓冲数据
MOV DPTR,#DIS_TAB
MOVC A,@A+DPTR
ANL A,#0XDF
MOV B,A
MOV A,DIS_INDEX
CJNE A,#04,RE_DIS
MOV A,B
ORL A,#0X20
JMP RE_DIS1
RE_DIS:
MOV A,B
RE_DIS1: MOV DIS_DATA,A ;将目前的显示数据经过查表获得对应的数码管段码
CALL T1MS
INC DIS_INDEX ;显示位序加一,指向下一位
MOV A,DIS_INDEX
CJNE A,#6,DISPLAY_START ;以上两句判断是否循环显示够6位是的话返回到被调用的位置 否则进行下一次循环
DIS_END:
RET ;
OFF_ALL: ;关闭所有显示位的子程序
SETB DIS_1
SETB DIS_2
SETB DIS_3
SETB DIS_4
SETB DIS_5
SETB DIS_6
RET
T1MS: mov r5,#00h ;延时子程序
tt: mov r6,#9
djnz r6,$
djnz r5,tt
ret
DIS_TAB: ;0-9 所对应的数码管段码 最后一个00 是总关闭显示
DB 0x7f,0x44,0xbd,0xf5,0xe6,0xf3,0xfb,0x65,0xff,0xf7,0x00,0x80,0X1A,0XCE
;单字节十六进制转 BCD
;******************************************************
HEX2BCD1: MOV B,#064H
DIV AB
MOV R7,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
;===============================================
;报警值 TH、TL 数据转换
;===============================================
ALERT_TL:
MOV 75H,#0CH
MOV 76H,#0BH
MOV A,TEMP_TL
MOV R0,#77H
MOV B,#064H
DIV AB
CJNE A,#01H,ALERT_TL1
MOV @R0,A
JMP ALERT_TL2
ALERT_TL1: MOV A,#0BH ;显示“-”
MOV @R0,A
ALERT_TL2: MOV A,#0AH
XCH A,B
DIV AB
INC R0
MOV @R0,A
MOV 7EH,A
INC R0
MOV @R0,B
MOV 7DH,B
RET
;-----------------------------------------------
ALERT_TH:
MOV 75H,#0DH
MOV 76H,#0BH
MOV A,TEMP_TH
MOV R0,#77H
MOV B,#064H
DIV AB
CJNE A,#01H,ALERT_TH1
MOV @R0,A
JMP ALERT_TH2
ALERT_TH1: MOV A,#0BH ;显示“-”
MOV @R0,A
ALERT_TH2: MOV A,#0AH
XCH A,B
DIV AB
INC R0
MOV @R0,A
MOV 7EH,A
INC R0
MOV @R0,B
MOV 7DH,B
RET
;===============================================
;报警值显示子程序
;===============================================
ALERT_PLAY:
MOV TEMP_BUFF_S,#T_B_A
CALL DISP1
RET
;===============================================
;蜂鸣器响一声子程序
;P3.7=0,蜂鸣器响
;===============================================
BEEP_BL:
MOV R6,#100
BL2: CALL DEX1
CPL BEEP ;对 P3.7 取反
DJNZ R6,BL2
MOV R5,#10
CALL DELAY2
RET
DEX1: MOV R7,#180
DE2: NOP
DJNZ R7,DE2
RET
DELAY2: ;(R5)*延时10MS
MOV R6,#200
DEL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
DJNZ R5,DELAY2
RET
;==================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -