基于AT89C52智能温度控制器的设计
李鑫,曾光,廖荣辉
1 引言
DS18B20温度控制器是以美国MAXIM/DALLAS半导体公司的单总线温度传感器DS18B20为,以ATMEL公司的AT89C52为控制器制作的结构简单、测温准确、具有一定控制功能的智能温度控制器,图1为该温度控制器在电脑机箱测温控制中的应用。
通过操作面板上的3个按钮,可以设定报警温度,进而控制机箱风扇的运转与停止。
2 DS18B20特性介绍
DS18B20是DALLAS公司的单线数字温度传感器,它的体积更小、适用电压更宽、更经济,DS18B20是世界上片支持“一线总线”接口的温度传感器,一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念,它的测量温度范围为-55~+125℃,在-10~+85℃范围内,为±0.5℃,现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等,与前一代产品不同,新的产品支持3~5.5V的电压范围,使系统设计更灵活、方便,而且新一代产品更便宜,体积更小,DS18B20可以程序设定9~12位的分辨率,为±0.5℃。可以选择更小的封装方式,更宽的电压适用范围,分辨率设定及用户设定的报警温度存储在E2PROM中,掉电后依然保存,DS18B20的性能是新一代产品中的,性能价格比也非常出色,继“一线总线”的早期产品后,DS18B20开辟了温度传感器技术的新概念,DS18B20和DS18B22使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
2.1 DS18B20的内部结构
DS18B20内部结构主要由4部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,配制寄存器。DS18B20的管脚排列如图2所示。
光刻ROM中的64位序列号是出厂前被光刻好的,他可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.062 5℃/LSB形式表达,其中S为符号位。
表1是12位转化后得到的12位数据,存储在18B20的2个8b的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0℃,则这5位为0,只要将测到的数值乘于0.062 5即可得到实现温度,如果温度小于0℃,则这5位为1,测到的数值需要取反加1再乘于0.062 5即可得到实际温度。
例如:+125℃的数字输出为07D0H,+25.062 5℃的数字输出为0191H,-25.062 5℃的数字输出为FF6FH,-55℃的数字输出为FC90H。
2.2 DS18B20温度传感器的存储器
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH,TL和结构寄存器。
暂存存储器包含了8个连续字节,前2个字节是测得的温度信息,第1个字节的内容是温度的低8位,第2个字节是温度的高8位,第3个和第4个字节是TH,TL的易失性拷贝,第5个字节是结构寄存器的易失性拷贝,这3个字节的内容在每上电复位时被刷新。第6、7、8个字节用于内部计算。第9个字节是冗余检验字节。
根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过3个步骤:每读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,发送RAM指令,这样才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500μs,然后释放,DS18B20收到信号后等待16-60μs左右,后发出60-240μs低脉冲,主CPU收到此信号表示复位成功。
2.3 DS18B20使用中的注意事项
DS18B20虽然具有测温系统简单、测温高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:
(1)DS18B20从测温结束到将温度值转换成数字量需要一定的转换时间,这是必须保证的,不然会出现转换错误的现象,使温度输出总是显示85。
(2)在实际使用中发现,应使电源电压保持在5V左右,若电源电压过低,会使所测得的温度与实际温度出现偏高现象,经过试验发现,一般在5V左右。
(3)较小的硬件开销需要相对复杂的软件进行补偿,由于DS18B20与微处理器间采用串行数据传送,因此,在对DS18B20进行读写编程时,必须严格保证读写时序,否则将无法读取测温结果,在使用PL/M、C等语言进行系统程序设计时,对DS18B20操作部分采用汇编语言实现。
(4)在DS18B20的有关资料中均未提及单总线上所挂DS18B20数量问题,容易使人误认为可以挂任意多个DS18B20,在实际应用中并非如此,当单总线上所挂DS18B20超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。
(5)连接DS18B20的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误,当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米胶合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要由总线分布电容使信号波形产生畸变造成的。因此,在用DS18B20进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。
(6)在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦某个DS18B20接触不好或断线,当程序读该DS18B20时,将没有返回信号,程序进入死循环,这一点在进行DS18B20硬件连接和软件设计时也要给予一定的重视。
测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。
3 温度控制器的设计原理
3.1 温度控制器的设计
图3为该温度的控制器的设计原理总图。
该系统直接用C52的P0口驱动数码管,但是P0口不具备数据保持能力,需要接一定大小的上拉电阻,显示方式采用扫描法。3个按键同样接有上拉电阻,这样可以有效地消除因键盘抖动所造成的误操作。
3.2 温度控制器的关键程序代码
void Init 1820(void)
{
int i,j,k;
unsigned char presence;
TMPort=1;
_nop_();
TMPort=0;
for(j=1;j<=62;j++);
i=1;
TMPort=1;
for(k=1;k<=2;k++);
while(i<=6)
{
presence=TMPort;
i++;
}
if(presence==0)
{
DS18B20_EST=0;
TMPort=1;
}
else
{
DS18B20_NotEST=0;
TMPort=1;
}
}
(2)读一个字节
unsigned char read_bit(void)
{
unsigned char i;
TMPort=0;
_nop_();
_nop_();
TMPort=1;
for(i=0;i<2;i++ );
return(TMPort);
}
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value=0;
for(i=0;i<8;i++)
{
if(read_bit())
value=0x01<<i;
delay(4);
}
return(value);
}
(3)写一个字节
void write_bit(char bitval)
{
TMPort=0;
_nop_();
if(bitval==1)
TMPort=1;
delay(5);
TMPort=1。
_nop_();
_nop_();
_nop_();
}
void write_byte(char val)
{
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp=temp&0x01;
write_bit(temp);
}
delay(5);
}
整个对DS18B20的操作都是以上述这几个操作为基础的,所以他们是使DS18B20能否正常测温的关键。对不同的操作只要发出相应的命令控制字即可,详细请参看有关技术文档。典型的测温流程如图4所示。
此外,为了提高该温度控制器的测温,这里还提出了一个行之有效的办法。
4 结论及展望
实验表明:该温度控制器结构简单、测温准确,具有一定的实际应用价值。
该智能温度控制器只是DS18B20在温度控制领域的一个简单实例,还有许多需要完善的地方,例如可以将测得的温度通过单片机与通讯模块相连接,以手机短消息的方式发送给用户,使用户能够随时对温度进行监控。此外,还能广泛地应用于其他一些工业生产领域,如建筑,仓储等行业。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。