用液晶12864和DS18B20传感器做的温度传感器为什么不会变化,老是显示85度

用液晶12864和DS18B20传感器做的温度传感器为什么不会变化,老是显示85度,第1张

你好 没见你的源程序 显示没变化 可能是你两个子程序中的一个或两个都有问题 再就是在主程序中没有进行循环检测及显示刷新。贴上我的程序 你自己看看吧。老是显示85是上电时18B20没有进入正常状态,读出的数据。把我主程序中对你没有用的删了 自己看着搞吧 硬件接口上须从新对应一下。我的仿真库没有新型的18264 给你贴个老的仿真图

/ds18b20子程序/

#include <REG52H>

#include <intrinsh>

unsigned char week_value[2];

unsigned char TempBuffer[3],temp_value;      //温度

sbit DQ = P1^0;        //温度传送数据IO口

sbit start = P3^2;     //化成启动按键

sbit led = P3^0;

unsigned char hc_start=0;

/ds18b20延迟子函数(晶振12MHz )/

void delay_18B20(unsigned int i)

{

while(i--);

}

/ds18b20初始化函数/

void Init_DS18B20(void)

{

 unsigned char x=0;

 DQ = 1;          //DQ复位

 delay_18B20(8);  //稍做延时

 DQ = 0;          //单片机将DQ拉低

 delay_18B20(80); //精确延时 大于 480us

 DQ = 1;          //拉高总线

 delay_18B20(14);

 x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

 delay_18B20(20);

}

/ds18b20读一个字节/

unsigned char ReadOneChar(void)

{

uchar i=0;

uchar dat = 0;

for (i=8;i>0;i--)

 {

  DQ = 0; // 给脉冲信号

  dat>>=1;

  DQ = 1; // 给脉冲信号

  if(DQ)

  dat|=0x80;

  delay_18B20(4);

 }

return(dat);

}

/ds18b20写一个字节/

void WriteOneChar(uchar dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

delay_18B20(5);

DQ = 1;

dat>>=1;

}

}

/读取ds18b20当前温度/

void ReadTemp(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

Init_DS18B20();

WriteOneChar(0xCC);     // 跳过读序号列号的 *** 作

WriteOneChar(0x44);  // 启动温度转换

delay_18B20(100);       // this message is wery important

Init_DS18B20();

WriteOneChar(0xCC);  //跳过读序号列号的 *** 作

WriteOneChar(0xBE);  //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

delay_18B20(100);

a=ReadOneChar();     //读取温度值低位

b=ReadOneChar();    //读取温度值高位

temp_value=b<<4;

temp_value+=(a&0xf0)>>4;

}

void temp_to_str()   //温度数据转换成液晶字符显示

{

TempBuffer[0]=temp_value/10+'0';  //十位

TempBuffer[1]=temp_value%10+'0';  //个位

TempBuffer[2]='\0';

}

/

1ms延时子程序

/

void Delay1ms(unsigned int count)

{

unsigned int i,j;

for(i=0;i<count;i++)

for(j=0;j<120;j++);

}

/延时子程序/

void mdelay(uint delay)

{ uint i;

for(;delay>0;delay--)

{for(i=0;i<62;i++) //1ms延时

{;}

}

}

/------------------------------------------------

按键扫描函数,返回扫描键值

------------------------------------------------/

void key_scan(void)                               //键盘扫描函数

{

if(start == 0)                             //如果按键按下

{

mdelay(9);                            //延时一段时间,消除键抖

while(start == 0);

    hc_start=1;

TR0=1;

led=0;

lcdreset();                    //初始化LCD屏

}

}

/18264子程序/

#define uchar unsigned char

#define uint unsigned int

//#define TURE 1

//#define FALSE 0

#define Lcd_Bus P0         //MCU P2<------> LCM

#define FIRST_ADDR 0       //定义字符/汉字显示起始位置

uchar xdata sun;

sbit RS = P2^0;

sbit RW = P2^1;

sbit E  = P2^2;

sbit RST= P2^4;

sbit PSB= P2^3;

void chk_busy();

void delay(unsigned int t);

void write_com(unsigned char cmdcode);

void write_data(unsigned char Dispdata);

void lcdreset();

void hzkdis(unsigned char code s);

void clrscreen();

void first();

/检查忙位

函 数 名:chk_busy()

功    能:检查忙位程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void chk_busy()

{  RS=0;

RW=1;

E=1;

Lcd_Bus=0xff;

while((Lcd_Bus&0x80)==0x80);

E=0;

}

/延时子程序

函 数 名:delay()

功    能:延时子程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void delay(unsigned int t)

{  unsigned int i,j;

for(i=0;i<t;i++)

for(j=0;j<10;j++);

}

/写命令到LCD

函 数 名:write_com()

功    能:写命令到LCD程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void write_com(unsigned char cmdcode)

{

chk_busy();

RS=0;

RW=0;

E=1;

Lcd_Bus=cmdcode;

delay(5);////////////////////在数据写入的时候加入适当的延时

E=0;

delay(5);

}

/写数据到LCD

函 数 名:write_data()

功    能:写数据到LCD程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void write_data(unsigned char Dispdata)

{

chk_busy();

RS=1;

RW=0;

E=1;

Lcd_Bus=Dispdata;

delay(5);///////////////////在数据写入的时候加入适当的延时

E=0;

delay(5);

}

