注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
张泽龙的个人空间 https://home.eeworld.com.cn/space-uid-126438.html [收藏] [复制] [分享] [RSS]
日志

18b20

已有 1771 次阅读2009-12-17 22:10

//请高手们看看哪里错了,最后读出来的数值就只有255
#define uchar unsigned char ;
#define uint  unsigned int ;

sbit DQ=P3^7;
 
//延时
void delay(uint times)
{
 uchar n;
 n=0;
 while(n<times) n++;
 return;
}
//复位
uchar Init_18b20()
 {
 bit flag1=0;
 DQ=1;
 delay(8);
 DQ=0;
 delay(85);//delay(85);
 DQ=1;
 delay(4);
 flag1=DQ;
 delay(200); 
  
 return flag1;
 }
//读字节
 uchar ReadOne_Char(void)
 {
   uchar i=0,dat=0;
 for(i=0;i<8;i++)
  {
    DQ=1;
    _nop_(); _nop_(); _nop_();
  DQ=0;
  dat>>=1;
  DQ=1;
  delay(1);
  if(DQ)
    dat|=0x80;
  delay(3);
  }
 return (dat);
 }
 //写字节
 void WriteOne_Char(uchar dat)
 {
  uchar i=0;
  for(i=0;i<8;i++)
   { 
  
    DQ=0;
    delay(1);
  DQ=dat&0x01;
  delay(5);
  DQ=1;
  dat>>=1;
 }
 delay(4);
 }
 //读取温度
 uchar ReadTemperature(void)
 {
   uchar TempL=0,TempH=0,temperature=0;
   Init_18b20();
   WriteOne_Char(0xcc);
   WriteOne_Char(0x44);
   delay(125);
   Init_18b20();
   WriteOne_Char(0xcc);
 WriteOne_Char(0xbe);
 TempL=ReadOne_Char();
   TempH=ReadOne_Char();
   temperature=((TempH*256)+TempL)>>4;
 delay(200);
  
 return(temperature);
 }
发表评论 评论 (3 个评论)
回复 tiankai001 2009-12-18 08:57
首先,需要仔细检查你的延时程序,看看延时是否准确。
其次,看看你的复位时序和读写时序,复位时序里面应该有复位是否成功的判断
第三,你启动温度转换后,直接就读温度了,那可定不行,启动温度转换后,至少延时750MS才能正确读取温度

还有,不要总说网上的程序是错误的,你可以从网上卖单片机开发板的网站哪里下载一个DS18B20的程序,仔细对照你的程序和人家的程序,看看到底是不是一样,不要放过任何一个语句
回复 thtlj 2009-12-18 09:28
没用过,也不好多说,但感觉你这句有点问题:
temperature=((TempH*256)+TempL)>>4;
是不是应该加类型转换?
temperature=(((int)TempH*256)+TempL)>>4;
回复 张泽龙 2009-12-19 00:47
多谢多谢,今天又再调了调,关键是延时没写好,现在基本搞定了.......

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章