《温度传感器工作原理》由会员分享,可在线阅读,更多相关《温度传感器工作原理(13页珍藏版)》请在金锄头文库上搜索。
1、温度传感器设计总体设计框图本方案设计的系统由单片机系统、数字温度传感器、数码管显示模块组成,其总体架构如下图。单片机测温电路显示电路驱动电路单片机系统本设计采用STC89C52单片机作为控制器,完成所有功能的控制,包括:l DS18B20数字温度传感器的初始化和读取温度值l LED数码管显示驱动与控制数字温度传感器模块DS18B20性能l 测温范围-55+125,以0.5递增l 可编程的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625l 温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字DS18B20外形及引脚说明DS18B20外形
2、及引脚l GND:地l DQ:单线运用的数据输入/输出引脚l VD:可选的电源引脚软件设计主程序模块主程序需要调用1个子程序为:l 实时温度显示子程序:驱动数码管把实时温度值送出在LED数码管显示读温度值模块读温度值模块需要调用4个子程序,分别为:l DS18B20初始化子程序:让单片机知道DS18B20在总线上且已准备好操作l DS18B20写字节子程序:对DS18B20发出命令l DS18B20读字节子程序:读取DS18B20存储器的数据l 延时子程序:对DS18B20操作时的时序控制DS18B20测温流程数码管显示转换成显示码读暂存器跳过ROM匹配延时IS 温度变换跳过ROM匹配初始化D
3、S18B20按照此步骤,程序设计时首先就要执行初始程序化程序 INI10,其次将要跳过ROM匹配命令(代码CCH)写入到DS18B20中,此时需根据数字温度传感器写时序编写对DS18B20一个写入字节程序WRITE,将跳过ROM匹配命令写入DS18B20。为了完成温度启动转换,需要将启动转换命令写入DS18B20中。用延时750ms等待转换完成。随后再按照初始化时序执行初始化程序INI10,用写入一个字节程序将匹配ROM命令(代码为55h)写入到DS18B20中。为了完成读便笺式存储器操作,需要先结合数字温度传感器写时序将读便笺式存储器命令(代码为BEH)写入到DS18B20中,再用温度传感器
4、读时序编写的每一个字节程序READ,连续读取DS18B20便笺式存储器中9个字节的内容。由此可见。结合上述所介绍的初始化时序,温度传感器写时序和温度传感器读时序,才可以将所需的命令写入与读出,完成温度的正确读取。软件程序数码管显示温度程序:/头文件:#include reg51.h#include ds18b20.h/引入DS18B20头文件/变量定义:unsigned char ly_dis4;/定义显示缓冲区code unsigned char table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/表:共阳数码管 0-9 unsi
5、gned char l_posit=0;/显示位置/引脚定义:sbitSMG_q = P10;/定义数码管阳级控制脚(千位)sbitSMG_b = P11;/定义数码管阳级控制脚(百位)sbit SMG_s = P12;/定义数码管阳级控制脚(十位)sbitSMG_g = P13;/定义数码管阳级控制脚(个位)/函数声明:void display(void);/显示函数,显示缓冲区内容void delay(void); /主函数,C语言的入口函数:void main()unsignedinti=0;floattt;intltemp;while(1)if(i=0)tmpchange(); /温度
6、转换if(i=100)tt=tmp()*0.0625; /得到真实十进制温度值,因为DS18B20/可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。ltemp=tt*10+0.5; /放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。if(ltemp3)l_posit=0;/延时子函数,短暂延时void delay(void)unsigned char i=10;while(i-);读温度值模块程序: /*DS18B20.H*/*宏定义*/#define uchar unsigned char#define uint unsigned i
7、nt/*IO引脚定义*/sbit DS=P32; /定义DS18B20接口/*延时子函数 */voiddelayb(uint count)uinti;while(count) i=200;while(i0)i-;count-; /*DS18B20初始化*/voiddsreset(void)uinti; DS=0;i=103;while(i0)i-; DS=1;i=4;while(i0)i-;/*读一位*/bittmpreadbit(void)uinti;bitdat; DS=0;i+; /小延时一下 DS=1;i+;i+;dat=DS;i=8;while(i0)i-;return (dat);
8、/*读一个字节*/uchartmpread(void)uchari,j,dat;dat=0;for(i=1;i=8;i+) j=tmpreadbit();dat=(j1); /读出的数据最低位在最前面,这样刚好/一个字节在DAT里 return(dat); /将一个字节数据返回/*写一个字节*/voidtmpwritebyte(uchardat)uinti;uchar j;bittestb;for(j=1;j1; if(testb) / 写1部分 DS=0;i+;i+; DS=1;i=8;while(i0)i-; else DS=0; /写0部分i=8;while(i0)i-; DS=1;i+
9、;i+; /*发送温度转换命令*/voidtmpchange(void)dsreset(); /初始化DS18B20delayb(1); /延时tmpwritebyte(0xcc); / 跳过序列号命令tmpwritebyte(0x44); /发送温度转换命令/*获得温度*/inttmp()int temp;uchara,b;dsreset();delayb(1);tmpwritebyte(0xcc); tmpwritebyte(0xbe); /发送读取数据命令 a=tmpread(); /连续读两个字节数据 b=tmpread();temp=b;temp=8; temp=temp|a; /两字节合成一个整型变量。 return temp; /返回温度值/*