
1.DS18B20基本知识
DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
1、DS18B20产品的特点
(1)、只要求一个端口即可实现通信。
(2)、在DS18B20中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55。C到+125。C之间。
(5)、数字温度计的分辨率用户可以从9位到12位选择。
(6)、内部有温度上、下限告警设置。
2、DS18B20的引脚介绍
TO-92封装的DS18B20的引脚排列见图1,其引脚功能描述见表1。
(底视图)图1
表1 DS18B20详细引脚功能描述 序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。
3
VDD
可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。
3. DS18B20的使用方法
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。
DS18B20的复位时序
DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。
DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
4. 实验任务
用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+100度之间,用8位数码管显示出来。
5. 电路原理图
6. 系统板上硬件连线
(1). 把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。
(2). 把“单片机系统”区域中的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。
(3). 把DS18B20芯片插入“四路单总线”区域中的任一个插座中,注意电源与地信号不要接反。
(4). 把“四路单总线”区域中的对应的DQ端子连接到“单片机系统”区域中的P3.7/RD端子上。
7. C语言源程序
#i nclude <AT89X52.H>
#i nclude <INTRINS.h>
unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}
unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00,0x40}
unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,
25,28,31,34,38,41,44,48,
50,53,56,59,63,66,69,72,
75,78,81,84,88,91,94,97}
unsigned char displaycount
unsigned char displaybuf[8]={16,16,16,16,16,16,16,16}
unsigned char timecount
unsigned char readdata[8]
sbit DQ=P3^7
bit sflag
bit resetpulse(void)
{
unsigned char i
DQ=0
for(i=255i>0i--)
DQ=1
for(i=60i>0i--)
return(DQ)
for(i=200i>0i--)
}
void writecommandtods18b20(unsigned char command)
{
unsigned char i
unsigned char j
for(i=0i<8i++)
{
if((command &0x01)==0)
{
DQ=0
for(j=35j>0j--)
DQ=1
}
else
{
DQ=0
for(j=2j>0j--)
DQ=1
for(j=33j>0j--)
}
command=_cror_(command,1)
}
}
unsigned char readdatafromds18b20(void)
{
unsigned char i
unsigned char j
unsigned char temp
temp=0
for(i=0i<8i++)
{
temp=_cror_(temp,1)
DQ=0
_nop_()
_nop_()
DQ=1
for(j=10j>0j--)
if(DQ==1)
{
temp=temp | 0x80
}
else
{
temp=temp | 0x00
}
for(j=200j>0j--)
}
return(temp)
}
void main(void)
{
TMOD=0x01
TH0=(65536-4000)/256
TL0=(65536-4000)%256
ET0=1
EA=1
while(resetpulse())
writecommandtods18b20(0xcc)
writecommandtods18b20(0x44)
TR0=1
while(1)
{
}
}
void t0(void) interrupt 1 using 0
{
unsigned char x
unsigned int result
TH0=(65536-4000)/256
TL0=(65536-4000)%256
if(displaycount==2)
{
P0=displaycode[displaybuf[displaycount]] | 0x80
}
else
{
P0=displaycode[displaybuf[displaycount]]
}
P2=displaybit[displaycount]
displaycount++
if(displaycount==8)
{
displaycount=0
}
timecount++
if(timecount==150)
{
timecount=0
while(resetpulse())
writecommandtods18b20(0xcc)
writecommandtods18b20(0xbe)
readdata[0]=readdatafromds18b20()
readdata[1]=readdatafromds18b20()
for(x=0x<8x++)
{
displaybuf[x]=16
}
sflag=0
if((readdata[1] &0xf8)!=0x00)
{
sflag=1
readdata[1]=~readdata[1]
readdata[0]=~readdata[0]
result=readdata[0]+1
readdata[0]=result
if(result>255)
{
readdata[1]++
}
}
readdata[1]=readdata[1]<<4
readdata[1]=readdata[1] &0x70
x=readdata[0]
x=x>>4
x=x &0x0f
readdata[1]=readdata[1] | x
x=2
result=readdata[1]
while(result/10)
{
displaybuf[x]=result%10
result=result/10
x++
}
displaybuf[x]=result
if(sflag==1)
{
displaybuf[x+1]=17
}
x=readdata[0] &0x0f
x=x<<1
displaybuf[0]=(dotcode[x])%10
displaybuf[1]=(dotcode[x])/10
while(resetpulse())
writecommandtods18b20(0xcc)
writecommandtods18b20(0x44)
}
}
关键词:单总线; 数字温度传感器; 多点温度测控
1 前言
随着科学技术的发展,特别是现代仪器的发展,微型化、集成化、数字化正成为传感器发展的一个重要方向[1]。美国Dallas半导体公司推出的数字化温度传感器DS1820采用单总线协议,即与微机接口仅需占用一个I/O端口,无需任何外部元件,直接将温度转化成数字信号,以9位数字码方式串行输出,从而大大简化了传感器与微处理器的接口。
2 工作原理
目前大多数传感器系统都采用放大--传输--数模转换这种处理模式。这种模式一般要占用数条数
据/控制线,限制了单片机功能的扩展。而一线总线技术则很好地解决了这个问题。
一线总线技术就是在一条总线上仅有一个主系统和若干个从系统组成的计算机应用系统。由于总线上的所有器件都通过一条信号线传输信息,总线上的每个器件在不同的时间段驱动总线,这相当于把数据总线、地址总线和控制总线合在了一起。所以整个系统要按单总线协议规定的时序进行工作。为了使其它设备也能使用这条总线,一线总线协议采用了一个三态门,使得每一个设备在不传送数据时空出该数据线给
其它设备。一线总线在外部需要一个上拉电阻器,所以在总线空闲时是高电平。
挂在单总线上的器件称为单总线器件,为了区分总线上的不同器件,生产单总线器件时,厂家都刻录了一个64位的二进制ROM代码作为芯片的唯一序列号。这样通过寻址就可以把每个器件识别出来。64位ROM的结构如下:开始8位是产品类型的编号(DS1820为10H),接着是每个器件的唯一的序号,共
有48位,最后8位是前56位的CRC校验码,这也是多个DS1820可以采用一线进行通信的原因。 3 DS1820介绍
DS1820是美国Dallas半导体公司推出的第一片支持"一线总线"接口的温度传感器。它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供微机处理[2]。
DS1820的工作原理是:DS1820采用3脚PR-35封装或8脚SOIC封装,其中 GND为地;I/O为数据输入/输出端(即单线总线),该脚为漏极开路输出,常态下呈高电平;VDD是外部+5V电源端,不用时应接地;NC为空脚。图1 所示为DS1820的内部框图,它主要包括寄生电源、温度传感器、64位激光ROM单线接口、存放中间数据的高速暂存器(内含便笺式RAM),用于存储用户设定的温度上下限值的TH和TL解发器存储与控制逻辑、8位循环冗余校验码(CRC)发生器等七部分。
DS1820 特点如下:硬件接口简单,性能稳定,单线接口,仅需一根口线与MCU连接无需外围元件;由总线提供电源;测温范围为-55~75℃;精度为0.5℃;9位温度读数;A/D变换时间为200ms;用户自设定温度报警上下限,其值是非易失性的;报警搜索命令可识别那片DS1820超温度限。
DS1820的温度测量原理如下[3]:DS1820测量温度时使用特有的温度测量技术,其测量电路框图如图2所示。内部计数器对一个受温度影响的振荡器的脉冲计数,低温时振荡器的脉冲可以通过门电路,而当到达某一设置高温时,振荡器的脉冲无法通过门电路。计数器设置为-55℃时的值,如果计数器到达0之前,门电路未关闭,则温度寄存器的值将增加,这表示当前温度高于-55℃。同时,计数器复位在当前温度值上,电路对振荡器的温度系数进行补偿,计数器重新开始计数直到回零。如果门电路仍然未关闭,则重复以上过程。温度表示值为9bit,高位为符号位。
4 温度检测系统设计
由于每片DS1820含有唯一的硅串行数,所以在一条总线上可挂接多个DS1820芯片。从DS1820读出的信息或写入DS1820的信息,仅需要一根口线(单线接口)。读写及温度变换功率来源于数据总线,总线本身也可以向所挂接的DS1820供电,而无需额外电源。DS1820提供9位温度读数,构成多点温度检测系统而无需任何外围硬件。对DS1820的使用,多采用单片机实现数据采集。处理时,将DS1820信号线与单片机一位口线相连,单片机可挂接多片DS1820,从而实现多点温度检测系统。由于DS1820只有三个引脚,其中两根是电源线VDD和GND,另外两根用作总线DQ(Data In/Out),由于其输出和输入均是数字信号且与TTL电平兼容,因此其可以与微处理器直接进行接口,从而省去了一般传感器所必需的中间转换环节。
本设计中以DS1820为传感器、AT89C52单片机为控制核心组成的多点温度测试系统如图3所示[4]。用6只DS1820同时测控6路温度(视实际需要还可扩展通道数)。89C52单片机P1.1口接单线总线。DS1820采用寄生电源供电方式。为保证在有效的DS1820时钟周期内能提供足够的电流,图3中采用一个MOSFET管和89C52的H.0口来完成对DS1820的总线上拉。键盘扫描和动态扫描的显示共用一片可编程接口芯片8279,显示采用8位共阴极LED数码管,它可用来显示通道数、温度测量值以及TH、TL的值。
程序处理是整个系统的关键,即简洁的硬件结构是靠复杂的软件来支持的。多个器件挂在一条总线上为了识别不同的器件,在程序设计过程中一般有四个步骤:初始化命令;传送ROM命令;传送RAM命令;数据交换命令。
需要注意的是,无论是单点还是多点温度检测,在系统安装及工作之前,应将主机逐个与DS1820挂接,读出其序列号。其工作过程为:主机发出一个脉冲,待 "0"电平大于480μs后,复位DA1820,在DS1820所发响应脉冲由主机接收后,主机再发读ROM命令代码33H,然后发一个脉冲(15μs),并接着读取DS1820序列号的一位。用同样方法读取序列号的56位。另外,由于DS1820单线通信功能是分时完成的,遵循严格的时隙概念,因此,系统对DS1820和各种 *** 作必须按协议进行,即初始化DS1820(发复位脉冲)→发ROM功能命令→发存储器 *** 作命令→处理数据。系统对 DS1820 *** 作的总体流程图如图4所示。
在正常测温情况下,DS1820的测温分辨力为0.5℃。采用下述方法可获得高分辨率的温度测量结果:首先用DS1820提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。考虑到DS1820测量温度的整数部分以0.25和0.75℃为进位界限的关系.
结束语
对应于传统概念,这一粒三极管一样的传感器相当于传统的温度传感器+ 数字化+ CPU+ 总线协议及接口。一线器件采用单条连线,解决了控制、通信和供电等问题,降低了系统成本,并简化了设计,为未来传感器的发展和应用开辟了新的领域。
http://www.mcublog.com/blog/blog2007/shuizhongzehui/archives/2007/22353.html
http://blog.21ic.com/user1/422/archives/2006/12900.html
有流程图,电路图和资料,不过百度上传不了
本设计的温度测量及加热控制系统以 AT89S52 单片机为核心部件,外加温度采集电路、键盘及显示电路、加热控制电路和越限报警等电路。采用单总线型数字式的温度传
感器 DS18B20,及行列式键盘和动态显示的方式,以容易控制的固态继电器作加热控制
的开关器件。本作品既可以对当前温度进行实时显示又可以对温度进行控制,以使达到
用户需要的温度,并使其恒定在这一温度。人性化的行列式键盘设计使设置温度简单快
速,两位整数一位小数的显示方式具有更高的显示精度。建立在模糊控制理论上的控制
算法,使控制精度完全能满足一般社会生产的要求。通过对系统软件和硬件设计的合理
规划,发挥单片机自身集成众多系统级功能单元的优势,在不减少功能的前提下有效降
低了硬件成本,系统 *** 控简便。
实验证明该温控系统能达到 0.2℃的静态误差,0.45℃的控制精度,以及只有 0.83%
的超调量,因而本设计具有很高的可靠性和稳定性。
关键 词: 单片机恒温控制 模糊控制
1
引 言
温度是工业生产中主要的被控参数之一,与之相关的各种温度控制系统广泛应用于
冶金、化工、机械、食品等领域。温度控制是工业生产过程中经常遇到的过程控制,有
些工艺过程对其温度的控制效果直接影响着产品的质量,因而设计一种较为理想的温度
控制系统是非常有价值的。
硬件 系统的设计
1、电路总体原理框图
温度测量及加热系统控制的总体结构如图 1 所示。系统主要包括现场温度采集、实
时温度显示、加热控制参数设置、加热电路控制输出、与报警装置和系统核心 AT89S52
单片机作为微处理器。
图 1:系统总体原理框图
温度采集电路以数字量形式将现场温度传至单片机。单片机结合现场温度与用户设
定的目标温度,按照已经编程固化的模糊控制算法计算出实时控制量。以此控制量控制
固态继电器开通和关断,决定加热电路的工作状态,使水温逐步稳定于用户设定的目标
值。在水温到达设定的目标温度后,由于自然冷却而使其温度下降时,单片机通过采样
回的温度与设置的目标温度比较,作出相应的控制,开启加热器。当用户需要比实时温
度低的温度时,此电路可以利用风扇降温。系统运行过程中的各种状态参量均可由数码
管实时显示。
2、温度采集电路的设计
温度采集电路模块如图 2 示。DS18B20 内部结构主要由四部分组成:64 位光刻 ROM、
温度传感器、非挥发的温度报警触发器 TH 和 TL、配置寄存器。其中 DQ 为数字信号输
入/输出端;GND 为电源地;VDD 为外接供电电源输入端。
2
图 2:温度采集电路
DS18B20 中的温度传感器可完成对温度的测量,以 12 位转化为例:用 16 位符号扩展
的二进制补码读数形式提供,以 0.0625℃/LSB 形式表达,其中 S 为符号位。
这是 12 位转化后得到的 12 位数据,存储在 18B20 的两个 8 比特的 RAM 中,二进
制中的前面 5 位是符号位,如果测得的温度大于 0,这 5 位为 0,只要将测到的数值乘
于 0.0625 即可得到实际温度;如果温度小于 0,这 5 位为 1,测到的数值需要取反加 1
再乘于 0.0625 即可得到实际温度。
3、键盘和显示的设计
键盘采用行列式和外部中断相结合的方法,图 3 中各按键的功能定义如下表 1。其
中设置键与单片机的 INT 0 脚相连,S 0 −−S 9 、YES、NO 用四行三列接单片机 P0 口,REST
键为硬件复位键,与 R、C 构成复位电路。模块电路如下图 3:
表 1:按键功能
按键 键名 功能
REST 复位键 使系统复位
RET 设置键 使系统产生中断,进入设置状态
S 0 −−S 9 数字键 设置用户需要的温度
YES 确认键 用户设定目标温度后进行确认
NO 清除键 用户设定温度错误或误按了 YES 键后使用
3
图 3 键盘接口电路
显示采用 3 位共阳 LED 动态显示方式,显示内容有温度值的十位、个位及小数点后
一位。用 P2 口作为段控码输出,并用 74HC244 作驱动。P1.0—P1.2 作为位控码输出,
用 PNP 型三极管做驱动。模块电路如下图 4:
4、加热控制电路的设计
图 4 显示接口电路
用于在闭环控制系统中对被控对象实施控制,被控对象为电热杯,采用对加在电热
杯两端的电压进行通断的方法进行控制,以实现对水加热功率的调整,从而达到对水温
控制的目的。对电炉丝通断的控制采用 SSR-40DA 固态继电器。它的使用非常简单,只
要在控制端 TTL 电平,即可实现对继电器的开关,使用时完全可以用 NPN 型三极管接
成电压跟随器的形式驱动。当单片机的 P1.3 为高点平时,三极管驱动固态继电器工作
接通加热器工作,当单片机的 P1.3 为低电平时固态继电器关断,加热器不工作。控制
电路图如下图 5:
4
图 5 加热控制电路
5、报警及指示灯电路的设计
当用户设定的目标温度达到时需用声音的形式提醒用户,此时蜂鸣器为三声断续的
滴答滴答的叫声。在本系统中我们为用户设计了越限报警,当温度低于用户设置的目标
温度 10 度或高于 10 度时蜂鸣器为连续不断的滴答滴答叫声。当单片机 P1.7 输出高电
平时,三极管导通,蜂鸣器工作发出报警声。P1.7 为低电平时三极管关断,蜂鸣器不
工作。
D1 为电热杯加热指示灯,P1.5 低电平有效;D0 为检测到 DS18B20 的指示,高电平
有效;D10 为降温指示灯,低电平有效。报警及指示灯电路如下图 6 示:
图 6 报警及指示灯电路
5
软 件系统的设计
系统的软件由三大模块组成:主程序模块、功能实现模块和运算控制模块。
1、主程序模块
主程序主要完成加热控制系统各部件的初始化和实现各功能子程序的调用,以及实
际测量中各个功能模块的协调在无外部中断申请时,单片机通过循环对外部温度进行实
时显示。把设置键作为外部中断 0,以便能对数字按键进行相应处理。主程序流程图如
下图 7:
6
图 7 主程序流程图
7
2、功能实现模块
以用来执行对固态继电器及电热杯的控制。功能实现模块主要由中断处理子程序、
温度比较处理子程序、键盘处理子程序、显示子程序、报警子程序等部分组成。键盘显
示及中断程序流程图如下图 8:
3、运算控制模块
图 8 键盘、显示、中断 子程序流程图
该模块由标度转换、模糊控制算法,及其中用到的乘法子程序。
3.1 标度转换
16
式中 A 为二进制的温度值, A0 为 DS18B20 的数字信号线送回来的温度数据。
8
单片机在处理标度转换时是通过把 DS18B20 的信号线送回的 16 位数据右移 4 位得
到二进制的温度值。其小数部分通过查小数表的形式获取。程序流程图如下图 9:
开始
将28H低4位与29H高4位组合成
一个字节
将合成的字节(整数部分)送29H
单元
将29H单元低4位送A
给DPTR赋常数表格2首地址
将查到的数值(即小数部分)送
30H单元
结束
3.2 模糊控制算法子程序
图 9 标度转换子程序流程图
该系统为一温度控制系统,由于无法确切确定电炉的物理模型,因而无法建立其数
学模型和传递函数。加热器为一惯性系统,我们采用模糊控制的方法,通过多次温度测
量模糊计算当用户设定目标温度时需提前关断加热器的温度,利用加热器自身的热惯性
使温度上升到其设定温度。每隔 5 摄氏度我们进行一次温度测量,并当达到其温度时关
断加热器记录下因加热器的热惯性而上升的温度值。从而可以建立热惯性的温度差值
表,在程序中利用查表法,查出相应设定温度对应的关断温度。通过实验数据我们可以
看出,当水温从 0℃加热到 50℃这段温度区域,其温度惯性曲线可近似成线性的直线,
水温从 50℃加热到 100℃这段温度惯性曲线可近似成另一条线性的直线段。通过对设置
的目标温度与温控系统监测温度进行差值处理就可近似的求出单片机的提前关断温度。
程序流程图如图 10:
9
4.源程序见附录[2]
图 10 模糊控制算法子程序流程图
设计 总结
我们的温度控制系统是基于 AT89S52 单片机的设计方案,她能实时显示当前温度,
并能根据用户的要求作出相应的控制。此系统为闭环系统,工作稳定稳定性高,控制精
度高,利用模糊控制算法使超调量大大降低。软件采用模块化结构,提高了通用性。本设
计的目的不仅仅是温度控制本身,主要提供了单片机外围电路及软件包括控制算法设计
的思想,应该说,这种思想比控制系统本身更为重要。
1、设计所达到的性能指标
1.1 温控系统的标度误差
我们将标准温度计和温控系统探头放人同一容器中,选定若干不同的温度点,记
录下标准温度计显示的温度和温控系统显示的温度进行比较。测量数据如下表 2 所示:
表 2 标准温度计测量的温度和温控系统显示的温度
标准温度计和温控系统显示的温度(℃)
标准温度计 16.9 47.7 57.8 63.0 72.8 85.1 90.9
温控系统 16.5 48.0 58.3 62.9 73.0 85.5 90.5
差值比较 -0.4 0.3 0.5 0.1 0.2 0.4 -0.4
标度误差 1.5%
10
1.2 温控系统的静态误差
通过测量在不同的温度点同标准温度的温度差来确定温控系统的静态误差。其测量
数据如下表 3:
表 3 标准温度和温控系统显示的温度
标准温度和温控系统显示的温度(℃)
标准温度 26.0 37.0 46.0 60.0 70.0 83.0
系统显示值 25.7 36.4 46.1 59.6 70.0 83.3
差值 -0.3 -0.6 -0.1 -0.4 0 0.3
静态误差 0.18℃
1.3 温控系统的控制精度
通过设定不同的温度值,使加热器加热,待温度稳定时记录各温度点的温度计数据
和温控系统的显示值。其记录数据如下表 4:
温度计读数和温控系统显示的温度(℃)
设定温度
值 20.0 28.0 35.0 45.0 55.0 75.0 87.0 91.0
系统显示
值 20.5 27.7 34.4 45.1 54.1 74.9 86.1 91.2
差值 0.5 -0.3 -0.6 0.1 -0.9 -0.1 -0.9 0.2
控制精度 0.45℃
超调量 0.83%
2、结果分析论述
我们的系统完全满足设计要求,静态误差方面可以达到 0.18℃的误差,在读数正确
方面与标准温度计的读数误差为 1.5%,对一般的工业生产完全可以采用我们的设计。
该系统具有较小的超调值,超调值大约为 0.83%左右。虽然超调为不利结果,但另
一方面却减小了系统的调节时间。从其数据表可以看出该系统为稳定系统。
3、设计方案评价
3.1 优点
在硬件方面:本设计方案采用了单总线型数字式的温度传感器,提高了温度的采集
精度,节约了单片机的口线资源。方案还使用仅一跟口线就可控制的美国生产的固态继
电器 SSR—40DA 作加热控制器件,使设计简单化,且可靠性强。在控制精度方面,本设
计在不能确定执行机构的数学模型的情况下,大胆的假设小心的求证,利用模糊控制的
算法来提高控制精度。
在软件方面:我们采用模块化编程,思路清晰,使程序简洁、可移植性强。
3.2 缺点
本设计方案虽然采用了当前市场最先进的电子器件,使电路设计简单,但设计方案
造价高。本系统虽然具有较小的超调量,但加大了调节时间。如果需要更高的控制精度,
则我们的模糊控制将不适应,需修改程序。
11
3.3 方案的改进
在不改变加热器容量的情况下,为减小调节时间,可以实行在加热快达到设定温度
时开启风扇来减小热惯性对温度的影响的措施。在控制精度上可采用先进的数字 PID
控制算法,对加热时间进行控制,提高控制精度。
可以改进控制系统使能同 PC 联机通信,以利用 PC 的图形处理功能打印显示温度曲
线。AT89S52 串行口为 TTL 电平,PC 串行口为 RS232 电平,使用一片 MAX232 作为电
平转换驱动。
参考 文献
[1] 李广弟 单片机基础 北京:北京航空航天大学出版社,2001
[2] 王福瑞 单片微机测控系统设计大全 北京:北京航空航天大学出版社,1997
[3] 赵茂泰 智能仪器原理及应用(第 2 版)北京:电子工业出版社,2004
[4] 赖寿涛 微型计算机控制技术 北京:机械工业出版社,2000
[5] 沙占友 模拟与数字万用表检测及应用技术北京:电子工业出版社 1999
12
附 录
附录[1]使用说明书
按 键功能说明
数字键:按 SET 键后,按相应的数字键(0~9)可对温度进行设置,所设置的温
度将实时显示在 LED 显示器上;
SET 键:按 SET 键可对温度的十位、个位以及小数部分进行设置;
YES 键:设置好温度后按 YES 键,系统将据你所设置的温度(须大于当前实际
温度)对水进行加热;
NO 键:若误按了 SET 键,或对输入有误,可按 NO 键进行取消;
RST 键:对系统进行复位。
指示 灯及报警器说明
红 灯:加热状态标志;
绿 灯:温度传感器正常工作标志;
蓝 灯:保温状态标志;
报警器:功能①当水温达到预设值时报警提醒;
功能②当水温达到或超越上、下限时报警提示。
13
附录[2]设计总电路
14
附录[3]程序清单
TEMPER_LEQU 29H 用于 保存读出温度的低 8 位
TEMPER_HEQU 28H 用于 保存读出温度的高 8 位
FLAGEQU 38H 是否 检测到 DS 18B20 标志位
DAYUEQU 44H 设温 >实温
XIYUEQU 45H 设温 <实温
DEYUEQU 46H 设温 =实温
GAOLE EQU 47H 水温 高于最高温度
DILEEQU 48H 水温 低于最低温度
A_bit EQU 79h 数码 管个位数存放内存位置
B_bit EQU 7Ah 数码 管十位数存放内存位置
C_BIT EQU 78H 数码 管小数存放内存位置
ORG 0000H
AJMPSTART
ORG 0003H
AJMPPITO
ORG 0030H
START: CLR P1.7
CLR P1.3
CLR P1.5
SETB P1.6
MOV R4, #00H
MOV SP, #60H 确立堆栈区
MOV PSW, #00H
MOV R0, #20H RAM 区首地址
MOV R7, #60H RAM 区单元个数
ML:MOV @R0, #00H
INC R0
DJNZR7, ML
CLRIT0
MAIN:LCALL GET_TEMPER 调用读温度子程序 进行温度显示,这里我们考
虑用网站提供的两位数码管来显示温度
显示范围 00 到 99 度,显示精度为 1 度
因为 12 位转化时每一位的精度为 0.0625 度,
我们不要求显示小数所以可以抛弃 29H 的低 4
位将 28H 中的低 4 位移入 29H 中的高 4 位,这
样获得一个新字节,这个字节就是实际测量获
得的温度
LCALL DISPLAY 调用数码管显示 子程序
JNB 00H, MAIN
CLR 00H
15
MOV A, 38H
CJNEA, #00H, SS
AJMPMAIN
SS:LCALL GET_TEMPER
LCALL DISPLAY调用 数码管显示子程序
LCALL BIJIAO
LCALL XIAOYU
LCALL JIXIAN
JNB DEYU,LOOP
CLR P1.3 关加热器
SETBP1.6 关 蓝灯
SETBP0.7 关风扇
CLR DEYU
LCALL GET_TEMPER
LCALL DISPLAY
AJMPTT2
LOOP:JNB DAYU ,TT
CLR DAYU
SETBP1.3
SETBP1.6
SETBP0.7
CLR P1.7
LCALL GET_TEMPER
LCALL DISPLAY
AJMPTT2
TT:JNBXIYU,TT2
CLRXIYU
CLRP0.7
CLRP1.6
CLRP1.3
CLRP1.7
LCALL GET_TEMPER
LCALL DISPLAY
TT2:MOV A, 29H
CLR C
CJNEA, 50H, JX
MOV A ,30H
CLR C
CJNEA, 51H, JIA1
AJMPYS2
JIA1:JC JX
MOV A, 51H
MOV 52H, A
ADD A, #2
16
MOV 52H, A
CLR C
MOV A, 30H
CJNEA, 52H,JIA2
JIA2:JNC JX
YS2:SETBP1.7
CLR P1.6
MOV R5,#20H
YS:LCALL GET_TEMPER
LCALL DISPLAY
DJNZR5,YS
CLR P1.7
SETBP1.6
MOV R5,#20H
YS1:LCALL GET_TEMPER
LCALL DISPLAY
DJNZR5,YS1
YS3:SETBP1.7
CLR P1.6
MOV R5,#20H
YS0:LCALLGET_TEMPER
LCALL DISPLAY
DJNZR5,YS0
CLR P1.7
SETBP1.6
MOV R5,#20H
YS01:LCALLGET_TEMPER
LCALL DISPLAY
DJNZR5,YS01
YS4:SETBP1.7
CLR P1.6
MOV R5,#20H
YS02:LCALL GET_TEMPER
LCALL DISPLAY
DJNZR5,YS02
CLR P1.7
SETBP1.6
MOV R5,#20H
YS03:LCALL GET_TEMPER
LCALL DISPLAY
DJNZR5,YS03
JX: MOVA,29H
CJNEA,31H, JX00
JX01:SETBP1.7
17
CLR C
AJMPLAST
JX00:JC JX01
CLR P1.7
CJNEA,
JX02:SETBP1.7
CLR C
AJMPLAST
JX03:JNC JX02
32H,
JX03
CLR P1.7
LAST:LCALL GET_TEMPER
LCALL DISPLAY
AJMPSS
***************************常数表格区**** ******************************************
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8 H,80H 0-8
DB 90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH ,0CH9,A,B,C,D,E,F,灭,p.
TAB1:DB40H,79H,24H,30H,19H,12H,02H,78H,00H ,10H, 0.--9.
TAB2:DB 0, 0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 小数点
*************************1ms 延时程序*************** *********************
************************* ****中断服务程序* *********************************
完成按键识别,键值求取,按键实时显示 等功能
************************* **************** **********************************
PITO:PUSHACC
PUSHPSW
SETBRS0
CLR RS1
SET B00H
MAIN1: MOV R7 , #03H 显示位数为 2 位
MOV R0, #7AH
MOV 78H, #00H
MOV 79H, #00H
MOV 7AH, #00H
KK: LCALL DIR
LCALL KEY1
LOOP1:CJNEA, #11, LOOP2
AJMPLAST0
LOOP2:CJNEA, #12, LOOP3
LJMP LAST3
LOOP3: CJNEA, #10, L4
MOV A, #00H
L4: MOV @R0, A
LCALL DIR
DEC R0
DJNZR7, KK
18
SETB01H
LAST0:JNB 01H, KK
LOOP4:LCALL KEY1
CJNEA, #12,LOOP5
AJMPLAST3
LOOP5:CJNEA, #11,LOOP4
LAST1:LCALL DIR
LCALL MUN
LCALL JD
LCALL BIJIAO
LAST3:POPPSW
POPACC
RETI
******************精度控制 子程序********** ******
JD: PUSHACC
PUSHPSW
CLR C
MOV A, 38H
MOV 50H, A
MOV A, 39H
MOV 51H, A
CJNEA, 29H,L001
L001:JC LAST02设温<实温,则跳出
MOV A, 29H
MOV 41H, A
MOV A, 38H
CJNEA, #25,L002
L003:CLRC 0 <T<25
SUBBA, 41H
CJNEA, #3, L004
L005:MOV A, 30H
ADD A, #5 0<T<25, 差值小于 3 度
DA A
JNB ACC.4, L0051
ANL A, #0FH
SETBC
L0051:MOV39H, A
MOV A, 29H
ADDCA, #1
MOV 38H, A
AJMPLAST2
LAST02: AJMPLAST2
L004:JC L005
MOV A, 39H
19
SUBBA, #0
DA A
MOV 39H, A
JNC L0041
DEC 38H
L0041:MOV A, 38H
SUBB A, #20<T<25, 差值大 于 3 度
MOV38H,A
AJMP LAST2
L002:JC L003
CJNE A, #50,L006
L007:CLRC25<T<5 0
SUBB A, 41H
CJNE A, #3, L008
L009:MOVA, 30H
ADDA, #1
DA A
JNBACC.4, L0091
ANLA, #0FH
SETB C
L0091:MOV39H, A
MOVA, 29H
ADDC A, #1
MOV38H, A
AJMP LAST2
L008:JCL009
MOV A, 39H
SUBB A, #0
MOV 39H, A
MOV A, 38H
SUBB A, #2
MOV 38H,A
AJMP LAST2
L006:JC L007
CJNEA, #65, L010
L011:CLRC
SUBBA, 41H
CJNEA, #3, L012
L013:MOVA, 30H
ADDA, #2
JNBACC.4, L00131
ANLA, #0FH
SETBC
L00131:MOV39H, A
20
MOVA, 29H
ADDCA, #1
MOV38H, A
AJMPLAST2
L012:JC L013
MOVA, 39H
SUBBA, #0
MOV39H, A
MOVA, 38H
SUBBA, #2
MOV38H, A
AJMPLAST2
L010:JC L011
CJNEA, #90, L016
L017:CLRC
SUBBA, 41H
CJNEA, #2, L014
L015:MOVA, 30H
ADDA, #0
JNBACC.4, L00151
ANL A, #0FH
SETB C
L00151:MOV39H, A
MOVA, 29H
ADDCA, #1
MOV38H,A
AJMPLAST2
L014:JCL015
CLRC
MOVA, 38H
SUBBA, #1
MOV38H,A
AJMPLAST2
L016:JC L017
LAST2:POPPSW
POPACC
RET
*******************************键扫描** ************************************
KEY1:LCALL KS1 键 扫描
JNZ LK1
LCALL DIR
AJMPKEY1
LK1:LCALL DIR
LCALL DIR
21
LCALL KS1
JNZ LK2
LCALL DIR
AJMPKEY1
LK2:MOV R2, #0FEH 确定键值
MOV R4, #01H
MOV A, R2
LK4:MOV P0, A
NOP
MOV A, P0
JB ACC.3, LONE
MOV A, #00H
AJMPLKP
LONE:JB ACC.4 , LTWO
MOV A, #03H
AJMPLKP
LTWO:JB ACC.5, LTHR
MOV A, #06H
AJMPLKP
LTHR:JB ACC.6, NEXT5
MOV A, #09H
AJMPLKP
NEXT5:INC R4
MOV A, R2
JNB ACC.2,KND
RL A
MOV R2, A
AJMPLK4
KND:AJMPKEY1
LKP: ADD A, R4
PUSHACC
LK3:LCALL DIR
LCALL KS1
JNZ LK3
POP ACC
RET
KS1:PUSHPSW
MOV P0, #78H
NOP
MOV A, P0 判断有无键按下
CPL A
ANL A, #78H
POP PSW
22
RET
*************求设置温度的二 进制代码,值保存在 38H 单元**************
MUN: PUSH PSW
MOV R0, #7AH 求键值
MOV A, @R0
SWAPA
DEC R0
ADD A, @R0
MOV R1, A
ANL A, #0F0 H
SWAPA
MOV B, #10
MUL AB
MOV R2, A
MOV A, R1
ANL A, #0FH
ADD A, R2
MOV 38H, A
MOV R0, #78H
MOV 39H, @R0
POP PSW
RET
*************比较实际温度和设置温度的大小 并设置相应的标志位***********
BIJIAO:MOV A, 29 H 实际温度
MOV 40H, A
1拨码开关改变波特率拨码开关的检测就是读取IO口状态即可,通过读取的值可以判断拨码开关的值,然后主机再改变波特率即可。
2从机波特率自适应
从机波特率自适应要通过软件设定,下面我举一个方法:例如主机检测到拨码开关变化后,用原来的波特路发一个信息给从机,告诉从机波特路发生变化了,并且把下一要用的波特率是多少告诉从机。这样从机就可以重新设定新的波特率了。
3显示
这个没有什么好说的了,就是数码管显示,网上一大把,自己找找吧
4 超时报警
开个定时器,如果在6s内任意时间收到信息了,就把计数器清零。否则就继续计时,当计数到6s了,就用一个端口驱动蜂鸣器即可。
这块东西网上都有现成的,主要是看你如何组合应用了。
这些东西都是我一个字一个字的敲上去的,不管怎么样给点分吧。谢谢了。有问题再问了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)