/

函 数 名:lcdreset()

功    能:初始化LCD屏程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void lcdreset()

{  PSB=1;

RST=0;

delay(0);

RST=1;

delay(2000);

write_com(0x30);

delay(10);             //选择基本指令集

write_com(0x30);       //选择8bit数据流

delay(5);

write_com(0x0c);       //开显示(无游标、不反白)

delay(10);

write_com(0x01);       //清除显示,并且设定地址指针为00H

delay(500);

write_com(0x06);       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位

delay(0);

}

/显示字符串

函 数 名:hzkdis()

功    能:显示字符串程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

/void hzkdis(unsigned char code s)

{  while(s>0)

{  write_data(s);

s++;

delay(50);

}

}  /

/显示函数

函 数 名:void display(uint a,unsigned char b,unsigned char str)

功    能:显示字符(串)程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void display(uint a,unsigned char b,unsigned char str)        

{    //显示函数  显示位置为第a行第b位 显示c所代表的数

uint disaddr=0x80 ;

if(a==2) disaddr=0x90+b;

else if(a==3) disaddr=0x88+b ;

else if(a==4) disaddr=0x98+b ;

else disaddr=0x80+b ;

write_com(disaddr);

while(str!='\0')

{

write_data(str);

str++;

}

}

/

名称:主程序

论坛:>

编写:Liang yun feng

日期:

修改:无

内容:

/

#include <REG52H>

#include <intrinsh>

#include <12846c>

#include <18b20c>

#define uint unsigned int

#define uchar unsigned char

/

函 数 名:未化成时屏幕显示及时间调整

功    能:

说    明:

调    用:

入口参数:

返 回 值:无

/

void show_time()   //液晶显示程序

{

display(1,2,"欢迎使用");

display(2,1,"蓄电池化成仪");

display(4,0,"按[Star]启动化成");

Delay1ms(100);                 //扫描延时

}

/

函 数 名:化成时屏幕显示

功    能:

说    明:

调    用:

入口参数:

返 回 值:无

/

void show_time_run()   //液晶显示程序

{

time_count();  //获取时钟芯片的时间数据

ReadTemp();                    //开启温度采集程序

temp_to_str();                 //温度数据转换成液晶字符

if(hour==22)

{TR0=0,mcout_z=mcout_f=1;

 display(1,0,"本次化成已完成");

display(2,0,"电池温度");

display(2,5,TempBuffer);       //显示温度液晶字符显示位置

display(2,6,"℃");

display(3,0,"请进行后续 *** 作");

display(4,2,TimeString); //显示时间

 goto output;

}

if(temp_value>45)

{if(TR0==1)

   {TR0=0;

    mcout_f=mcout_z=1;

   }

 display(1,0,"!!电池超温!!");

display(2,0,"电池温度");

display(2,5,TempBuffer);       //显示温度液晶字符显示位置

display(2,6,"℃");

display(3,1,"化成暂停!!!!");

display(4,2,TimeString); //显示时间

}

if(temp_value<45)

{if(TR0==0)

   {TR0=1;}

 display(1,0,"化成中请等侯");

display(2,0,"电池温度");

display(2,5,TempBuffer);       //显示温度液晶字符显示位置

display(2,6,"℃");

display(3,1,"已用化成时间");

display(4,2,TimeString); //显示时间

}

output:  Delay1ms(100);                 //扫描延时

}

/

函 数 名:主程序main()

功    能:

说    明:

调    用:

入口参数:

返 回 值:无

/

main()

{

lcdreset();          //初始化LCD屏

Init_DS18B20( ) ;    //DS18B20初始化

write_com(0x01);     //清除显示,并且设定地址指针为00H

delay(5);

while(1)

{

if(hc_start==0)

{show_time();     //液晶显示数据

key_scan();  //化成启动

   }

 if(hc_start==1)

   {

    show_time_run();  //液晶显示数据

}

}

}

1、温度传感器作为一个精准的温变电阻,温度不同阻值不同,PLC专门的热电阻模块可以测量出电阻通过内部计算出实际温度值,由于电缆有长度,会影响测量准度,会做电阻补偿。(如图所示)

2、冷端温度不同也回影响测量精度,所以会有冷端补偿。

3、温度传感器结合变送器将模拟信号,比如4-20ma,0-5v直接连接PLC,PLC通过读取信号,程序中设立4mA和20mA的分别对应的温度值,可以计算出传感器显示的温度。

4、温度变送器输出数字量,PLC就可以通过数字量模块直接接受。

扩展资料

如热电偶安装的位置及插入深度不能反映炉膛的真实温度等,换句话说,热电偶不应装在太靠近门和加热的地方,插入的深度至少应为保护管直径的8~10倍;热电偶的保护套管与壁间的间隔未填绝热物质致使炉内热溢出或冷空气侵入,因此热电偶保护管和炉壁孔之间的空隙应用耐火泥或石棉绳等绝热物质堵塞以免冷热空气对流而影响测温的准确性;热电偶冷端太靠近炉体使温度超过100℃;

热电偶的安装应尽可能避开强磁场和强电场,所以不应把热电偶和动力电缆线装在同一根导管内以免引入干扰造成误差;热电偶不能安装在被测介质很少流动的区域内,当用热电偶测量管内气体温度时,必须使热电偶逆着流速方向安装,而且充分与气体接触。

