网站导航: 首页 > 设计参考 > 正文 文章搜索
用DS18B20构成测温系统[图]
 
文章编号:
081207181116
文章分类: 单片机 51系列
点 击:
...
关 键 词: DS18B20,测温
文章来源:
网络
摘 要:
设计方案:用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+100度之间,用8位数码管显示出来

1、设计方案

    用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+100度之间,用8位数码管显示出来。
2、工作原理

DS18B20基本知识
    DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。

    1)、DS18B20产品的特点

  (a)、只要求一个端口即可实现通信。
  (b)、在DS18B20中的每个器件上都有独一无二的序列号。
  (c)、实际应用中不需要外部任何元器件即可实现测温。
  (d)、测量温度范围在-55。C到+125。C之间。
  (e)、数字温度计的分辨率用户可以从9位到12位选择。
  (f)、内部有温度上、下限告警设置。

    2)、DS18B20的引脚介绍
    TO-92封装的DS18B20的引脚排列见下图,其引脚功能描述见表1。

 
表1DS18B20详细引脚功能描述

序号                名称                        引脚功能描述

1                      GND                         地信号

2                        DQ                         数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。

3                       VDD                      可选择的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之内就得释放单总线。
 
3、电路图
 
4、源程序

 
  1. #include <AT89X52.H>   
  2.   
  3. #include <INTRINS.h>   
  4.   
  5. unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,   
  6.   
  7. 0xef,0xdf,0xbf,0x7f};   
  8.   
  9. unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,   
  10.   
  11. 0x66,0x6d,0x7d,0x07,   
  12.   
  13. 0x7f,0x6f,0x77,0x7c,   
  14.   
  15. 0x39,0x5e,0x79,0x71,0x00,0x40};   
  16.   
  17. unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,   
  18.   
  19. 25,28,31,34,38,41,44,48,   
  20.   
  21. 50,53,56,59,63,66,69,72,   
  22.   
  23. 75,78,81,84,88,91,94,97};   
  24.   
  25. unsigned char displaycount;   
  26.   
  27. unsigned char displaybuf[8]={16,16,16,16,16,16,16,16};   
  28.   
  29. unsigned char timecount;   
  30.   
  31. unsigned char readdata[8];   
  32.   
  33.   
  34. sbit DQ=P3^7;   
  35.   
  36. bit sflag;   
  37.   
  38.   
  39. bit resetpulse(void)   
  40.   
  41. {   
  42.        
  43.     unsigned char i;   
  44.        
  45.        
  46.        
  47.     DQ=0;   
  48.        
  49.     for(i=255;i>0;i--);   
  50.        
  51.     DQ=1;   
  52.        
  53.     for(i=60;i>0;i--);   
  54.        
  55.     return(DQ);   
  56.        
  57.     for(i=200;i>0;i--);   
  58.        
  59. }   
  60.   
  61.   
  62.   
  63. void writecommandtods18b20(unsigned char command)   
  64.   
  65. {   
  66.        
  67.     unsigned char i;   
  68.        
  69.     unsigned char j;   
  70.        
  71.     for(i=0;i<8;i++)   
  72.            
  73.     {   
  74.            
  75.         if((command & 0x01)==0)   
  76.                
  77.         {   
  78.                
  79.             DQ=0;   
  80.                
  81.             for(j=35;j>0;j--);   
  82.                
  83.             DQ=1;   
  84.                
  85.         }   
  86.            
  87.         else  
  88.                
  89.         {   
  90.                
  91.             DQ=0;   
  92.                
  93.             for(j=2;j>0;j--);   
  94.                
  95.             DQ=1;   
  96.                
  97.             for(j=33;j>0;j--);   
  98.                
  99.         }   
  100.            
  101.         command=_cror_(command,1);   
  102.            
  103.     }   
  104.        
  105. }   
  106.   
  107.   
  108.   
  109. unsigned char readdatafromds18b20(void)   
  110.   
  111. {   
  112.        
  113.     unsigned char i;   
  114.        
  115.     unsigned char j;   
  116.        
  117.     unsigned char temp;   
  118.        
  119.        
  120.        
  121.     temp=0;   
  122.        
  123.     for(i=0;i<8;i++)   
  124.            
  125.     {   
  126.            
  127.         temp=_cror_(temp,1);   
  128.            
  129.         DQ=0;   
  130.            
  131.         _nop_();   
  132.            
  133.         _nop_();   
  134.            
  135.         DQ=1;   
  136.            
  137.         for(j=10;j>0;j--);   
  138.            
  139.         if(DQ==1)   
  140.                
  141.         {   
  142.                
  143.             temp=temp | 0x80;   
  144.                
  145.         }   
  146.            
  147.         else  
  148.                
  149.         {   
  150.                
  151.             temp=temp | 0x00;   
  152.                
  153.         }   
  154.            
  155.         for(j=200;j>0;j--);   
  156.            
  157.     }   
  158.        
  159.     return(temp);   
  160.        
  161. }   
  162.   
  163.   
  164.   
  165. void main(void)   
  166.   
  167. {   
  168.        
  169.     TMOD=0x01;   
  170.        
  171.     TH0=(65536-4000)/256;   
  172.        
  173.     TL0=(65536-4000)%256;   
  174.        
  175.     ET0=1;   
  176.        
  177.     EA=1;   
  178.        
  179.        
  180.        
  181.     while(resetpulse());   
  182.        
  183.     writecommandtods18b20(0xcc);   
  184.        
  185.     writecommandtods18b20(0x44);   
  186.        
  187.     TR0=1;   
  188.        
  189.     while(1)   
  190.            
  191.     {   
  192.            
  193.         ;   
  194.            
  195.     }   
  196.        
  197. }   
  198.   
  199.   
  200.   
  201. void t0(void) interrupt 1 using 0   
  202.   
  203. {   
  204.        
  205.     unsigned char x;   
  206.        
  207.     unsigned int result;       
  208.        
  209.     TH0=(65536-4000)/256;   
  210.        
  211.     TL0=(65536-4000)%256;   
  212.        
  213.     if(displaycount==2)   
  214.            
  215.     {   
  216.            
  217.         P0=displaycode[displaybuf[displaycount]] | 0x80;   
  218.            
  219.     }   
  220.        
  221.     else  
  222.            
  223.     {   
  224.            
  225.         P0=displaycode[displaybuf[displaycount]];   
  226.            
  227.     }   
  228.        
  229.     P2=displaybit[displaycount];   
  230.        
  231.     displaycount++;   
  232.        
  233.     if(displaycount==8)   
  234.            
  235.     {   
  236.            
  237.         displaycount=0;   
  238.            
  239.     }       
  240.        
  241.     timecount++;   
  242.        
  243.     if(timecount==150)   
  244.            
  245.     {   
  246.            
  247.         timecount=0;   
  248.            
  249.         while(resetpulse());   
  250.            
  251.         writecommandtods18b20(0xcc);   
  252.            
  253.         writecommandtods18b20(0xbe);   
  254.            
  255.         readdata[0]=readdatafromds18b20();   
  256.            
  257.         readdata[1]=readdatafromds18b20();   
  258.            
  259.         for(x=0;x<8;x++)   
  260.                
  261.         {   
  262.                
  263.             displaybuf[x]=16;   
  264.                
  265.         }   
  266.            
  267.         sflag=0;   
  268.            
  269.         if((readdata[1] & 0xf8)!=0x00)   
  270.                
  271.         {   
  272.                
  273.             sflag=1;   
  274.                
  275.             readdata[1]=~readdata[1];   
  276.                
  277.             readdata[0]=~readdata[0];   
  278.                
  279.             result=readdata[0]+1;   
  280.                
  281.             readdata[0]=result;   
  282.                
  283.             if(result>255)   
  284.                    
  285.             {   
  286.                    
  287.                 readdata[1]++;   
  288.                    
  289.             }   
  290.                
  291.         }   
  292.            
  293.         readdata[1]=readdata[1]<<4;   
  294.            
  295.         readdata[1]=readdata[1] & 0x70;   
  296.            
  297.         x=readdata[0];   
  298.            
  299.         x=x>>4;   
  300.            
  301.         x=x & 0x0f;   
  302.            
  303.         readdata[1]=readdata[1] | x;   
  304.            
  305.         x=2;   
  306.            
  307.         result=readdata[1];   
  308.            
  309.         while(result/10)   
  310.                
  311.         {   
  312.                
  313.             displaybuf[x]=result%10;   
  314.                
  315.             result=result/10;   
  316.                
  317.             x++;   
  318.                
  319.         }   
  320.            
  321.         displaybuf[x]=result;   
  322.            
  323.         if(sflag==1)   
  324.                
  325.         {   
  326.                
  327.             displaybuf[x+1]=17;   
  328.                
  329.         }   
  330.            
  331.         x=readdata[0] & 0x0f;   
  332.            
  333.         x=x<<1;   
  334.            
  335.         displaybuf[0]=(dotcode[x])%10;   
  336.            
  337.         displaybuf[1]=(dotcode[x])/10;   
  338.            
  339.         while(resetpulse());   
  340.            
  341.         writecommandtods18b20(0xcc);   
  342.            
  343.         writecommandtods18b20(0x44);   
  344.     }   
  345. }   

  

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4