微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机DS18B20温度控制报警程序(可设置温控范围)

51单片机DS18B20温度控制报警程序(可设置温控范围)

时间:11-30 来源:互联网 点击:
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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top