参考资料来源:百度百科-温度传感器

参考资料来源:百度百科-热电阻

我这有个现成的C源程序,你参考一下吧!

三通道18B20温度测量数码管显示。-55-+125℃,用1位数码管显示当前通道号,4位数码管显示18B20当前通道温度值(一位小数),负号位与正温度百位1用同一位数码管显示,该位为0不显示,如:0 279、1 1231、2 -356。连接方法:三个18B20均接P37,P0口(JP10)接8位数码管段码口(J12)。

#include <reg52h>

#include <intrinsh>

typedef unsigned char uint8;

typedef unsigned int uint16;

sbit ADDR0 = P2^2;

sbit ADDR1 = P2^3;//定义38译码器地址

sbit ADDR2 = P2^4;

uint8 x,h;//定义通道

uint16 ans,ansb[3],f,g,p; //ans各通道温度值,f符号值,g为小数部分,p为1秒的计数变量

code uint8 number[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x80};//0,1,2,3,4,5,6,7,8,9,-,灭,小数点

sbit DQ = P3^7; //温度DQ一线输入口

#define nops(); {_nop_(); _nop_(); _nop_(); _nop_();} //定义空指令

uint8 romid[3][8]={//romid二维数组存放每个芯片ROM编号

{0x28,0xA2,0xb4,0x0A,0x00,0x00,0x00,0x83},//0通道

{0x28,0xA2,0xb4,0x0A,0x03,0x00,0x00,0x83},//1通道

{0x28,0xA2,0xb4,0x0A,0x05,0x00,0x00,0x83},//2通道

};

// 定时器初始化

void T1_init(void)

{

TMOD = 0x10; //定时器1工作在方式1(显示扫描定时)

TH1 = 0xfc;

TL1 = 0x67;//T1定时1ms初值

TR1 = 1;//启动T1

}

void delay(uint16 n)

{

while (n--);

}

// 18B20复位函数

void DS18b20_reset(void)

{

bit flag=1;

while (flag)

{

while (flag)

{

DQ = 1;

delay(1);

DQ = 0;

delay(50); // 550us

DQ = 1; //给18B20发出复位信号

delay(6); // 66us

flag = DQ; //检测18B20发出的存在脉冲"0",判断复位是否成功

}

delay(45); //延时500us

flag = ~DQ; //18B20存在脉冲过后变"1",取反后仍为"0"

}

DQ=1;

}

//18B20写1个字节函数 向1-WIRE总线上写一个字节

void write_byte(uint8 val)

{

uint8 i;

for (i=0; i<8; i++)

{

DQ = 1;

_nop_();

DQ = 0;

nops(); //4us,110592晶振时每个时钟周期约1us

DQ = val & 0x01; //最低位移出

delay(6); //66us

val >>= 1; //右移一位

}

DQ = 1;

delay(1);

}

//18B20读1个字节函数 从1-WIRE总线上读取一个字节

uint8 read_byte(void)

{

uint8 i, value=0;

for (i=0; i<8; i++)

{

DQ=1;

_nop_();

value >>= 1;

DQ = 0;

nops(); //4us

DQ = 1;

nops(); //4us

if (DQ)

value|=0x80;

delay(6); //66us

}

DQ=1;

return(value);

}

// 启动温度转换

void start_temp_sensor(void)

{

DS18b20_reset();

write_byte(0xCC); // 发Skip ROM命令

write_byte(0x44); // 发转换命令

}

// 读出温度,多点多个18B20测温主程序:

void read_temp() //读取通道x的温度值

{

uint8 i,temp_data[2];//读出温度暂放

uint16 temp;

for(x=0;x<3;x++)

{

DS18b20_reset(); //复位

write_byte(0x55); // 发匹配ROM命令

for(i=0;i<8;i++)

write_byte(romid[x][i]);//写8位器件ID(从左到右),如:28 A2 b4 0A 03 00 00 83。

write_byte(0xBE);//读RAM命令,共9个字节,只取前两温度字节

temp_data[0]=read_byte(); //温度低8位

temp_data[1]=read_byte(); //温度高8位

temp=temp_data[1];//温度高字节

temp=temp<<8;//移到高8位中

temp+=temp_data[0];//温度低字节

ansb[x]=temp;

}

}

// 刷新5位数码管程序

void refresh()

{

static uint8 j = 0,a;//j为数码管位数,a为临时存放红外数据高或低4位

P0 = 0x00;//防止重影

switch(j)

{

case 0: ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;j++;//最右边一位数码管,一位小数

a=g625/1000;//只取小数点后一位,625把16进制换算成对应的10进制

P0 = number[a];break;

case 1: ADDR0 = 0;ADDR1 = 1;ADDR2 = 1;j++;

a = ans%10;//取个位

P0 = number[a];break;

case 2: ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;j++;

a = ans/10%10;//取十位

P0 = number[a];break;

case 3: ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;j++;

a = ans/100%10;//取百位

if (f!=0){a=10;}//若为负显示-号

else if (a!=1){a=11;}//若小于100度该位熄灭

P0 = number[a];break;//为1则正常显示

case 4: ADDR0 = 0;ADDR1 = 1;ADDR2 = 1;j++;

a = 12;//个位显示小数点

P0 = number[a];break;

case 5: ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;j=0; //通道显示

P0 = number[h];break;//显示通道号

default: break;

}

}

