注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

耳朵的博客

做自己想做的人

 
 
 

日志

 
 

DS18B20温度读取函数  

2009-05-04 09:16:43|  分类: 单片机 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
/***********************************\
*     DS18B20温度读取函数   *
*            晶振12M    *
*   返回double,精确到小数点后4位   *
*  只需调用read_temperature函数即可 *
\***********************************/
sbit DQ =P2^7; //定义连接DS18B20的数据口
//延时函数
void delay(unsigned int i)
{
     while(i--);   
}
//初始化函数
void init_DS18B20(void)
{
 bit flag=1;
 while(flag==1)
 {
  DQ = 1;    //DQ复位
  DQ = 0;    //DQ拉低
  //delay(80); //延时约500us
  delay(70);
  DQ = 1;    //释放DQ
  delay(10); //DS18B20收到下拉信号后延时
  flag=DQ;   //读取DQ值(为0表示DS18B20复位成功)
  delay(20);
 }
 //P3++;
}
//串行读取一个字节
unsigned char read_DS18B20(void)
{
 unsigned char i = 0, dat = 0;
 for (i=0; i<8; i++)
 {
  DQ = 0;
  dat>>=1;
  DQ = 1;
  if(DQ)
   dat|=0x80;
  delay(4);
 }
 return dat;
}
//串行写入一个字节
void write_DS18B20(unsigned char dat)
{
 unsigned char i=0;
 for (i=0; i<8; i++)
 {
  DQ = 0;
  DQ = dat&0x01;
  delay(3);
  DQ = 1;
  dat>>=1;
 }
 delay(5);
}
//读取温度
double read_temperature(void)  //返回double
{
 unsigned int temp=0;
 double d;
 init_DS18B20();
 write_DS18B20(0xCC); //忽略读序列号
 write_DS18B20(0x44); //启动温度转换
 init_DS18B20();
 write_DS18B20(0xCC); //忽略读序列号
 write_DS18B20(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 temp=read_DS18B20();   //读取温度值低位
 temp=temp+read_DS18B20()*0x100;   //读取温度值高位
 if(temp<0xf000)  
 {
  d=temp*0.0625;
 }
 else  //零下
 {
  temp=~temp+1;        
  d=-(temp*0.0625);
 }
 return  d;
}
  评论这张
 
阅读(1397)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017