51单片机DS18B20温度控制报警程序(可设置温控范围)
1、GND
2、DQ
3、VCC
DQ → P1.7
K1 → P3.2
K2 → P3.4
K3 → P3.6
K4 → P3.7
温度显示用四位数码管,当温度>=100度时,第四位才显示。
第五位数码管显示状态符号。
开机检测 DS18B20 状态:
DS18B20正常显示:
O 18.8 ← 显示实时温度和加热标记“O”
DS18B20不正常显示:
黑屏、蜂鸣器一直响。
这时你要检查DS18B20是否连接好、接对,否则要更换一个新的 DS18B20 芯片。
程序在整个运行过程中,始终对 DS18B20 进行检测。
你可以将 DS18B20 从 51hei-5 拔掉,检测一下此功能。
一、查看温度报警值:
K1 → 进入查看温度报警值 TL 状态:
L--20
TL: 20 低位报警值
K1 → 进入查看温度报警值 TH 状态:
H--28
TH: 28 高位报警值
K1 → 退出查看温度报警值状态。
二、设定温度报警值:
1、K3 → 进入设定温度报警值 TL 状态:
L--20
2、K3 → 进入设定温度报警值 TH 状态:
H--28
3、K3 → 返回
4、设定过程: K1 →加键 (UP), K2 →减键 (DOWN),可快速调。
将设定的温度报警值自动存入 DS18B20 的 EEROM 中,可永久保存。
每次开机时自动从 DS18B20 的 EEROM 读出温度报警值。
三、报警状态的显示:
1、当实际温度大于 TH 的设定值时,
H 38.8 H → 闪动
关闭继电器,表示超温。
2、当实际温度小于 TL 的设定值时,
L 18.8 L → 闪动
表示加热部分出现故障。
3、当实际温度小于 TH 的设定值时,继电器吸合,开始加热。
加热标记为“O”
四、其它功能
1、以闪动方式显示标记符 “ H”、“ L”、“O”。
2、实时温度百位数为 “0”时,不显示。
3、报警温度值百位数为 “0”时,显示“-”。
完整的程序代码下载地址:http://www.51hei.com/f/DS18B20温度控制LED显示_asm.rar
;*****************************************************************;* 标题: 51Hei单片机开发系统演示程序 - DS18B20温度控制数码管显示 *;* 晶振: 12M *;* 跳线设置:J5的12脚用跳线帽短接,J5的第3脚用杜邦线连接到顶部P1.0扩展,其他默认 * *;* 网站: http://www.51HEI.com *;******************************************************************;* 描述: *;* DS18B20温度控制数码管显示 *;* 1、K3 → 进入设定温度报警值 TL 状态: *;* L--20 *;* 2、K3 → 进入设定温度报警值 TH 状态: *;* H--28 *;* 3、K3 → 返回 *;* 4、设定过程: K1 →加键 (UP), K2 →减键 (DOWN),可快速调。 *;* *;********************************************************************************TIMER_L DATA 23HTIMER_H DATA 24HTIMER_COUN DATA 25HTEMPL DATA 26HTEMPH DATA 27HTEMP_TH DATA 28HTEMP_TL DATA 29HTEMPHC DATA 2AHTEMPLC DATA 2BHTEMP_ZH DATA 2CHBEEP EQU P1.0DATA_LINE EQU P1.7RELAY EQU P2.2FLAG1 EQU 20H.0FLAG2 EQU 20H.1;-------------------------------------------------K1 EQU P3.2K2 EQU P3.4K3 EQU P3.6K4 EQU P3.7;=================================================ORG 0000HJMP MAINORG 000BHAJMP INT_T0;--------------------------------------------------MAIN: MOV SP,#30H;以下5行的功能是关闭8*8点阵的输出,也就是把所有的行置0,这样不管列为任何电平点阵都不会亮了.MOV R2,#8 ;输出数据8位 hei: CLR P2.4 ;拉低SCL,以便下次拉高便可产生上升沿CLR P2.5 ;数据先送入74hc164,等待clk上升沿的到来SETB P2.4 ;低电平到高电平边沿触发到来,并行数据输出至164的Q0-Q7DJNZ R2,hei ;判断输出完毕了没有MOV TMOD,#01H ;T0,方式1MOV TIMER_L,#00H ;50ms定时值MOV TIMER_H,#4CHMOV TIMER_COUN,#00H ;中断计数MOV IE,#82H ;EA=1,ET0=1LCALL READ_E2;LCALL RE_18B20MOV 20H,#00HSETB BEEPSETB RELAYMOV 7FH,#0AH ;熄灭符CALL RESET ;复位与检测DS18B20JNB FLAG1,MAIN1 ;FLAG1=0,DS18B20不存在JMP STARTMAIN1: CALL RESETJB FLAG1,STARTLCALL BEEP_BL ;DS18B20错误,报警JMP MAIN1START:MOV A,#0CCH ; 跳过ROM匹配CALL WRITEMOV A,#044H ; 发出温度转换命令CALL WRITECALL RESETMOV A,#0CCH ; 跳过ROM匹配CALL WRITEMOV A,#0BEH ; 发出读温度命令CALL WRITECALL READ ;读温度数据CALL CONVTEMPCALL DISPBCDCALL DISP1CALL SCANKEYLCALL TEMP_COMPJMP MAIN1;=====================================================;DS18B20 复位与检测子程序;FLAG1=1 OK, FLAG1=0 ERROR;======================================================RESET:SETB DATA_LINENOPCLR DATA_LINEMOV R0,#64H ;主机发出延时600微秒的复位低脉冲MOV R1,#03HRESET1: DJNZ R0,$MOV R0,#64HDJNZ R1,RESET1SETB DATA_LINE ;然后拉高数据线NOPMOV R0,#25HRESET2: JNB DATA_LINE,RESET3 ;等待DS18B20回应DJNZ R0,RESET2JMP RESET4 ; 延时RESET3: SETB FLAG1 ; 置标志位,表示DS1820存在JMP RESET5RESET4: CLR FLAG1 ; 清标志位,表示DS1820不存在JMP RESET6RESET5: MOV R0,#064HDJNZ R0,$ ; 时序要求延时一段时间RESET6: SETB DATA_LINERET;===========================================================;;===========================================================WRITE: MOV R2,#8 ;一共8位数据CLR CYWR1:CLR DATA_LINE ;开始写入DS18B20总线要处于复位(低)状态MOV R3,#09DJNZ R3,$ ;总线复位保持18微妙以上RRC A ;把一个字节DATA 分成8个BIT环移给CMOV DATA_LINE,C ;写入一个BITMOV R3,#23DJNZ R3,$ ;等待46微妙SETB DATA_LINE ;重新释放总线NOPDJNZ R2,WR1 ;写入下一个BITSETB DATA_LINERET;============================================================;从DS18B20中读出温度低位、高位和报警值TH、TL;存入26H、27H、28H、29H;============================================================READ: MOV R4,#4 ; 将温度高位和低位从DS18B20中读出MOV R1,#26H ; 存入26H、27H、28H、29HRE00: MOV R2,#8RE01: CLR CSETB DATA_LINENOPNOPCLR DATA_LINE ;读前总线保持为低NOPNOPNOPSETB DATA_LINE ;开始读总线释放MOV R3,#09 ;延时18微妙DJNZ R3,$MOV C,DATA_LINE ;从DS18B20总线读得一个BITMOV R3,#23DJNZ R3,$ ;等待46微妙RRC A ;把读得的位值环移给ADJNZ R2,RE01 ;读下一个BITMOV @R1,AINC R1DJNZ R4,RE00RET ;--------------------------------------------;200ms对闪动标记取反一次;--------------------------------------------INT_T0:PUSH ACCPUSH PSWMOV TL0,TIMER_LMOV TH0,TIMER_HINC TIMER_COUNMOV A,TIMER_COUNCJNE A,#04H,INT_ENDMOV TIMER_COUN,#00HCPL FLAG2INT_END:POP PSWPOP ACCRETI;==========================================================;重新对 DS18B20 初始化;将设定的温度报警值写入 DS18B20;==========================================================RE_18B20:JB FLAG1,RE_18B20ARETRE_18B20A:CALL RESETMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#4EH ;写暂存寄存器LCALL WRITEMOV A,TEMP_TH ;TH(报警上限)LCALL WRITEMOV A,TEMP_TL ;TL(报警下限)LCALL WRITEMOV A,#7FH ;12位精确度LCALL WRITERET;====================================================;功能键扫描子程序;====================================================SCANKEY:;MOV P1,#0F0HJB K1,SCAN_K2CALL BEEP_BLSCAN_K1: CALL ALERT_TLCALL ALERT_PLAYJB K1,SCAN_K1CALL BEEP_BLSCAN_K11: CALL ALERT_THCALL ALERT_PLAYJB K1,SCAN_K11CALL BEEP_BLSCAN_K2: JB K2,SCAN_K3CALL BEEP_BLSCAN_K3: JB K3,SCAN_K4CALL BEEP_BLLCALL RESET_ALERTLCALL RE_18B20LCALL WRITE_E2SCAN_K4: JB K4,SCAN_ENDCALL BEEP_BLSCAN_END: RET;================================================;设置温度报警值;================================================RESET_ALERT:CALL ALERT_TLCALL ALERT_PLAYJNB K3,$ ;K3为位移键SETB TR0RESET_TL:CALL ALERT_PLAYJNB FLAG2,R_TL01mov 75H,7fh ;送入熄灭符mov 76H,7fhCALL ALERT_PLAYJMP R_TL02R_TL01: CALL ALERT_TLmov 75h,7Eh ;送设定值mov 76h,7DhCALL ALERT_PLAY ;显示设定值R_TL02: JNB K1,K011AJNB K2,K011BJNB K3,RESET_THJMP RESET_TLK011A:INC TEMP_TLMOV A,TEMP_TLCJNE A,#120,K012A ;没有到设定上限值,转MOV TEMP_TL,#0K012A: CALL TL_DELJMP RESET_TLK011B:DEC TEMP_TLMOV A,TEMP_TLCJNE A,#00H,K012B ;没有到设定下限值,转MOV TEMP_TL,#119K012B: CALL TL_DELJMP RESET_TL;-------------------------------------------------------RESET_TH:CALL BEEP_BLJNB K3,$RESET_TH1:CALL ALERT_PLAYJNB FLAG2,R_TH01mov 75H,7fh ;送入熄灭符mov 76H,7fhCALL ALERT_PLAYJMP R_TH02R_TH01: CALL ALERT_THmov 75h,7Eh ;mov 76h,7DhCALL ALERT_PLAYR_TH02: JNB K1,K021AJNB K2,K021BJNB K3,K002JMP RESET_TH1K021A:INC TEMP_THMOV A,TEMP_THCJNE A,#120,K022A ;没有到设定上限值,转MOV TEMP_TH,#0K022A: CALL TH_DELJMP RESET_TH1K021B:DEC TEMP_TH ;减1MOV A,TEMP_THCJNE A,#00H,K022B ;没有到设定下限值,转MOV TEMP_TH,#119K022B: CALL TH_DELJMP RESET_TH1K002: CALL BEEP_BLCLR TR0 ;关闭中断RET;-----------------------------------------------------;键延时子程序;多次调用报警值显示程序来延时;-----------------------------------------------------TL_DEL: ;报警低值延时MOV R2,#0AHTL_DEL1: CALL ALERT_TLCALL ALERT_PLAYDJNZ R2,TL_DEL1RETTH_DEL: ;报警高值延时MOV R2,#0AHTH_DEL1: CALL ALERT_THCALL ALERT_PLAYDJNZ R2,TH_DEL1RET;====================================================;实时温度值与设定报警温度值 TH、TL 比较子程序;当实际温度大于 TH 的设定值时,显示“H”,继电器关闭。;当实际温度小于 TH 的设定值时,显示“O”,继电器吸合。;当实际温度小于 TL 的设定值时,显示“L”。;闪动显示标记符 H、L、O;====================================================TEMP_COMP:SETB TR0 ;启动中断MOV A,TEMP_THSUBB A,TEMP_ZH ;减数>被减数,则JC CHULI1 ;借位标志位C=1,转MOV A,TEMP_ZHSUBB A,TEMP_TL ;减数>被减数,则JC CHULI2 ;借位标志位C=1,转JNB FLAG2,T_COMP1 ;FLAG2=0,显示标记字符MOV 74H,#0AH ;熄灭符LCALL DISP1JMP T_COMP2T_COMP1: MOV 74H,#00HLCALL DISP1 ;显示"O"T_COMP2: CLR RELAY ;继电器吸合CLR TR0 ;关闭中断RET;---------------------------------------------;超温处理;---------------------------------------------CHULI1:SETB RELAY ;继电器关闭JNB FLAG2,CHULI10MOV 74H,#0AH ;熄灭符LCALL DISP1JMP CHULI11CHULI10: MOV 74H,#0DH LCALL DISP1 ;显示"H";CALL BEEP_BL ;蜂鸣器响CHULI11:CLR TR0 ;关闭中断RET;---------------------------------------------;欠温处理;---------------------------------------------CHULI2: ;欠温处理JNB FLAG2,CHULI20MOV 74H,#0AH ;熄灭符LCALL DISP1JMP CHULI21CHULI20: MOV 74H,#0CH LCALL DISP1 ;显示"L";CALL BEEP_BL ;蜂鸣器响CHULI21: CLR TR0 ;关闭中断RET;------------------------------------------------------------;把 DS18B20 暂存器里的温度报警值拷贝到EEROM;------------------------------------------------------------WRITE_E2:CALL RESETMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#48H ;温度报警值拷贝到EEROMLCALL WRITERET;--------------------------------------------------------------;把 DS18B20 EEROM 里的温度报警值拷贝回暂存器;-------------------------------------------------------------READ_E2:CALL RESETMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#0B8H ;温度报警值拷贝回暂存器CALL WRITERET;*****************************************************; 处理温度 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
51单片机DS18B20温度控制报警程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)