main()

{

T1_init();//定时器初始化

while(1)

{

if(TF1==1)

{

TF1 = 0;

TH1 = 0xfc;

TL1 = 0x67;

start_temp_sensor();//启动温度转换

p++;

if(p==1000)// 延时约1秒

{

read_temp();//读各通道温度值

switch(h)

{//切换温度显示通道

case 0: ans=ansb[1];h++;break;//1通道

case 1: ans=ansb[2];h++;break;//2通道

case 2: ans=ansb[0];h=0;break;//0通道

default: break;

}

f=ans&0xF800;//取符号位

g = ans&0x000f;//取小数部分

ans>>=4;//去除小数部分

if (f!=0)

{

ans=~ans+1;

}

p=0;

}

refresh();

}

}

}

东华理工大学毕业设计(论文)

基于单片机的热水器温度控制

摘 要

温度是日常生活中不可缺少的物理量,温度在各个领域都有积极的意义。很多行业中以及日常生活中都有大量的用电加热设备,如用于加热处理的加热热水器,用于洗浴的电热水器及各种不同用途的温度箱等,采用单片机对它们进行控制具有控制方便、简单、灵活性大等特点,而且还可以大幅提高被控系统的性能,从而能被大大提高产品的质量。因此,智能化温度控制技术正被广泛地应用。

本温度设计采用现在流行的AT89C51单片机为控制器,用PID控制方法,再配以其他电路对热水器的水温进行控制。

关键词:89C51; PID; 温度控制

I

1/41页

东华理工大学毕业设计(论文)

ABSTRACT

Temperature is essential physical in daily life ,and in various fields has positive implicationsA lot of businesses and daily lives have a lot of electric heating equipmentSuch as electric water heater for bathing and variety of different uses of the temperature boxes MCU to control them with easy to control,simple,flexibility and other characteristics,also can significantly improve the performance of the controlled system,which can be greatly improved product quality Therefore,intelligent temperature control technology is being widely used

The temperature control design uses the now popular AT89C51 MCU controller,with PID control method, which together with

有很多,也不知道是不是你要的。温度传感器

前言

温度传感器,使用范围广,数量多,居各种传感器之首。温度传感器的发展大致经历了以下3个阶段:

1传统的分立式温度传感器(含敏感元件),主要是能够进行非电量和电量之间转换。2模拟集成温度传感器/控制器。

3智能温度传感器。目前,国际上新型温度传感器正从模拟式想数字式、集成化向智能化及网络化的方向发展。

温度传感器的分类

温度传感器按传感器与被测介质的接触方式可分为两大类:一类是接触式温度传感器,一类是非接触式温度传感器。

接触式温度传感器的测温元件与被测对象要有良好的热接触,通过热传导及对流原理达到热平衡,这是的示值即为被测对象的温度。这种测温方法精度比较高,并可测量物体内部的温度分布。但对于运动的、热容量比较小的及对感温元件有腐蚀作用的对象,这种方法将会产生很大的误差。

非接触测温的测温元件与被测对象互不接触。常用的是辐射热交换原理。此种测稳方法的主要特点是可测量运动状态的小目标及热容量小或变化迅速的对象,也可测量温度场的温度分布,但受环境的影响比较大。

温度传感器的发展

1传统的分立式温度传感器——热电偶传感器

热电偶传感器是工业测量中应用最广泛的一种温度传感器,它与被测对象直接接触,不受中间介质的影响,具有较高的精度;测量范围广,可从-50~1600℃进行连续测量,特殊的热电偶如金铁——镍铬,最低可测到-269℃,钨——铼最高可达2800℃。

2模拟集成温度传感器

集成传感器是采用硅半导体集成工艺制成的,因此亦称硅传感器或单片集成温度传感器。模拟集成温度传感器是在20世纪80年代问世的,它将温度传感器集成在一个芯片上、可完成温度测量及模拟信号输出等功能。

模拟集成温度传感器的主要特点是功能单一(仅测量温度)、测温误差小、价格低、响应速度快、传输距离远、体积小、微功耗等,适合远距离测温,不需要进行非线性校准,外围电路简单。

2.1光纤传感器

光纤式测温原理

光纤测温技术可分为两类:一是利用辐射式测量原理,光纤作为传输光通量的导体,配合光敏元件构成结构型传感器;二是光纤本身就是感温部件同时又是传输光通量的功能型传感器。光纤挠性好、透光谱段宽、传输损耗低,无论是就地使用或远传均十分方便而且光纤直径小,可以单根、成束、Y型或阵列方式使用,结构布置简单且体积小。因此,作为温度计,适用的检测对象几乎无所不包,可用于其他温度计难以应用的特殊场合,如密封、高电压、强磁场、核辐射、严格防爆、防水、防腐、特小空间或特小工件等等。目前,光纤测温技术主要有全辐射测温法、单辐射测温法、双波长测温法及多波长测温等

211 全辐射测温法

全辐射测温法是测量全波段的辐射能量,由普朗克定律:

测量中由于周围背景的辐射、测试距离、介质的吸收、发射及透过率等的变化都会严重影响准确度。同时辐射率也很难预知。但因该高温计的结构简单,使用 *** 作方便,而且自动测量,测温范围宽,故在工业中一般作为固定目标的监控温度装置。该类光纤温度计测量范围一般在600~3000℃,最大误差为16℃。

