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
评论