传感器技术课程设计分数:题目:温度传感器完成人:时间:二○一一年六月焦作师专《专业课程设计(一)》课程设计说明书2目录一.封面二.内容1.技术指标.........................32.设计方案及其比较.................32.1方案一........................32.2方案二.......................32.3方案比较......................33.实现方案.........................43.1组成..........................43.2关于DS18B20的详细介绍.............43.3工作原理图.....................73.4电路程序.......................84.调试过程及结论..................185.心得体会........................186.参考文献........................19焦作师专《专业课程设计(一)》课程设计说明书31.技术指标①独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯;②测温范围为-55℃-+125℃,测量分辨率为0.0625℃;③工作电源:3~5V;④适配各种单片机或系统机;⑤在使用中不需要任何外围元件;⑥内含寄生电源。2.设计方案及其比较2.1方案一采用热敏电阻,热敏电阻精度,重复性,可靠性较差,对于检测1摄氏度的信号是不适用的,也不能满足测量范围。在温度测量系统中,也采用单片温度传感器,比如ADS90,LM35等。但这些芯片输出的都是模拟信号,必须经过A/D转换后才能送给计算机,这样就使测温系统的硬件结构较复杂。另外,这种测温系统难以实现多点测温,也要用到复杂的算法,一定程度导航也增加了软件实现的难度。2.2方案二采用单总线数字温度传感器DS18B20温度测量温度,直接输出数据信号。便于单片机处理及控制,节省硬件电路。而且该芯片的物理化学性很稳定,此元件线形性能好,在0-100摄氏度时,最大线形偏差小于1摄氏度。DS18B20最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C51构成的温度装置,它直接输出温度的数字信号到微控制器。每只DS18B20具有一个独有的不可修改的64位序列号,根据序列号可访问不同的器件。这样一条总线上可挂接多个DS18B20传感器,实现多点温度测量,轻松的组建传感网络。2.3方案比较综上所述,选择方案二3.实现方案焦作师专《专业课程设计(一)》课程设计说明书43.1组成采用AT89S52单片机作为控制核心对温度传感器DS18B20控制,按照系统设计的要求,系统由3个模块组成:主控制器,测温电路和显示电路。3.2关于DS18B20的详细介绍1论述DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使DS18B20非常适用于远距离多点温度检测系统。2DS18B20的内部结构DS18B20内部结构如图1,主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如图2所示,DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端。ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X8+X5+X4+1)。ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。3DS18B20工作原理控制DS18B20指令:33H-读ROM55H-匹配ROMF0H-搜索ROMCCH-跳过ROMECH-告警搜索命令44H-温度转换BEH-读暂存器4EH-写暂存器48H-复制暂存器B8H-重调E2PROMB4H-读供电方式4DS18B20工作流程焦作师专《专业课程设计(一)》课程设计说明书5(1)初始化①数据线置高电平1;②延时;③数据线拉到低电平0;④延时750us;⑤数据线拉到高电平1;⑥延时等待;将数据线再次拉到高电平后结束。(2)写数据①数据线置低电平0;②延时15us;③发送数据;④延时45us;⑤数据线拉到高电平1;⑥重复上述步骤,最后将数据线拉到1。(3)读数据①数据线置高电平1;②延时;③将数据线拉低到0;④延时;⑤数据线拉到高电平1,延时;⑥读数据线的状态并处理,延时,重复①-⑤。焦作师专《专业课程设计(一)》课程设计说明书6图1写时序读时序3.3工作原理图焦作师专《专业课程设计(一)》课程设计说明书7焦作师专《专业课程设计(一)》课程设计说明书83.4电路程序#includereg52.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitled0=P1^0;sbitled1=P1^1;sbitled2=P1^2;sbitled3=P1^3;sbitDQ=P2^2;//数据口defineinterfacesbitdula=P2^6;//数码管段选sbitwela=P2^7;//数码管位选sbitbeep=P2^3;uintwarn_11=340;uintwarn_12=300;焦作师专《专业课程设计(一)》课程设计说明书9uinttemp;//温度值variableoftemperature//不带小数点unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//带小数点unsignedcharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};/*************精确延时函数*****************/voiddelay(unsignedchari){while(--i);}/******************************************此延时函数针对的是12Mhz的晶振delay(0):延时518us误差:518-2*256=6delay(1):延时7us(原帖写5us是错的)焦作师专《专业课程设计(一)》课程设计说明书10delay(10):延时25us误差:25-20=5delay(20):延时45us误差:45-40=5delay(100):延时205us误差:205-200=5delay(200):延时405us误差:405-400=5*******************************************//*****************DS18B20******************/voidInit_Ds18b20(void)//DS18B20初始化sendresetandinitializationcommand{DQ=1;//DQ复位,不要也可行。delay(1);//稍做延时DQ=0;//单片机拉低总线delay(250);//精确延时,维持至少480usDQ=1;//释放总线,即拉高了总线delay(100);//此处延时有足够,确保能让DS18B20发出存在脉冲。}ucharRead_One_Byte()//读取一个字节的数据readabytedate焦作师专《专业课程设计(一)》课程设计说明书11//读数据时,数据以字节的最低有效位先从总线移出{uchari=0;uchardat=0;for(i=8;i0;i--){DQ=0;//将总线拉低,要在1us之后释放总线//单片机要在此下降沿后的15us内读数据才会有效。_nop_();//至少维持了1us,表示读时序开始dat=1;//让从总线上读到的位数据,依次从高位移动到低位。DQ=1;//释放总线,此后DS18B20会控制总线,把数据传输到总线上delay(1);//延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分if(DQ==1)//控制器进行采样{焦作师专《专业课程设计(一)》课程设计说明书12dat|=0x80;//若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0}delay(10);//此延时不能少,确保读时序的长度60us。}return(dat);}voidWrite_One_Byte(uchardat){uchari=0;for(i=8;i0;i--){DQ=0;//拉低总线_nop_();//至少维持了1us,表示写时序(包括写0时序或写1时序)开始DQ=dat&0x01;//从字节的最低位开始传输//指令dat的最低位赋予给总线,必须在拉低总线后的15us内,//因为15us后DS18B20会焦作师专《专业课程设计(一)》课程设计说明书13对总线采样。delay(10);//必须让写时序持续至少60usDQ=1;//写完后,必须释放总线,dat=1;delay(1);}}uintGet_Tmp()//获取温度getthetemperature{floattt;uchara,b;Init_Ds18b20();//初始化Write_One_Byte(0xcc);//忽略ROM指令Write_One_Byte(0x44);//温度转换指令Init_Ds18b20();//初始化Write_One_Byte(0xcc);//忽略ROM指令Write_One_Byte(0xbe);//读暂存器指令a=Read_One_Byte();//读取到的第一个字节为温焦作师专《专业课程设计(一)》课程设计说明书14度LSBb=Read_One_Byte();//读取到的第一个字节为温度MSBtemp=b;//先把高八位有效数据赋于temptemp=8;//把以上8位数据从temp低八位移到高八位temp=temp|a;//两字节合成一个整型变量tt=temp*0.0625;//得到真实十进制温度值//因为DS18B20可以精确到0.0625度//所以读回数据的最低位代表的是0.0625度temp=tt*10+0.5;//放大十倍//这样做的目的将小数点后第一位也转换为可显示数字//同时进行一个四舍五入操作。returntemp;}焦作师专《专业课程设计(一)》课程设计说明书15/****************数码码动态显示函数**************/voidDisplay(uinttemp)//显示程序{ucharA1,A2,A3;A1=temp/100;//百位A2=temp%100/10;//十位A3=temp%10;//个位dula=0;P0=table[A1];//显示百位dula=1;//打开段选,对应74573的锁存位,高电平不锁存dula=0;wela=0;P0=0xfe;wela=1;//打开位选wela=0;delay(0);dula=0;P0=table1[A2];//显示十位,使用的是有小数点的数组(因焦作师专《专业课程设计(一)》课程设计说明书16为temp值扩大了10倍,虽然是十位,实际为个位)dula=1;dula=0;wela=0;P0=0