首页 | 文章中心 | 下载中心 | 本站特供 | 软硬件结合论坛 | 
您现在的位置: 中国软硬件结合技术网 >> 文章中心 >> 硬件技术 >> 单片机技术 >> 正文 用户登录 新用户注册
[组图]DS18B20温度测量            【字体:
DS18B20温度测量
作者:王海彬    文章来源:本站原创    点击数:    更新时间:2008-9-15

请尊重原创,引用本文发表者,请注明出处.

作者:

联系电话:15914326550

qq:243280383  870035775

邮箱: 870035775@QQ.COM

博客:    http://blog.sina.com.cn/vision243280383

 

 

基于DS18B20的单点温度测量 (2008-09-14 16:34:59)

去年搞了一个测量温度的设计,在这里和大家一起分享下:  

 

 

    关于DS18B20温度测量的单片机设计

#include <reg51.h>      //   调用头文件
sbit BAI =P2^3;        //   
数码管是四位的(三位显示整数,一位显示小数),有四个电源使能端,BAI驱动百位 SHI驱动十位
sbit SHI =P2^2;        //    GE
驱动个位
sbit GE =P2^1;         //
sbit XIAO=P2^0;        //    XIAO
驱动小数位
sbit dp=P0^5;        //  
小数点标致
sbit beng=P2^4;     //   
驱动鸣声器
sbit DQ =P2^5;   //
定义通信端口
//
延时函数
static unsigned char HT,LT;      //
定义用于存放温度值的高位
unsigned char tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};
                                             //0,    1,   2   3    4    5    6    7    8    9

void delay(unsigned int i)     //    
{
     while(i--);
   
}

void delayms(unsigned int i)     //延时 1MS

{ unsigned char j=0;
  for (;i>0;i--)
   { for (j=0;j<125;j++)
      {;}
   }
}   


//DB18B20初始化函数
Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;    //DQ
复位
 delay(8);  //
稍做延时
 DQ = 0;    //
单片机将DQ拉低
 delay(80); //
精确延时 大于 480us
 DQ = 1;    //
拉高总线

 delay(14);
 x=DQ;      //
稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 delay(20);
}
//
读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0; //
给脉冲信号
  dat>>=1;  //
逐位右移 
  DQ = 1; //
给脉冲信号

  if(DQ)     //DQ
1 时,表示收到高电平1
   dat|=0x80;      // 
把收到的高电平置给DAT的最高位

  delay(4);
 }
 return(dat);      //
}
//
写一个字节
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;      //
把要发送的高电平或者低电平给DQ 发送出去
  delay(5);
  DQ = 1;
  dat>>=1;       //
逐位右移
 }
delay(4);
}
//
读取温度
void  ReadTemperature()
{
unsigned char a=0;
unsigned char b=0;

Init_DS18B20();       //调用初始化函数
WriteOneChar(0xCC); //
跳过读序号列号的操作
                    //
不需要验证序列号。
WriteOneChar(0x44); //
发送温度转换命令 启动温度转换
Init_DS18B20();      
WriteOneChar(0xCC); //
跳过读序号列号的操作
WriteOneChar(0xBE); //
a=ReadOneChar();   //
读取温度值低位
b=ReadOneChar();   //
读取温度值高位
LT=(a&0xF0)?5:0;   //
HT=b<<4;            //
HT+=(a&0xF0)>>4;      //   

}
void display_tempmain( )             //
主程序温度显示函数
{
  static char k;
  if (HT>99)                  //
  { P0=tab[1];
    BAI=0;
    SHI=1;
 GE =1;
 XIAO=1;
    delay(600);
   }
   if (HT<1)                   //
如果温度低于1
  { P0=0x7f;                   //
数码管百显示"-",表示零下温度
    BAI =0;                    //
驱动百位数码管,屏蔽其他位数码管
    SHI=1;
 GE=1;
 XIAO=1;
 delay(600);

   }

    P0=tab[LT];                  // 
    BAI =1;
 SHI=1;
    GE =1;
    XIAO=0;                     //
    delay(600);

  P0=tab[HT/10];                //    显示十位温度值,屏蔽其他位
  BAI=1;
  SHI=0;                      
  GE=1;
  XIAO=1;
  delay(600);

  if(k!=tab[HT%10])             // 
  { if(beng)
    {beng=0;
     delayms(350);              // 
个位温度值发生变化,短鸣一声,告示
  beng=1;
 }
 
  }
  P0=tab[HT%10];                    //
显示各位温度值
  k=tab [HT%10];
  SHI=1;                         //
一定要把各位放在最后面,因为要确保个位的后面的小数点被点亮
  GE =0;                        
  XIAO=1;
  delay (600);

}

 

void main(void)
{                
  P2=0xff;
  while(1)                         //
主循环
   { dp=0;                         //
点亮小数点
     ReadTemperature();            //
读取温度值
     display_tempmain();           //
对读到的温度值进行处理
     if(HT>37|HT<20)               //
判断温度范围
 {beng=0;}                      // 
如果温度高于37度或者低于20度,则报警告示
    else
  beng=1;
    
   }  
}

 

文章录入:243280383    责任编辑:Polylove 
  • 上一篇文章: PS/2键盘驱动

  • 下一篇文章: 没有了
  • 发表评论】【告诉好友】【打印此文】【关闭窗口
          最新热点       最新推荐       相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)