212 单辐射测温法

由黑体辐射定律可知,物体在某温度下的单色辐射度是温度的单值函数,而且单色辐射度的增长速度较温度升高快得多,可以通过对于单辐射亮度的测量获得温度信息。在常用温度与波长范围内,单色辐射亮度用维恩公式表示:

213 双波长测温法

双波长测温法是利用不同工作波长的两路信号比值与温度的单值关系确定物体温度。两路信号的比值由下式给出:

际应用时,测得R(T)后,通过查表获知温度T。同时,恰当地选择λ1和λ2,使被测物体在这两特定波段内,ε(λ1,T)与ε(λ2,T)近似相等,就可得到与辐射率无关的目标真实温度。这种方法响应快,不受电磁感应影响,抗干扰能力强。特别在有灰尘,烟雾等恶劣环境下,对目标不充满视场的运动或振动物体测温,优越性显著。但是,由于它假设两波段的发射率相等,这只有灰体才满足,因此在实际应用中受到了限制。该类仪器测温范围一般在600~3000℃,准确度可达2℃。

214 多波长辐射测温法

多波长辐射测温法是利用目标的多光谱辐射测量信息,经过数据处理得到真温和材料光谱发射率。考虑到多波长高温计有n个通道,其中第i个通道的输出信号Si可表示为:

将式(9)~(13)中的任何一式与式(8)联合,便可通过拟合或解方程的方法求得温度T和光谱发射率。Coates[8,9]在1988年讨论了式(9)、(10)假设下多波长高温计数据拟合方法和精度问题。1991年Mansoor[10]等总结了多波长高温计数据拟合方法和精度问题。 该方法有很高的精度,目前欧共体及美国联合课题组的Hiernaut等人已研究出亚毫米级的6波长高温计(图4),用于2000~5000K真温的测量[11]。哈尔滨工业大学研制成了棱镜分光的35波长高温计,并用于烧蚀材料的真温测量。多波长高温计在辐射真温测量中已显出很大潜力,在高温,甚高温,特别是瞬变高温对象的真温测量方面,多波长高温计量是很有前途的仪器。该类仪器测温范围广,可用于600~5000℃温度区真温的测量,准确度可达±1%。

215 结 论

光纤技术的发展,为非接触式测温在生产中的应用提供了非常有利的条件。光纤测温技术解决了许多热电偶和常规红外测温仪无法解决的问题。而在高温领域,光纤测温技术越来越显示出强大的生命力。全辐射测温法是测量全波段的辐射能量而得到温度,周围背景的辐射、介质吸收率的变化和辐射率εT的预测都会给测量带来困难,因此难于实现较高的精度。单辐射测温法所选波段越窄越好,可是带宽过窄会使探测器接收的能量变得太小,从而影响其测量准确度。多波长辐射测温法是一种很精确的方法,但工艺比较复杂,且造价高,推广应用有一定困难。双波长测温法采用波长窄带比较技术,克服了上述方法的诸多不足,在非常恶劣的条件下,如有烟雾、灰尘、蒸汽和颗粒的环境中,目标表面发射率变化的条件下,仍可获得较高的精度

22半导体吸收式光纤温度传感器是一种传光型光纤温度传感器。所谓传光型光纤温度传感器是指在光纤传感系统中,光纤仅作为光波的传输通路,而利用其它如光学式或机械式的敏感元件来感受被测温度的变化。这种类型主要使用数值孔径和芯径大的阶跃型多模光纤。由于它利用光纤来传输信号,因此它也具有光纤传感器的电绝缘、抗电磁干扰和安全防爆等优点,适用于传统传感器所不能胜任的测量场所。在这类传感器中,半导体吸收式光纤温度传感器是研究得比较深入的一种。

半导体吸收式光纤温度传感器由一个半导体吸收器、光纤、光发射器和包括光探测器的信号处理系统等组成。它体积小,灵敏度高,工作可靠,容易制作,而且没有杂散光损耗。因此应用于象高压电力装置中的温度测量等一些特别场合中,是十分有价值的。

B 半导体吸收式光纤温度传感器的测温原理

半导体吸收式光纤温度传感器是利用了半导体材料的吸收光谱随温度变化的特性实现的。根据 的研究,在 20~972K 温度范围内,半导体的禁带宽度能量Eg 与

温度T 的关系为

"

3智能温度传感器

智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的。它是微电子技术、计算机技术和自动测试技术(ATE_)的结晶。目前,国际上已开发出多种智能温度传感器系列产品。智能温度传感器内部包含温度传感器、A/D传感器、信号处理器、存储器(或寄存器)和接口电路。有的产品还带多路选择器、中央控制器(CPU)、随机存取存储器(RAM)和只读存储器(ROM)。

智能温度传感器能输出温度数据及相关的温度控制量,适配各种微控制器(MCU),并且可通过软件来实现测试功能,即智能化取决于软件的开发水平。

31数字温度传感器。

随着科学技术的不断进步与发展,温度传感器的种类日益繁多,数字温度传感器更因适用于各种微处理器接口组成的自动温度控制系统具有可以克服模拟传感器与微处理器接口时需要信号调理电路和A/D转换器的弊端等优点,被广泛应用于工业控制、电子测温计、医疗仪器等各种温度控制系统中。其中,比较有代表性的数字温度传感器有DS1820、MAX6575、DS1722、MAX6635等。

