摘要 温度控制是无论是在工业生产过程中还是在日常生活中都起着非常重要的
作用过低的温度或过高的温度都会使水资源失去应有的作用从而造成水资源
的巨大浪费。特别是在当前全球水资源极度缺乏的情况下我们更应该掌握好对
水温的控制把身边的水资源好好地利用起来。
在现代冶金、石油、化工及电力生产过程中温度是极为重要而又普遍的热
工参数之一。在环境恶劣或温度较高等场合下为了保证生产过程正常安全地进
行提高产品的质量和数量以及减轻工人的劳动强度、节约能源要求对加热
炉炉温进行测、显示、控制使之达到工艺标准以单片机为核心设计的炉温控
制系统可以同时采集多个数据并将数据通过通讯口送至上位机进行显示和控
制。那么无论是哪种控制我们都希望水温控制系统能够有很高的精确度起码
是在满足我们要求的范围内帮助我们实现我们想要的控制解决身边的问题。
在计算机没有发明之前这些控制都是我们难以想象的。而当今随着电子
行业的迅猛发展计算机技术和传感器技术的不断改进而且计算机和传感器的
价格也日益降低可靠性逐步提高用信息技术来实现水温控制并提高控制的精
确度不仅是可以达到的而且是容易排除生活用水问题实施对水温的控制已成为
我们电子行业的任务以此来加强工业化建设,提高人民的生活水平。 方案论证与比较
1、总体方案设计及论证 根据题目的要求我们提出了以下的三种方案
方案1此方案是采用传统的二位模拟控制方法选用模拟电路用电位器
设定给定值采用上下限比较电路将反馈的温度值与给定的温度值比较后决定
加热或者不加热。由于采用模拟控制方式系统受环境的影响大不能实现复杂
的控制算法使控制精度做得高而且不能用数码显示和键盘设定。 https://www.doczj.com/doc/8610072541.html,
方案2
采用单片机AT89S2核心。采用了热敏电阻来采集温度A/D采样芯
片ADC0804将其转换成数字信号并通过单片机处理后去控制但热敏电阻线性度
不好精度不高。而且外围电路比较复杂。
方案3采用单片机AT89S52核心使用单片机具有编程灵活控制简单的
优点使系统能简单的实现温度的控制及显示采用经常用到的并有很高精度的
集成温度传感器DS18B20。可直接读出温度并且通过软件编程能实现各种控制
算法使系统还具有控制精度高的特点。省去A/D采样芯片简化了外围电路
性价比高。
经过分析论证明从方案的可行性测量温度的精度制作成本我们采用
了第三种方案。
硬件选择
为了方便制作和调试我们选择AT89S52的DIP封装形式。P0、P2口作为
LED七段数码管的驱动P1口作为各种信号灯的驱动。P3口作键盘输入和控制
并且留出RXD、TXD通过MAX232与PC通信实现远程控制。电源由220V
市电经变压器变压整流滤波再由7805稳压输出供给AT89S51和整个系
统。
主芯片功能特性
AT89S52是一个低功耗高性能CMOS 8位单片机片内含4k Bytes
ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器器
件采用ATMEL公司的高密度、非易失性存储技术制造兼容标准MCS-51指令
系统及80C51引脚结构芯片内集成了通用8位中央处理器和ISP Flash存储单
元功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性
价比的解决方案。
AT89S52具有如下特点40个引脚4k Bytes Flash片内程序存储器128 bytes
的随机存取数据存储器RAM32个外部双向输入/输出I/O口5个中断
优先级2层中断嵌套中断2个16位可编程定时计数器,2个全双工串行通信口
看门狗WDT电路片内有时钟振荡器。
DS18B20简介
DS18B20数字温度计是DALLAS公司生产的1Wire即单总线器件具有线路简https://www.doczj.com/doc/8610072541.html,
单体积小的特点。因此用它来组成一个测温系统具有线路简单在一根通信
线可以挂很多这样的数字温度计十分方便。
a) DS18B20产品的特点
1、只要求一个端口即可实现通信。
2、在DS18B20中的每个器件上都有独一无二的序列号。
3、实际应用中不需要外部任何元器件即可实现测温。
4、测量温度范围在55。C到125。C之间。
5、数字温度计的分辨率用户可以从9位到12位选择。
6、内部有温度上、下限告警设置。
b) DS18B20的引脚介绍
TO92封装的DS18B20的引脚排列见图1其引脚功能描述见表1。
底视图图1
表1 DS18B20详细引脚功能描述
序
号
名称 引脚功能描述
1 GND 地信号
2 DQ 数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源
下也可以向器件提供电源。
3 VDD 可选择的VDD引脚。当工作于寄生电源时此引脚必须接地。
c) DS18B20的使用方法
由于DS18B20采用的是1Wire总线协议方式即在一根数据线实现数据
的双向传输而对AT89S51单片机来说硬件上并不支持单总线协议因此
我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访
问。
由于DS18B20是在一根I/O线
上读写数据因此对读写的数据位有着严
格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完
整性。该协议定义了几种信号的时序初始化时序、读时序、写时序。所有时序
都是将主机作为主设备单总线器件作为从设备。而每一次命令和数据的传输都https://www.doczj.com/doc/8610072541.html,
是从主机主动启动写时序开始如果要求单总线器件回送数据在进行写命令后
主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。
33H Read ROM(读ROM)
44H Convert Temperature (开始温度转换)
4EH Write Scratchpad(写存储器)
55H Match ROM(匹配ROM)
BEH Read scratchpad(读存储器)
CCH Skip ROM (跳过ROM)
读取温度的流程如下复位——发CC跳过ROM命令——发44H开始
温度转换命令——延时1S——复位——发CC跳过ROM命令——发BEH
读存储器命令——
连续从总路线上读出2个字节的数据温度数据的低位和
高位——结束
DS18B20的复位时序
DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后在15秒之内就得释放
单总线以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过
程至少需要60us才能完成。 https://www.doczj.com/doc/8610072541.html,
DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同当要写0时序时单总线
要被拉低至少60us保证DS18B20能够在15us到45us之间能够正确地采样IO
总线上的“0”电平当要写1时序时单总线被拉低之后在15us之内就得释放
单总线。 DS18B20中的温度传感器完成对温度的测量以12位转化为例:用16位符号扩
展的二进制补码读数形式提供以0.0625℃/LSB形式表达其中S为符号位。 这是12位转化后得到的12位数据存储在18B20的两个8比特的RAM中二进制中的前面5位是符号位如果测得的温度大于0这5位为0只要将测到
的数值乘于0.0625即可得到实际温度如果温度小于0这5位为1测到的数
值需要取反加1再乘于0.0625即可得到实际温度。例如+125℃的数字输出为07
D0H+25.0625℃的数字输出为0191H-25.0625℃的数字输出为FF6FH-55℃
的数字输出为FC90H。 https://www.doczj.com/doc/8610072541.html,
DS1820使用中注意事项
DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点
但在实际应用中也应注意以下几方面的问题 (1)较小的硬件开销需要相对复杂
的软件进行补偿由于DS1820与微处理器间采用串行数据传送因此在对D
S1820进行读写编程时
必须严格的保证读写时序否则将无法读取测温结果。
对DS1820操作部分最好采用汇编语言实现。 (2)在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题容易
使人误认为可以挂任意多个DS1820在实际应用中并非如此。当单总线上所挂
DS1820超过8个时就需要解决微处理器的总线驱动问题这一点在进行多点
测温系统设计时要加以注意。
(3)连接DS1820的总线电缆是有长度限制的。试验中当采用普通信号电
缆传输长度超过50m时读取的测温数据将发生错误。当将总线电缆改为双绞
线带屏蔽电缆时正常通讯距离可达150m当采用每米绞合次数更多的双绞线
带屏蔽电缆时正常通讯距离进一步加长。这种情况主要是由总线分布电容使信
号波形产生畸变造成的。因此在用DS1820进行长距离测温系统设计时要充分
考虑总线分布电容和阻抗匹配问题。 https://www.doczj.com/doc/8610072541.html,
(4)在DS1820测温程序设计中向DS1820发出温度转换命令后程序总要
等待DS1820的返回信号一旦某个DS1820接触不好或断线当程序读该DS1
820时将没有返回信号程序进入死循环。这一点在进行DS1820硬件连接和
软件设计时也要给予一定的重视。测温电缆线建议采用屏蔽4芯双绞线其中一
对线接地线与信号线另一组接VCC和地线屏蔽层在源端单点接地。
电路功能模块图如下 1、电源电路设计 把220v交流电经变压器转变为12v的交流电并经整流桥转变为直流电再经
电容滤波送入集成稳压电源LM7805使输出电压为5v供单片机使用。 https://www.doczj.com/doc/8610072541.html,
2、测温电路
测温电路比较简单只要对DS18B20供电在数据输出端加上一个4.7K的上拉
电阻便可。 3、键盘
只用四个键来输入它们的功能分别为“状态设定”“加2”“减2”和“确
认”四个功能按键因为DS18B20对时序要求比较严格所以键盘程序采用中
断方式。 https://www.doczj.com/doc/8610072541.html,
4、LED显示模块,利用P0与P2来完成显示功能 5、指示灯模块LED选用直径3mm的白色LED指示单片机的工作状态。它们的
功能分别为“制冷”和“加热”。 https://www.doczj.com/doc/8610072541.html,
6、 输出接口模块
接口电路中采用光电耦合器和双向可控硅组成。单片机的触发信号经光电耦合隔
离后控制双向可控硅的导通角实现对加热丝的控制。 光电耦合器的选择
为了使脆弱的单片机芯片不受外部干扰信号的影响选用光电耦合
器moc4031来隔离电流它的参数为
输入直流电流为50mA,电压为3V。
输入最大电流为3A功率为100mw。
输出端耐压400V功率为100mw.
总功率为300mw。
双向可控硅的选择
双向可控硅选用BTA16600B它的参数如下
It(RMS)16A
VDRM/VRRM600V https://www.doczj.com/doc/8610072541.html,
IGT(Q1)
10~50mA
封装TO220
7、制冷模块,制冷用到一个驱动电压为12V的直流小风扇通过简单的电路便可
实现对其控制。 8050为NPN ebc
8550为PNP ebc 8、蜂鸣报警电路蜂鸣器通过一个三极管来驱动这里选用三极管8550。电路
图如下 9、串口通讯利用MAX232实现电平转换与PC机进行通讯。 https://www.doczj.com/doc/8610072541.html,
软件选择 基于DS18B20对时序的要求比较严格软件采用汇编语言设计,汇编语言
有直接对硬件操作生成代码高执行速度快等特点。
https://www.doczj.com/doc/8610072541.html,
硬件的测试与软件的调试
我们首先对各部分硬件的功能加以测试以确保硬件焊接是正确的。
软件上的调试我们首先是校准温度我们用水银温度计要进行校正第一步是
采用冰水混合物来校正0度第二步是采用沸水来进行校正。在校准过程中发现
我们所做的温度探头敏
不够高所以我们又重做一个温度探头。第三步是通过加
热测温得出各种数据。所得的温度数据与温度计的进行比较并做成图表如下 https://www.doczj.com/doc/8610072541.html,
从表中可看出所测温度与温度计有1.5度的误差这主要是由于我们所做的温度
探头要放到水中我们采用了包装隔水措施使DS18B20与的灵敏度下降了。
所以我们采用了软件进行温度补偿。经过温度补偿后实测值与温度计值相差
0.4度。
https://www.doczj.com/doc/8610072541.html,
我们在PC机用VB做了一个水温控制系统界面
水温控制系统使用说明书 一、概述
本作品是根据现实生活中的实际需要设计成的具有众多优点
1、采用单片机AT89S52主控升级容易响应迅速控制精确。
2作品在静态时能很好地控制水温使其在设定温度正负0.5度的范围内。
3、本作品不仅具有加热功能还具有制冷的功能。
2、带4位LED显示屏以数字形式显示现在所测得的温度。
3、设置温度过程中能够时实显示所设定的温度值。
4、具有超温报警功能并LED显示888的功能。
5、具有当DS18B20不正常工作时便会报警和LED显示888的功能。
6、具有串口通讯功能在PC机用VB做出界面并显示时实温度。
7、外壳结实耐用制作精良。 二、主要技术参数: 电源电压 交流220V±10% 驱动电热棒功率500W https://www.doczj.com/doc/8610072541.html,
测温范围 0
——100度 超调量《1度
外型尺寸18CM×11CM×11CM
三、使用方法
1、开机
首先是对系统进行供电开机后供电指示灯亮。
2、温度的设定
按模式键进入温度设置状态—
—可进行温度加2与减2操作——待温度调到所需
时按下确认键。
3、VB界面的使用
只需运行软件便可软件便能通过串口采集到数据并显示出来。
源程序如下
;内存分配声明
TEMPER_H EQU 30H ;用于保存读出温度的高字节
TEMPER_L
EQU 31H ;用于保存读出温度的低字节
AA EQU 32H ;数码管小数位BCD存放内存位置
BB EQU 33H ;数码管个数位BCD存放内存位置
CC EQU 34H ;数码管十位数BCD存放内存位置
BAO EQU 37H ;上限温度
T_INTEGER EQU 38H ;温度十与个位整合成1字节(二进制)
KEY_BUF EQU 39H ;键盘输入后的值
HH EQU 40H ;放差值
GG EQU 44H ;存串口发来的值
FLAG EQU 20H.0 ;标志位,确定是否存在DS18B20
HOT EQU P3.7 ;加热(高电平有效)
DAT BIT P1.7 ;DS18B20数据线
;-----------------------------主函数开始-------------------------
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT_0
ORG 0023H
LJMP GET_T0
ORG 0030H
MAIN:
MOV SP,#60H
MOV IE,#10010001B ;开总中断外部中断定时器1中断串口
中断
MOV IP,#01H ;外部中断为最高级 https://www.doczj.com/doc/8610072541.html,
MOV TCON,#00H ;外中断脉冲方式低电平有效
MOV TMOD,#00100000B ;定时器1工作在方式2
MOV TH1,#0FDH ;波特率为9600
MOV TL1,#0FDH
MOV PCON,#00H ;SMOD=0
MOV SCON,#01010000B ;串口工作方式一且允许接收
SETB TR1 ;开始计时
MOV BAO,#45H ;设置上限报警的十位温度值
MOV KEY_BUF,#00H ;由于KEY_BUF是由用户输入的所以先
赋值初始化
CLR P3.7 ;加热
CLR P1.0 ;制冷
SETB P1.3 ;制冷指示灯
SETB P1.1 ;加热指示灯
MOV 44H,#0FFH ;串口的初值
START: LCALL GET_TEMPER
JB FLAG,NORMAL ;判断是否有DS18B20的存在
CALL ERR ;不存在时显示错误信息
NORMAL: LCALL BAIJING ;报警
LCALL DISPLAY ;显示温度
LCALL SWITCH ;加热与制冷
LCALL FATEMPER ;发数据
LCALL DUDATA ;使串口来的数据起作用
AJMP START
;--------------------DS18B20的温度转换子程序--------------------
GET_TEMPER:
LCALL Set_18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL
WRITE_1820
LCALL DISPLAY ;用显示温度(持续1s左右)来等待AD转
换结束,12位的话要转换750ms
LCALL Set_18B20 ;准备读温度前先初始化
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_1820
LCALL T_FORMAT ;将读出的2字节温度格式化,并转换为
压缩BCD码
RET https://www.doczj.com/doc/8610072541.html,
;----------------------------DS18B20初始化程序--------------------
Set_18B20:
SETB DAT
NOP
CLR DAT
MOV R2,#250 ;主机发出延时500微秒的复位低脉冲
DJNZ R2,$
SETB DAT ;然后拉高数据线
MOV
R2,#30
DJNZ R2,$ ;延时60us等待DS18B20回应
JNB DAT,INIT1
JMP INIT2 ;超时而没有响应,重新初始化
INIT1:
MOV R2,#120
DJNZ R2,$ ;延时240us
JB DAT,INIT3 ;数据变高初始化成功
INIT2: CLR
FLAG ;清标志位,表示DS1820不存在
JMP INIT4
INIT3: SETB FLAG ;置标志位,表示DS1820存在
MOV R2,#240
DJNZ R2,$
INIT4: SETB DAT
RET
;--------------------写DS18B20的子程序(有具体的时序要求)--------------
WRITE_1820:
MOV R2,#8 ;一共8位数据
WR0: CLR DAT
MOV R3,#6
DJNZ R3,$
RRC A
MOV DAT,C
MOV R3,#20
DJNZ R3,$
SETB DAT
NOP
NOP
DJNZ R2,WR0
SETB DAT
RET
;--------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据-------
READ_1820:
MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#TEMPER_L ;低位存入31H(TEMPER_L) https://www.doczj.com/doc/8610072541.html,
RE0: MOV R2,#8
RE1: SETB DAT
NOP
NOP
CLR DAT
NOP
NOP
SETB DAT
MOV R3,#4
DJNZ R3,$
MOV C,DAT
RRC A
MOV R3,#30
DJNZ R3,$
DJNZ R2,RE1
MOV @R1,A
DEC
R1 ;高位存入30H(TEMPER_H)
DJNZ R4,RE0
RET
;------------------------整合读出的两字节温度---------------------
T_FORMAT:
MOV A, TEMPER_L
ANL A, #0FH
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV AA,A ;获得小数部分BCD码
MOV A,TEMPER_L
SWAP A
MOV @R0,A
MOV A,TEMPER_H
SWAP A
XCHD A,@R0
INC A ;温度补偿
INC A
MOV T_INTEGER,A ;获得整数部分(1字节)
RET
;小数部分码表
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H
DB 05H,06H,06H,07H,08H,08H,09H,09H
;---------------------------外部中断0----------------------
INT_0:
PUSH ACC
PUSH PSW
SETB RS0 ;选择寄存器组1 https://www.doczj.com/doc/8610072541.html,
CLR RS1
MOV GG,#0FFH ;使串口为0FFH
MOV KEY_BUF,T_INTEGER
A1: LCALL DISPLAY
JNB P3.5,A2 ;有P按下跳出中断
JNB P3.3,PRO_UP ;按下温度值加二
JNB P3.4,PRO_DOWN ;按下温度值减二
JMP A1
PRO_UP:
CALL K_DELAY ;加二
CALL K_DELAY
INC KEY_BUF
INC KEY_BUF
MOV T_INTEGER,KEY_BUF
JNB P3.5,A2 ;有P1.2按下跳出中断
JMP A1
PRO_DOWN:
CALL K_DELAY ;减二
CALL K_DELAY
DEC KEY_BUF
DEC KEY_BUF
MOV T_INTEGER, KEY_BUF
JNB P3.5,A2 ;有P1.2按下跳出中断
JMP A1
A2:
CLR RS0
POP PSW
POP ACC
RETI
;-------------------------------串口-------------------------
GET_T0:
CLR RI ;清中断标志位
PUSH ACC
PUSH PSW
MOV A,SBUF
MOV 44H,A ;存值
POP PSW
POP ACC
RETI
;----------------------------使串口数据起作用---------------------
DUDATA:
MOV A,GG ;判断是否设定了温度
CJNE A,#0FFH,QUIT9 ;与键盘相协调 https://www.doczj.com/doc/8610072541.html,
LJMP QUIT12 ;若没有设定则跳出来
QUIT9: ORL A,#00H ;判是否为关风扇关加热键
JZ QUIT10
LJMP QUIT11 ;为设定的有效值
QUIT10:
MOV KEY_BUF,GG ;若为0则进行相应的处理
MOV GG,#0FFH ;给GG初值
LJMP QUIT12
QUIT11: MOV KEY_BUF,GG ;给值
QUIT12: RET
;-------------------------------发数据---------------------------
FATEMPER: CLR ES
MOV A,T_INTEGER
MOV SBUF,A
JNB TI,$
CLR TI
SETB ES
RET
;--------------------程序名称:ERR程序出错处理,显示三个8 --------
ERR: MOV T_INTEGER,#58H ;如果没有找到DS18B20那么就显示错误,
错误显示为888
MOV AA,#08H
LCALL DISPLAY
RET
;--------------------------显示程序--------------------------
DISPLAY:
MOV A,T_INTEGER
MOV B,#10
DIV AB
MOV CC,A
MOV BB,B
MOV DPTR,#TAB
MOV R3,#7FH
MOV R1,#CC
DPLOP: MOV A,@R1
MOVC A,@A+DPT
R
MOV P2,R3
MOV P0,A
CJNE R3,#0BFH,DPNEXT ;显示小数点
CLR P0.7
DPNEXT:MOV A,R3 https://www.doczj.com/doc/8610072541.html,
RR A
MOV R3,A
DEC R1
CALL D1MS
CJNE R3,#0EFH,DPLOP
MOV P0,#0FFH ;一次显示结束P0口复位
MOV P2,#0FFH ;P2口复位
RET
;----------------------------报警-------------------------------
BAIJING:
MOV A,BAO
SUBB A,T_INTEGER
JNC JING2
JING1: CLR P1.4 ;报警
MOV R5,#45
D2: CALL D1MS
DJNZ R5,D2
SETB P1.4
JING2: RET
;------------------------------加热与制冷------------------------
SWITCH:
MOV A,KEY_BUF ;判断是否设定了温度
ORL A,#00H
JZ QUIT1 ;如没有输入键值则退出
MOV A,KEY_BUF
SUBB A,T_INTEGER
MOV 40H,A ;保存温差
JC COOL ;如果现在的温度比设定的温度小则转
J1: CLR P1.0
SETB P1.3 ; 制冷指示灯
CLR P1.1 ;开工作指示灯
MOV A,40H
SUBB A,#05H
JC J2
SETB P3.7 ;全功率加热
LJMP QUIT2
J2: CLR C
MOV A,40H
SUBB A,#03H ;当温差为2度时进行别一种方式加热
JC J3
LCALL DISPLAY
SETB P3.7
LCALL DISPLAY
CALL D1MS https://www.doczj.com/doc/8610072541.html,
LCALL DISPLAY
CALL D1MS
LCALL DISPLAY
CALL D1MS
LJMP QUIT1
J3:
CLR C
MOV A,40H
SUBB A,#01H
JC QUIT1 ;当实际温度与设定值相等时不加热
LCALL DISPLAY
SETB P3.7
CALL D1MS
LJMP QUIT1
COOL:
SETB P1.1
CLR P3.7
CLR C
MOV A,T_INTEGER
SUBB A,KEY_BUF
SUBB A,#01H
JC J6
CLR P1.3 ;开制冷指示灯
SETB P1.0 ;制冷
LJMP QUIT2
J6: LJMP QUIT1
QUIT1: SETB P1.3
SETB P1.1
CLR P3.7
CLR P1.0
QUIT2: RET
;---------------------------程序名称:K_DELAY ------------------------
K_DELAY:
MOV R6,#200 ;键盘抖动延时子程序
D1: MOV R7,#200
DJNZ R7,$
DJNZ R6,D1
RET
;-------------------------共阳数码管对应字型表-------------------------
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H ;段码表
; 0 1 2 3 4 5 6 7 对应内容
DB 80H,90H
;8 9
END https://www.doczj.com/doc/8610072541.html,