实验四DS18B20温度实验学号:2013301510068姓名:曾琼颖班级:2013级微电班【1】实验目的:用一片DS18B20构成测温系统,测量的温度精度达到0.1度,用8位数码管显示出来。【2】实验原理[1]DS18B20基本知识DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。1、DS18B20产品的特点(1)、只要求一个端口即可实现通信。(2)、在DS18B20中的每个器件上都有独一无二的序列号。(3)、实际应用中不需要外部任何元器件即可实现测温。(4)、测量温度范围在-55。C到+125。C之间。(5)、数字温度计的分辨率用户可以从9位到12位选择。(6)、内部有温度上、下限告警设置。2、DS18B20的引脚介绍表1DS18B20详细引脚功能描述序号名称引脚功能描述1GND地信号2DQ数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。3VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。3.DS18B20的使用方法由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。DS18B20的复位时序DS18B20的读时序对于DS18B20的读时序分为读0时序和读1时序两个过程。对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。DS18B20的写时序对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。4.DS18B20的处理数据DS18B20的高速暂存存储器由9个字节组成,其分配如图3所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。高速暂存存储器分配图DS18B20温度数据表温度/0C二进制表示十六进制表示符号位(5位)数据位(11位)+125000001111101000007D0H+25.062500000001100100010191H+10.125000000001010001000A2H+0.500000000000010000008H000000000000000000000H-0.51111111111111000FFF8H-10.1251111111101011110FF5EH-25.6251111111001101111FE6FH-551111110010010000FC90H上表是DS18B20温度采集转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于或等于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。温度转换计算方法举例:例如当DS18B20采集到+125℃的实际温度后,输出为07D0H,则:实际温度=07D0H╳0.0625=2000╳0.0625=1250C。例如当DS18B20采集到-55℃的实际温度后,输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作为计算),则:实际温度=370H╳0.0625=880╳0.0625=550C。【3】实验步骤:1.打开Keil编译器,创建项目:Project---NewuVisionProject,创建一个文件夹来放工程相关的文件,给工程项目命名为mywork,点击保存。2.选择芯片类型,这里选择ATMEL------AT89C52这个芯片。3.把C文件添加到我们的工程文件里。4.在test.c这个文档里编辑代码。5.编译通过之后,我们需要输出hex文件,也就是单片机可执行的二进制文件。6.利用STC-ISP将编写好的程序烧写进单片机中。7.如下图连接试验相关模块连线:(插上18B20注意:18B20弧形一面朝上)【4】实验代码#includereg52.hunsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};sbitDQ=P3^7;unsignedchartempL=0;unsignedchartempH=0,Z1,Z2,Z3,Z4;inttemperature,d;voiddelay(unsignedintk)//延时子程序//{while(k--);}voiddelay1(void)//数码管延时子程序//{intk;for(k=0;k400;k++){;}}voiddatado(unsignedintk)//温度调整//{Z1=k/1000;Z2=(k%1000)/100;Z3=(k%100)/10;Z4=k%10;}voiddisplay(void)//数码管显示子程序//{if(d==0){P2=0x00;P0=0x00;}else{P2=0x00;P0=0x40;}P2=0x012;P0=table[Z1];delay1();P2=0x022;P0=table[Z2]+0x80;delay1();P2=0x032;P0=table[Z3];delay1();P2=0x042;P0=table[Z4];delay1();P0=0x00;}Init_DS18B20(void)//DS16B20初始化程序//{unsignedcharx=0;DQ=1;DQ=0;delay(85);DQ=1;delay(14);}Readonechar(void)//向DS16B20读一个字节的数据//{unsignedchari=0;unsignedchardat=0;for(i=8;i0;i--){DQ=1;delay(1);DQ=0;dat=1;DQ=1;if(DQ)dat|=0x80;delay(4);}return(dat);}Writeonechar(unsignedchardat)//向DS16B20写一个字节的数据//{{unsignedchari=0;for(i=8;i0;i--){DQ=0;DQ=dat&0x01;delay(5);DQ=1;dat=1;}delay(4);}}Readtemperature(void){intT;Init_DS18B20();Writeonechar(0xcc);Writeonechar(0x44);delay(125);Init_DS18B20();Writeonechar(0xcc);Writeonechar(0x4e);Writeonechar(0x4f);Writeonechar(0x5f);Writeonechar(0x7f);Init_DS18B20();Writeonechar(0xcc);Writeonechar(0xbe);tempL=Readonechar();tempH=Readonechar();T=tempL+tempH*256;d=T&0x8000;if(T&0x8000){T=~T;T=T+1;}temperature=(int)(T*6.25);return(temperature);}voidmain()//主函数//{inti;while(1){i=Readtemperature();datado(i);display();delay(200);}}【5】实验现象在八位数码管上观察当前温度,第一位为符号位,当为正温度时,无显示。其余位依次显示温度,示数精确到小数点后两位。用手触DS18B20后,温度发生变化,显示温度变化精度达到0.1℃。