一、DS1722的工作原理

1 、DS1722的主要特点

DS1722是一种低价位、低功耗的三总线式数字温度传感器,其主要特点如表1所示。

2、DS1722的内部结构

数字温度传感器DS1722有8管脚m-SOP封装和8管脚SOIC封装两种,其引脚排列如图1所示。它由四个主要部分组成:精密温度传感器、模数转换器、SPI/三线接口电子器件和数据寄存器,其内部结构如图2所示。

开始供电时,DS1722处于能量关闭状态,供电之后用户通过改变寄存器分辨率使其处于连续转换温度模式或者单一转换模式。在连续转换模式下,DS1722连续转换温度并将结果存于温度寄存器中,读温度寄存器中的内容不影响其温度转换;在单一转换模式,DS1722执行一次温度转换,结果存于温度寄存器中,然后回到关闭模式,这种转换模式适用于对温度敏感的应用场合。在应用中,用户可以通过程序设置分辨率寄存器来实现不同的温度分辨率,其分辨率有8位、9位、10位、11位或12位五种,对应温度分辨率分别为10℃、05℃、025℃、0125℃或00625℃,温度转换结果的默认分辨率为9位。DS1722有摩托罗拉串行接口和标准三线接口两种通信接口,用户可以通过SERMODE管脚选择通信标准。

3、DS1722温度 *** 作方法

传感器DS1722将温度转换成数字量后以二进制的补码格式存储于温度寄存器中,通过SPI或者三线接口,温度寄存器中地址01H和02H中的数据可以被读出。输出数据的地址如表2所示,输出数据的二进制形式与十六进制形式的精确关系如表3所示。在表3中,假定DS1722 配置为12位分辨率。数据通过数字接口连续传送,MSB(最高有效位)首先通过SPI传输,LSB(最低有效位)首先通过三线传输。

4、DS1722的工作程序

DS1722的所有的工作程序由SPI接口或者三总线通信接口通过选择状态寄存器位置适合的地址来完成。表4为寄存器的地址表格,说明了DS1722两个寄存器(状态和温度)的地址。

1SHOT是单步温度转换位,SD是关闭断路位。如果SD位为“1”,则不进行连续温度转换,1SHOT位写入“1”时,DS1722执行一次温度转换并且把结果存在温度寄存器的地址位01h(LSB)和02h(MSB)中,完成温度转换后1SHOT自动清“0”。如果SD位是“0”,则进入连续转换模式,DS1722将连续执行温度转换并且将全部的结果存入温度寄存器中。虽然写到1SHOT位的数据被忽略,但是用户还是对这一位有读/写访问权限。如果把SD改为“1”,进行中的转换将继续进行直至完成并且存储结果,然后装置将进入低功率关闭模式。

传感器上电时默认1SHOT位为“0”。R0,R1,R2为温度分辨率位,如表5所示(x=任意值)。用户可以读写访问R2,R1和R0位,上电默认状态时R2=“0”,R1=“0”,R0=“1”(9位转换)。此时,通信口保持有效,用户对SD位有读/写访问权限,并且其默认值是“1”(关闭模式)。

二、智能温度传感器DS18B20的原理与应用

DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。可以分别在9375 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。

2DS18B20的内部结构

DS18B20采用3脚PR35封装或8脚SOIC封装,其内部结构框图如图1所示。

(1) 64 b闪速ROM的结构如下:�

开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前56位的CRC校验码,这也是多个DS18B20可以采用一线进行通信的原因。

(2) 非易市失性温度报警触发器TH和TL,可通过软件写入用户报警上下限。

(3) 高速暂存存储器

DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E�2RAM。后者用于存储TH,TL值。数据先写入RAM,经校验后再传给E�2RAM。而配置寄存器为高速暂存器中的第5个字节,他的内容用于确定温度值的数字转换分辨率,DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。该字节各位的定义如下:

低5位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动,R1和R0决定温度转换的精度位数,即是来设置分辨率,如表1所示(DS18B20出厂时被设置为12位)。�

由表1可见,设定的分辨率越高,所需要的温度数据转换时间就越长。因此,在实际应用中要在分辨率和转换时间权衡考虑。

高速暂存存储器除了配置寄存器外,还有其他8个字节组成,其分配如下所示。其中温度信息(第1,2字节)、TH和TL值第3,4字节、第6~8字节未用,表现为全逻辑1;第9字节读出的是前面所有8个字节的CRC码,可用来保证通信正确。�

当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1,2字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0�062 5 ℃/LSB形式表示。温度值格式如下:�

对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值。表2是对应的一部分温度值。�

DS18B20完成温度转换后,就把测得的温度值与TH,TL作比较,若T>TH或T<TL,则将该器件内的告警标志置位,并对主机发出的告警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行告警搜索。

(4) CRC的产生

在64 b ROM的最高有效字节中存储有循环冗余校验码(CRC)。主机根据ROM的前56位来计算CRC值,并和存入DS18B20中的CRC值做比较,以判断主机收到的ROM数据是否正确。�

3DS18B20的测温原理

DS18B20的测温原理如图2所示,图中低温度系数晶振的振荡频率受温度的影响很小〔1〕,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在�-55 ℃�所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。

