单片机温度控制系统。DS18B20
- 格式:doc
- 大小:42.00 KB
- 文档页数:5
/******************************************************************** * * ME850单片机开发实验仪演示程序- DS18B20温度显示* * * * 6数码管显示* * * * 版本:V1.0 (2008/08/23) ** 作者:gguoqing (Email: gguoqing@) ** 作者:gguoqing (gguoqing@) ** 网站:(硕飞科技) (伟纳单片机世界) ** 邮箱:sofitech@ ** * *【版权】Copyright(C)伟纳电子 All Rights Reserved **【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!* * * *******************************************************************/#include <reg52.h>#include <intrins.h>sbit DQ = P3 ^ 3; //定义DS18B20端口DQsbit BEEP = P3 ^ 7; //定义蜂鸣器控制端口bit presence;unsigned char code LEDData[] ={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82,0xF8, 0x80, 0x90, 0xff, 0xc6, 0x9c, 0xbf};unsigned char data temp_data[2];unsigned char data display[7] ={0x0b, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d};char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节/**********************************************************us延时函数(8*1.085)*num**********************************************************/ void Delay(unsigned int num) //延时函数{while (--num);}/********************************************************** 延时子程序**********************************************************/ void delayms(unsigned int ms){unsigned char k;while (ms--){for (k = 0; k < 114; k++);}}/********************************************************** 蜂鸣器驱动子函数**********************************************************/ void beep(){unsigned char i;for (i = 0; i < 180; i++){Delay(80);BEEP = !BEEP; //BEEP取反}BEEP = 1; //关闭蜂鸣器delayms(100);}/********************************************************** DS18B20初始化presence=0 OK presence=1 ERROR**********************************************************/ unsigned char Init_DS18B20(void){DQ = 0; //单片机发出低电平复位信号Delay(60); //延时>480usDQ = 1; //释放数据线Delay(8); //延时>64us,等待应答presence = DQ; //接收应答信号Delay(50); //延时>400us,等待数据线出现高电平DQ = 1; //释放数据线return (presence); //返回presence信号}/********************************************************** 读一个字节数据**********************************************************/ unsigned char ReadOneChar(void){unsigned char i = 0;unsigned char dat = 0;DQ = 1;for (i = 0; i < 8; i++)//一个字节8个bit{DQ = 0; //给低脉冲信号dat >>= 1;DQ = 1; //释放总线_nop_();_nop_();if (DQ)//读总线电平状态dat |= 0x80;//最高位置1Delay(6); //延时>45usDQ = 1; //释放总线,表示此次读操作完成}return (dat); //返回所读得数据/********************************************************** 写一个字节数据**********************************************************/ void WriteOneChar(unsigned char dat){unsigned char i = 0;for (i = 0; i < 8; i++)//一个字节8个bit{DQ = 0; //给低脉冲信号Delay(1); //延时<15usdat >>= 1; //数据右移一位,最低位移入CYDQ = CY; //写1bit数据Delay(6); //延时>45usDQ = 1; //释放总线,表示此次写操作完成}}/********************************************************** 温度数据转换子程序**********************************************************/ void Temperature_conver(){unsigned char minus = 0;// display[0]=0x0b; //显示C// display[1]=0x0c; //显示°if (temp_data[1] > 127)//温度为负值{temp_data[0] = (~temp_data[0]) + 1; //取反加一,将补码变成原码if ((~temp_data[0]) >= 0xff)temp_data[1] = (~temp_data[1]) + 1;elsetemp_data[1] = ~temp_data[1];minus = 1; //温度为负值标志}display[6] = temp_data[0] &0x0f; //取小数位数据display[2] = (display[6] *10) / 16; //保留一位小数display[6] = ((temp_data[0] &0xf0) >> 4) | ((temp_data[1] &0x0f) << 4);//取整数display[5] = display[6] / 100; //百位display[4] = (display[6] % 100) / 10; //十位display[3] = display[6] % 10; //个位if (!display[5])//高位为0,不显示{display[5] = 0x0a;if (!display[4])//次高位为0,不显示display[4] = 0x0a;}if (minus){display[5] = 0x0d; //显示负号}}/********************************************************** 数码管显示子函数**********************************************************/ void ledplay(){unsigned char n, shift;shift = 0xfe; //位码初值for (n = 0; n < 6; n++)//6位数码管显示{if (n == 3)P0 = (LEDData[display[n]]) &0x7f;//加小数点显示elseP0 = LEDData[display[n]];//输出段码P2 = shift; //输出位码shift = (shift << 1) | 0x01; //修改位码delayms(1);}P2 = 0xff; //关闭显示delayms(1);}/********************************************************** 主函数**********************************************************/ void main(void){unsigned char m;P0 = 0xff;P2 = 0xff;while (1){Init_DS18B20();if (presence == 0){WriteOneChar(0xCC); //跳过ROM匹配操作WriteOneChar(0x44); //启动温度转换for (m = 0; m < 120; m++)//数码管初始化显示ledplay();//等待数据转换完成}Init_DS18B20();if (presence == 0){WriteOneChar(0xCC); //跳过ROM匹配操作WriteOneChar(0xBE); //读取温度寄存器temp_data[0] = ReadOneChar(); //温度低8位temp_data[1] = ReadOneChar(); //温度高8位Temperature_conver(); //数据转换for (m = 0; m < 120; m++)ledplay();//温度显示}else{beep(); //蜂鸣器报警P2 = 0xff; //关闭显示}}}/*********************************************************/。
DS18B20智能温度控制器DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
DS18B20、 DS1822 “一线总线”数字化温度传感器同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
DS1822的精度较差为± 2°C 。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V 的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
DS18B20的内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
单总线温度传感器DS18B20简介DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。
它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20非常适用于远距离多点温度检测系统。
DS18B20外形及引脚说明外形及引脚如图2所示:图2 管脚排列图在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下:1(GND):地2(DQ):单线运用的数据输入输出引脚3(VDD):可选的电源引脚DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。
初始时,计数器1预置的是与-55℃相对应的一个预置值。
以后计数器1每一个循环的预置数都由斜率累加器提供。
为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。
计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。
ds18b20工作原理
DS18B20是一种数字温度传感器,它基于One-Wire总线协议进行通信。
其工作原理是利用温度对半导体器件电阻值的变化进行测量。
在DS18B20内部,有一个温度传感器、一个模数转换器和一个存储器。
在测量过程中,DS18B20内部的温度传感器会不断感知环境温度,并将温度转换为数字信号。
然后,模数转换器将数字信号转换成相应的数字代码,代表温度值。
这些数字代码通过One-Wire总线协议被传送给主控设备(如微控制器或电脑)进行处理。
DS18B20的One-Wire总线协议是一种串行通信协议,它使用单根数据线进行数据传输。
通信过程中,主控设备产生一个复位脉冲,然后从DS18B20传感器接收到ROM编号(唯一标识符)以便进行身份验证。
接下来,主控设备发送命令给传感器,比如读取温度值。
DS18B20会将温度值的数字代码通过数据线传输给主控设备,主控设备解析代码并将其转换为实际温度值。
DS18B20还具有一定的存储能力,在开启存储功能后,它可以将温度值存储在内部的存储器中。
这样,即使主控设备没有及时读取温度值,DS18B20也能够保存最新的温度数据。
总的来说,DS18B20通过测量半导体器件电阻值的变化来获取环境温度,并通过One-Wire总线协议将温度值传输给主控设备。
它的工作原理简单而可靠,在许多应用中被广泛使用。
DS18B20温度传感器的控制方法DS18B20的初始化:(1)先将数据线置高电平“1”。
(2)延时(该时间要求的不是很严格,但是尽可能的短一点)(3)数据线拉到低电平“0”。
(4)延时750微秒(该时间的时间范围可以从480到960微秒)。
(5)数据线拉到高电平“1”。
(6)延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。
据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
(8)将数据线再次拉高到高电平“1”后结束。
DS18B20的写操作:(1)数据线先置低电平“0”。
(2)延时确定的时间为15微秒。
(3)按从低位到高位的顺序发送字节(一次只发送一位)。
(4)延时时间为45微秒。
(5)将数据线拉到高电平。
(6)重复上(1)到(6)的操作直到所有的字节全部发送完为止。
(7)最后将数据线拉高。
DS18B20的读操作:(1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时15微秒。
(5)将数据线拉高“1”。
(6)延时15微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时30微秒。
根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
表2 ROM指令表指令约定代码功能读ROM 33H 读DS1820温度传感器ROM中的编码(即64位地址)符合ROM 55H 发出此命令之后,接着发出64 位ROM 编码,访问单总线上与该编码相对应的DS1820 使之作出响应,为下一步对该DS1820 的读写作准备。
ds18b20温度传感器工作原理
DS18B20是一种数字温度传感器,它通过一根单一的数据总线进行工作。
传感器内部有一个精确的温度传感器和数字转换器。
以下是DS18B20温度传感器的工作原理:
1. 单线总线通信:DS18B20传感器使用单一的数据总线进行通信。
该总线不仅用于传输数据,还用于为传感器提供电源。
通过这种方式,可以减少传感器的引脚数量,使其适用于各种微控制器和嵌入式系统。
2. 温度测量:传感器内部有一个温度传感器,该传感器可以测量实时环境温度。
它使用精确的电阻和温度-电压转换技术,以确保温度测量的准确性和稳定性。
3. 数据转换:DS18B20传感器将温度测量结果转换为数字信号。
传感器内部的模数转换器将模拟信号转换为数字码,以便于传感器与主控制器之间的通信和处理。
4. ROM存储器:每个DS18B20传感器都有一个唯一的64位ROM存储器。
这个ROM存储器包含传感器的唯一序列号、制造商信息和其他相关信息。
这些信息可以用来识别传感器并设置其工作参数。
5. 通信协议:DS18B20传感器使用一种称为1-Wire协议的通信协议与主控制器进行通信。
该协议在传感器和主控制器之间建立一种基于时间的序列通信方式,主控制器上的软件可以通过这种协议与传感器进行数据传输、配置和控制。
总而言之,DS18B20温度传感器通过单一的数据总线进行通信,并使用内部的温度传感器和数字转换器测量环境温度。
它通过ROM存储器保存唯一的序列号和其他信息,使用1-Wire 协议与主控制器进行通信。
DS18B20温度控制系统设计【摘要】本设计通过以stc89c52单片机为核心,控制温度传感器ds18b20采集温度信号并直接以数字信号的方式传送给单片机,所测量结果由lcd1602显示出来,单片机将检测的温度与预先设定的温度值进行比较,该设定温度可以通过按键以1℃为单位进行调节。
当所测温度超过设定的温度值时,单片机将控制一个发光二极管和一个蜂鸣器进行声光报警,同时控制一个继电器的通断,达到简单调温的目的。
【关键词】单片机;ds18b20;lcd1602;声光报警一、功能简介本设计主要是以数字温度传感器ds18b20采集温度信号,将采集到的温度信号送给stc89c52单片机。
单片机将检测的温度与预先设定的温度值进行比较,该设定温度可以通过两个按键以1℃为单位进行调节。
当超过设定的温度值时,单片机将控制一个发光二极管和一个蜂鸣器进行声光报警,同时控制一个继电器的通断,达到简单调温的目的。
按模块可分为:(1)报警控制模块(2)温度采集模块(3)显示模块。
温度检测及显示要求实现以下功能:(1)用lcd直接显示读数、显示清晰直观。
(2)温度测量范围:0-100℃。
(3)可通过按键实现调节报警温度大小,单位1℃。
(4)精确度高。
(5)稳定性好。
二、方案简介理简单化。
采用温度芯片ds18b20测量温度,体现了作品芯片化这个趋势。
部分功能电路的集成,使总体电路更简洁,搭建电路和焊接电路时更快。
而且,集成块的使用,有效地避免外界的干扰,提高测量电路的精确度。
所以芯片的使用将成为电路发展的一种趋势。
本方案应用这一温度芯片,也是顺应这一趋势。
单片机温度控制系统是以ms-52单片机为控制核心,报警电路对温度监控的微机控制系统。
基本控制原理:ds18b20检测温度并将信号传送给单片机通过lcd显示出来,键盘设定温度上下限值,当所测温度超出所设置的初始温度时,报警装置响起,同时控制一个继电器的通断,达到简单调温的目的。
三、温度传感器的选取及特性选用美国dallas公司推出的一款单线数字温度传感器,此器件具有体积小,功耗低,精度高,可靠性好,易于单片机接口等优点其各方面特性都满足此系统的设计要求。
基于51单片机和DS18B20的数字温度计设计说明
1.硬件设计:
-51单片机:选择合适的型号,如STC89C52或AT89C52等。
-DS18B20温度传感器:该传感器是一种数字温度传感器,具有单总线接口和高精度测量能力。
-接口电路:将51单片机和DS18B20传感器连接起来,要注意电平转换和信号线的阻抗匹配。
2.软件设计:
-初始化:在主函数中,首先对单片机进行初始化设置,包括时钟设置、串口配置等。
-DS18B20通信协议:使用单总线协议与DS18B20传感器进行通信,包括发送复位信号、读写数据等操作。
-温度测量:通过向DS18B20发送读取温度的命令,从传感器中读取温度值并保存。
-数据传输:将温度值转换为可显示的格式,如摄氏度或华氏度,并通过串口输出或LED显示。
3.程序流程:
-初始化单片机,设置时钟和串口参数。
-进入主循环,循环执行以下操作:
-发送复位信号,启动温度转换。
-等待转换完成,发送读取温度命令。
-读取温度值,并进行数据处理转换。
-输出温度值。
4.其他功能:
-可以添加LCD显示模块,将温度值显示在液晶屏上。
-可以添加按键输入模块,通过按键切换温度单位或进行其他操作。
需要注意的是,该设计只是一个简单的示例,实际应用中可能需要根据具体需求进行扩展和修改。
同时,在程序设计过程中,也要注意低功耗和数据稳定性等方面的考虑。