51单片机DS18B20温度控制报警程序(可设置温控范围) 作者: 时间:2016-11-30 来源:网络 加入技术交流群 扫码加入和技术大咖面对面交流海量资料库查询 收藏 ;*****************************************************; 处理温度 BCD 码子程序;****************************************************CONVTEMP: MOV A,TEMPH ;判温度是否零下ANL A,#80HJZ TEMPC1 ;温度零上转CLR CMOV A,TEMPL ;二进制数求补(双字节)CPL A ;取反加1ADD A,#01HMOV TEMPL,AMOV A,TEMPH ;-CPL AADDC A,#00HMOV TEMPH,A ;TEMPHC HI =符号位MOV TEMPHC,#0BHSJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH ;TEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;乘0.0625MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=小数部分 BCDMOV A,TEMPL ;整数部分ANL A,#0F0HSWAP AMOV TEMPL,AMOV A,TEMPHANL A,#0FHSWAP AORL A,TEMPLMOV TEMP_ZH,A ;组合后的值存入TEMP_ZHLCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHC ;TEMPHC LOW = 十位数 BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI = 个位数 BCDORL A,TEMPLCMOV TEMPLC,AMOV A,R7JZ TEMPC12ANL A,#0FHSWAP AMOV R7,AMOV A,TEMPHC ;TEMPHC HI = 百位数 BCDANL A,#0FHORL A,R7MOV TEMPHC,ATEMPC12: RET;-----------------------------------------------------------; 小数部分码表;-----------------------------------------------------------TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06HDB 06H,07H,08H,08H,09H,09H;===========================================================;显示区 BCD 码温度值刷新子程序;===========================================================DISPBCD: MOV A,TEMPLCANL A,#0FHMOV 70H,A ;小数位MOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,A ;个位MOV A,TEMPHCANL A,#0FHMOV 72H,A ;十位MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,A ;百位MOV A,TEMPHCANL A,#0F0HCJNE A,#010H,DISPBCD0SJMP DISPBCD2DISPBCD0: MOV A,TEMPHCANL A,#0FHJNZ DISPBCD2 ;十位数是0MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,#0AH ;符号位不显示MOV 72H,A ;十位数显示符号DISPBCD2: RET;***************************************************************; 温度显示子程序;***************************************************************;显示数据在70H - 73H 单元内,用4位共阳数码管显示,P0口输出段码数据,;P0 口作扫描控制,每个 LED 数码管亮 2MS 时间再逐位循环。DISP1: MOV R1,#70H ;指向显示数据首址MOV R5,#7FH ;扫描控制字初值PLAY: ; MOV P0,#0FFHMOV A,R5 ;扫描字放入AMOV P0,ASETB P2.7CLR P2.7MOV A,@R1 ;取显示数据到AMOV DPTR,#TAB ;取段码表地址MOVC A,@A+DPTR ;查显示数据对应段码MOV P0,A ;段码放入P0口SETB P2.6CLR P2.6MOV A,R5JB ACC.6,LOOP5 ;小数点处理SETB P0.7SETB P2.6CLR P2.6LOOP5: LCALL DL_MS ;显示2MSINC R1 ;指向下一个地址MOV A,R5 ;放回 R5 内JNB ACC.3,ENDOUT ;ACC.3=0时一次显示结束RR A ;A 中数据循环左移MOV R5,A ;放入 R5 中AJMP PLAY ;跳回 PLAY 循环ENDOUT: ; MOV P0,#0FFH ;一次显示结束,P0口复位; MOV P2,#0FFH ;P2口复位RETTAB:;定义段码对应 0 1 2 3 4 5 6 7 8 9 - L H DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,40H,38H,76HDL_MS: MOV R6,#0AH ;2MS延时程序,LED 显示程序用DL1: MOV R7,#64HDL2: DJNZ R7,DL2DJNZ R6,DL1MOV P0,#00H ;消隐SETB P2.6CLR P2.6RET;******************************************************;单字节十六进制转 BCD;******************************************************HEX2BCD1: MOV B,#064H DIV AB MOV R7,A MOV A,#0AHXCH A,BDIV AB SWAP AORL A,BRET;===============================================;报警值 TH、TL 数据转换;===============================================ALERT_TL:MOV 79H,#0CHMOV 78H,#0BHMOV A,TEMP_TLMOV R0,#77HMOV B,#064HDIV ABCJNE A,#01H,ALERT_TL1MOV @R0,AJMP ALERT_TL2ALERT_TL1: MOV A,#0BH ;显示“-”MOV @R0,AALERT_TL2: MOV A,#0AHXCH A,BDIV ABDEC R0MOV @R0,AMOV 7DH,ADEC R0MOV @R0,BMOV 7EH,BRET;-----------------------------------------------ALERT_TH:MOV 79H,#0DHMOV 78H,#0BHMOV A,TEMP_THMOV R0,#77HMOV B,#064HDIV ABCJNE A,#01H,ALERT_TH1MOV @R0,AJMP ALERT_TH2ALERT_TH1: MOV A,#0BH ;显示“-”MOV @R0,AALERT_TH2: MOV A,#0AHXCH A,BDIV ABDEC R0MOV @R0,AMOV 7DH,ADEC R0MOV @R0,BMOV 7EH,BRET;===============================================;报警值显示子程序;===============================================ALERT_PLAY:MOV R1,#75H ;指向显示数据首址MOV R5,#7FH ;扫描控制字初值A_PLAY: ; MOV P0,#0FFHMOV A,R5 ;扫描字放入AMOV P0,ASETB P2.7CLR P2.7MOV A,@R1 ;取显示数据到AMOV DPTR,#ALERT_TAB ;取段码表地址MOVC A,@A+DPTR ;查显示数据对应段码MOV P0,A ;段码放入P0口SETB P2.6CLR P2.6LCALL DL_MS1 ;显示2MSINC R1 ;指向下一个地址MOV A,R5JNB ACC.3,ENDOUT1RR A ;A 中数据循环左移MOV R5,A ;放入 R5 中AJMP A_PLAY ;跳回 PLAY 循环ENDOUT1: ; MOV P0,#0FFH ;一次显示结束,P0口复位; MOV P2,#0FFH ;P2口复位RETALERT_TAB:;定义段码对应 0 1 2 3 4 5 6 7 8 9 - L H DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,40H,38H,76HDL_MS1: MOV R6,#0AH ;2MS延时程序,LED 显示程序用ADL1: MOV R7,#64HADL2: DJNZ R7,ADL2DJNZ R6,ADL1MOV P0,#00H ;消隐SETB P2.6CLR P2.6RET;===============================================;蜂鸣器响一声子程序;P3.7=0,蜂鸣器响;===============================================BEEP_BL:MOV R6,#100BL2: CALL DEX1CPL BEEP ;对 beep 取反DJNZ R6,BL2MOV R5,#10CALL DELAYRETDEX1: MOV R7,#180DE2: NOPDJNZ R7,DE2RETDELAY: ;(R5)*延时10MSMOV R6,#50DEL1: MOV R7,#100DJNZ R7,$DJNZ R6,DEL1DJNZ R5,DELAYRET;==================================================END 上一页 1 2 3 下一页
评论