另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种 *** 作必须按协议进行。 *** 作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器 *** 作命令→处理数据。各种 *** 作的时序图与DS1820相同,可参看文献〔2〕。�

4DS18B20与单片机的典型接口设计

以MCS51单片机为例,图3中采用寄生电源供电方式, P1�1口接单线总线为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管和89C51的P1�0来完成对总线的上拉〔2〕。当DS18B20处于写存储器 *** 作和温度A/D变换 *** 作时,总线上必须有强的上拉,上拉开启时间最大为10 μs。采用寄生电源供电方式是VDD和GND端均接地。由于单线制只有一根线,因此发送接收口必须是三态的。主机控制DS18B20完成温度转换必须经过3个步骤:初始化、ROM *** 作指令、存储器 *** 作指令。假设单片机系统所用的晶振频率为12 MHz,根据DS18B20的初始化时序、写时序和读时序,分别编写3个子程序:INIT为初始化子程序,WRITE为写(命令或数据)子程序,READ为读数据子程序,所有的数据读写均由最低位开始,实际在实验中不用这种方式,只要在数据线上加一个上拉电阻47 kΩ,另外2个脚分别接电源和地。�

5DS18B20的精确延时问题

虽然DS18B20有诸多优点,但使用起来并非易事,由于采用单总线数据传输方式,DS18B20的数据I/O均由同一条线完成。因此,对读写的 *** 作时序要求严格。为保证DS18B20的严格I/O时序,需要做较精确的延时。在DS18B20 *** 作中,用到的延时有15 μs,90 μs,270 μs,540 μs等。因这些延时均为15 μs的整数倍,因此可编写一个DELAY15(n)函数,源码如下:

只要用该函数进行大约15 μs×N的延时即可。有了比较精确的延时保证,就可以对DS18B20进行读写 *** 作、温度转换及显示等 *** 作。

32智能温度传感器发展的新趋势

(1)提高测温精度和分辨力

智能温度传感器,采用的是8位A/D转换器,其测温精度较低,分辨力只能达到1℃。目前国外已相继推出多种高速度、高分辨力的智能温度传感器,所用的是9~12位A/D转换器,分辨力一般可达05~00625℃。由美国DALLAS半导体公司新研制的DS1624型高分辨力智能温度传感器,能输出13位二进制数据,其分辨力高达003125℃,测温精度为±02℃。为了提高多通道智能温度传感器的转换速率,也有的芯片采用高速逐次逼近式A/D转换器。已AD7817型5通道智能温度传感器为例,它对本地传感器、每一路远程传感器的转换时间仅为27微秒、9微秒。

(2)增加测试功能

温度传感器的测试功能也在不断增强。例如,DS1629型单线智能温度传感器增加了实时日历时钟(RTC),使其功能更加完善。DS1624还增加了存储功能,利用芯片内部256字节的EEPROM存储器,可存储用户的短信息。另外,智能温度传感器正从单通道想多通道的方向发展,这为研制和开发多路温度测控系统创造了良好条件。

传感器都具有多种工作模式可供选择,主要包括单次转换模式、连续转换模式、待机模式,有的还增加了低温极限扩展模式, *** 作非常简便。对某些智能温度传感器而言,主机(外部微处理器或单片机)还可通过相应的寄存器来设定其A/D转换速率,分辨力及最大转换时间。

你可以去>

我有现成的C源代码,你参考吧!

三通道18B20温度测量的数字显示。 -55 - +125°C,用数码管显示当前的信道数,四位数码显示18B20电流通道的温度值(小数点后一位),负号位和正温度百用数码管显示,位0:279,1 1231,2 -356。连接方法:连接三个18B20 P37 P0口(JP10),8位数字代码端口(J12)。

#包括

#包括

typedef的无符号字符型UINT8;

的typedef为unsigned int UINT16;

SBIT ADDR0 = P2 ^ 2

SBIT ADDR1 = P2 ^ 3 ;/ /定义38解码器地址

SBIT ADDR2 = P2 ^ 4;

UINT8所述的,H ;/ /定义通道

UINT16 ANS,ANSB [3],F,G,P,/ / ANS每个通道的温度值,F符号价值,g是小数部分,p是1秒计数变量的

码UINT8号码[] = {0X3F, 0X06,0x5b,0X4F,0x66,0x6d,0x7d,0X07,到0x7f,0x67,0X40,0X00,0X80} ;/ / 0,1,2,3,4,5,6,7,8,9, - ,小数点的的SBIT DQ的

= P3 ^ 7 / /温度DQ第一行输入

#定义的NOP(){_nop_(); _nop_(); _nop_(); _nop_( );} / /定义空指令

UINT8 romid [3] [8] = {/ / romid二维数组来存储每个芯片的ROM ID

{为0x28,0xA2,0xB4,0X0A,0X00为0x28,0X00,0X00,0X83},/ / 0通道

{为0x28,0xA2,0xB4,0X0A,0X03,0X00,0X00,0X83} / /?通道

{0xA2 0xB4,0X0A,0X05,0X00,0X00,0X83} / /??2通道

/ /定时器初始化

无效T1_init的(无效)

> {

TMOD = 0X10; / /定时器1在模式1(显示扫描时序)

TH1 = 0xfc的;

TL1 = 0x67 ;/ / 1ms的初始T1定时器 - TR1 = 1 ;/ /启动T1

}

无效延迟(UINT16 N)

{

(N - );

} BR p> / / 18B20复位功能

无效的DS18b20_reset(无效)

{

位标志= 1;

(旗),

{ BR />(旗)

DQ = 1;

延迟(1);

DQ = 0;

延迟(50); / / 550us

DQ = 1; / / 18B20发出复位信号延迟

(6); / / 66us,

标志= DQ / /应答脉冲检测18B20下发了“0”,以确定是否复位成功}

延迟(45)/ /延时500us的

标志= DQ; / / 18B20变为“1”倒后仍然存在脉冲“0”

}

DQ = 1;

}

