基本原理 温度与我们的生活、环境以及工业生产过程息息相关,是过程控制中的重要参数之一。 测量温度的关键是温度传感器,目前新型温度传感器已从模拟走向数字化。 DS18B20数字温度传感器是Dallas公司生产的1-Wire,即单总线器件,具有线路简单、体 积小的特点。因此用他组成一个测温系统,具有线路简单,在1根通信线可以挂很多这样的 数字温度传感器,十分方便。 1)系统功能: (1)采用AT89S52单片机和DS18B20温度传感器通信,控制温度的采集过程和进行数据通信; (2)利用数码管显示测量的温度值; 3 (4)编写C51程序,完成单片机对温度数据的采集过程以及与DS18B20数据传输过程的控制。 根据系统的控制要求,选择AT89S52单片机,包括数字温度传感器的数据采集、数据处 理、晶振复位和温度显示电路。系统电路原理图如下所示: 系统由3 个模块组成:主控制器.测温电路和显示电路。结构框图如下所示。 (1) 主控制器:单片机使用AT89S52。易于调试及烧录。 AT89S52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、 非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8 位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制 应用系统提供高性价比的解决方案。AT89S52具有如下特点:40个引脚,8k Bytes Flash 片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O) 口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口, 看门狗(WDT)电路,片内时钟振荡器。此外,AT89S52设计和配置了振荡频率可为0Hz并可 通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系 统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活 或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。 时钟电路:时钟电路为单片机产生时序脉冲,单片机所有运算与控制过程都是在统一的 时序脉冲的驱动下的进行的。 EA/VPP(31脚)为内外程序存储器选择控制引脚,当EA为低电位时,单片机从外部程序 存储器取指令;当EA接高电平时,单片机从内部程序存储器取指令。把EA接到+5V高电平, 让单片机运行内部的程序。 复位电路:在复位引脚(9脚)脚持续出现24个振荡器脉冲周期(即2个机器周期)的高 电平信号将使单片机复位。如下图所示电容C和电阻R构成了单片机上电自动复位电路。 (2)显示电路: 显示电路采用4位共阳LED数码管,从P1口输出段码,列扫描用P3.0-P3.3 来实现,列驱动用8055三极管。 3)软件设计 基于DS18B20数字温度传感器的软件设计采用C51编写程序,主要完成DS18B20的测量温 度值计算及温度值的显示功能。其采用模块化设计,程序设计包括系统初始化、复位程序、 读取温度程序、温度转换程序、数码管显示程序和延时程序,其总体流程图如下图所示。 开始 初始化DS18B20 读DS18B20 的序 检测 发送跳过ROM 指令 I=1 等待 DS18B20 复位 发送DS18B20 编码 读取、显示温度数据 温度传感器DS18B20简介 美国Dallas 半导体公司的数字化温度传感器DS1820 是世界上第一片支持 "一线总线"接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,新一代的DS18B20 体积更小、更经济、更灵活。使你可以充分发挥“一线总线”的优点。目前DS18B20 批量采购价格仅10 元左右。在传统的模拟信号远距离温度测量系统中,需要很好的解决引线误差补偿问题、多点测量切换误差问题和放大电路零点漂移误差问题等技术问题,才能够达到较高的测量精度。另外一般监控现场的电磁 环境都非常恶劣,各种干扰信号较强,模拟温度信号容易受到干扰而产生测量误差,影响测量精度。 因此,在温度测量系统中,采用抗干扰能力强的新型数字温度传感器是解决这些问题的最有效方案, 新型数字温度传感器DS18B20 具有体积更小、精度更高、适用电压更宽、采用一线总线、可组网等优点,在实际应用中取得了良好的测温效果。新的"一线器件"DS18B20 体积更小、适用电压更宽、更经济。 DS18B20、DS1822 的特性 DS18B20 可以程序设定9~12 位的分辨率,精度为±0.5°C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。DS18B20 的性能是新一代产品中最好的!性能价格比也非常出色!DS1822 与DS18B20 软件兼容,是DS18B20 的简化版本。省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。 继"一线总线"的早期产品后,DS1820 开辟了温度传感器技术的新概念。DS18B20 和DS1822 使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。 DS18B20、DS1822 "一线总线"数字化温度传感器同DS1820 一样,DS18B20 也支持"一线总线"接口,测量温度范围为-55°C~+125°C,在-10~+85°C 范围内,精度为±0.5°C。DS1822 的精度较差为±2°C。现场温度直接以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V~5.5V 的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。 一、DS18B20 的主要特性 (1)适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电 (2)独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯 (3)DS18B20 支持多点组网功能,多个DS18B20 可以并联在唯一的三线上,实现组网多点测温 (4)DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内 (5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃ (6)可编程的分辨率为9~12 位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,
for (i=200;i>0;i‐‐); //延时400 微秒等待总线恢复
return (flag); //根据flag 的值可知DS1820 是否存在或损坏 ,可加声音告警提示DS1820 故障
}
/**********************************************************
*写数据到DS1820
*函数名称:DS1820_WriteData()
**********************************************************/
void DS1820_WriteData(U8 wData)
{
U8 i,j;
for (i=8;i>0;i‐‐)
{
DS1820_DQ = 0; //拉低总线,产生写信号
for (j=2;j>0;j‐‐); //延时4us
DS1820_DQ = wData&0x01; //发送1 位
for (j=30;j>0;j‐‐); //延时60us,写时序至少要60us
DS1820_DQ = 1; //释放总线,等待总线恢复
wData>>=1; //准备下一位数据的传送
}
}
/**********************************************************
*从DS1820 中读出数据
*函数名称:DS1820_ReadData()
**********************************************************/
U8 DS1820_ReadData()
{
U8 i,j,TmepData;
for (i=8;i>0;i‐‐)
{
TmepData>>=1;
DS1820_DQ = 0; //拉低总线,产生读信号
for (j=2;j>0;j‐‐); //延时4us
DS1820_DQ = 1; //释放总线,准备读数据
for (j=4;j>0;j‐‐); //延时8 微秒读数据
if (DS1820_DQ == 1)
{ TmepData |= 0x80;}
for (j=30;j>0;j‐‐); //延时60us
DS1820_DQ = 1; //拉高总线,准备下一位数据的读取.
}
return (TmepData);//返回读到的数据
}
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
/**********************************************************
*采用DS1820+1602 精确到4 位小数的温度计
*DS1820 设置为12 位精度
**********************************************************/
#include
#include
U8 code string[16]={"Temp Display"};
U8 code DispStr[16]={"www.sxcckj.com"};
U8 temperature[2]; //存放温度数据
void display(); //待显温度值转换
/**********************************************************
*主程序
**********************************************************/
void main()
{
U8 i;
DelayMs(255);//等待电源稳定,液晶复位完成
LCDInit(); //1602 液晶初始化
DS18B20_Init(); //18B20 初始化,可不用初始化,因为18B20 出厂时默认是12 位精度
SetLight(1); //打开背光灯
DisplayStr(0,0,string);//显示"温度:"
DisplayStr(0,1,DispStr);//显示"系列号"
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
WriteCMD(0x01,1); //1601 清屏
DelayMs(50);
SetLight(0); //关闭背光灯
while (1)
{
|