/ / 18B20写一个字节的功能写一个字节

1-WIRE总线无效WRITE_BYTE(UINT8值) BR /> { UINT8;

(I = 0; <8; + +)

{

DQ = 1;

_nop_(); ,

DQ = 0;

NOPS(); / / 4US 110592晶体每个时钟周期约1us的,

DQ =值0X01; / /最小排量出

延迟(6 )/ / 66us 值>> = 1; / /移位

}

DQ = 1;

延迟(1);

}

<br / / 18B20读函数来读取一个字节一个字节

1-WIRE总线UINT8 READ_BYTE(无效)/> { UINT8 I,值= 0;

>就(i = 0; <8; + +)

{

DQ = 1;

_nop_();

值>> = 1;

DQ = 0;

NOPS(); / / 4US

DQ = 1;

NOPS(); / / 4US

(DQ)

值= 80H时

延迟(6); / / 66us,

}

DQ = 1;

回报率(值);}

/ /开始温度转换

的虚空start_temp_sensor(无效)

{

DS18b20_reset的();

WRITE_BYTE跳过ROM命令(含有0xCC); / /毛

WRITE_BYTE(0×44)/ /接收转换命令

}

/ /读出的温度,多点18B20温度主程序::

无效read_temp()/ /读取通道x值的温度

{

UINT8我temp_data [2] ;/ /读取的温度垃圾箱

UINT16温度;

(X = 0,X <3 X + +)

{

DS18b20_reset()/ /重新设置

WRITE_BYTE(0x55的); / /匹配ROM命令

就(i = 0; <8 + +)

WRITE_BYTE(romid [] []);/ /写8位器件ID(左到右),如:28 A2 B4 0A 03 00 00 83。

WRITE_BYTE(从0xBE);/ /读取RAM命令,一共有9个字节,只取两个温度,

temp_data [0] = READ_BYTE(); / /低温8字节

temp_data [1] = READ_BYTE(); / / 8

温度= temp_data [1] ;/ /温度高字节

温度=温度<< 8 ;/ /移动到高温8

温度+ = temp_data [0] ;/ /温度低字节

ANSB [X] =温度;

}

/ /刷新5个数字控制程序

无效刷新()

{

静态UINT8 J = 0,一个;/ / J的数字位数,临时存储的红外数据高或低4

P0 = 0X00 ;/ /防止鬼影

开关(J)

{情况下0:ADDR0 = ADDR1; = 1; ADDR2 = 1; J + +; A /数码管,最右边的数字十进制

= G 625/1000 ;/ /只有小数点后的625 16 229转换成相应的十进制

P0 =数字[一]断;

案例1:ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; J + +;

= ANS%10 ;/ /位

P0 =数字[A];打破;

案例2:ADDR0 = 1; ADDR1 = 0; ADDR2 = 1; J + +;

一个= ans/10%10 ;/ /取十

P0 = [休息

案例3:ADDR0 = 0; ADDR1 = 0; ADDR2 = 1; J + +;

一个= ans/100%10 ;/ /百

( f = 0){= 10;} / /负 -

其他(A! = 1){A = 11;} / /如果小于100度熄灭

P0 =号[休息;/ /正常显示

案例4:ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; J + +;

= 12 ;/ /位小数点

> P0 = [];突破;

案例5:ADDR0 = 0; ADDR1 = 1; ADDR2 = 0 = 0,/ /通道显示

P0 =号[H]打破;/ /显示的频道号码

默认值:打破;

}

}

主要()

{

T1_init() ;/ /定时器初始化

(1)

{

如果(TF1 == 1)

{

TF1 = 0;

TH1 = 0xfc的;

TL1 = 0x67;

start_temp_sensor();/ /启动温度转换

+ +;

(P == 1000)/ / 1秒左右的延迟

> {

read_temp();/ /读取温度值的每个通道

开关(H)

{/ /切换温度显示通道

CASE 0:ANS = ANSB [1 ,H + +;打破;/ / 1通道

案例1:ANS = ANSB [2],H + +;休息;/ / 2通道

案例2:ANS = ANSB [0] H = 0;打破;/ / 0通道

默认值:打破;}

F = ANS &0xF800; / /符号位

G = ANS &0x000f; / /小数部分

答案>> = 4 ;/ /删除小数部分

(f! = 0)

{

ANS =答+1;

>}

P = 0;

}

刷新();

}

}

}

以上就是关于用液晶12864和DS18B20传感器做的温度传感器为什么不会变化,老是显示85度全部的内容,包括:用液晶12864和DS18B20传感器做的温度传感器为什么不会变化,老是显示85度、温度传感器如何与PLC相连接、请教关于DS18B20温度传感器的温度读取等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9498707.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存