我用18b20测温,单片机程序哪里有问题,是时序问题吗,脑袋也炸了!

2019-07-18 10:04发布

求大神帮我看下程序!一直困扰了我几天。
//18b20操作
void delay1 (unsigned char q)  
{
   while(q--)
   for(i=0;i<5;i++)
    _nop_();

}


void init_18b20()
{unsigned char x=0;
dp=1;
delay1(1);                                         //dp为通信总线
dp=0;
delay1(140);
dp=1;
  delay1(13);
x=dp;
delay1(87);
dp=1;
}


void write_18b20( char d)
{unsigned char i=0;
for(i=0;i<8;i++)
{dp=1;
delay1(1);
dp=0;
//delay1(1);
dp=d&0x01;
delay1(12);
dp=1;
d>>=1;
}
}


unsigned char read_18b20()
{unsigned char i=0;
unsigned char d=0;
for(i+0;i<8;i++)
{
  dp=0;
  d >>= 1;
  dp = 1;
  delay1(1);
  if(dp)
  d|=0x80;
  delay1(13);
  dp=1;
}
return(d);

}           

void read_temp()
{
unsigned char low;
unsigned char high;
c=0;
init_18b20();
write_18b20(0xcc);
write_18b20(0x44);
init_18b20();
write_18b20(0xcc);
write_18b20(0xbe);
low=read_18b20();
high=read_18b20();
tem=high;
tem<<=8;
tem=tem|low;  //tem为long型
if(tem%32==0x1f)
{value=~(tem/32)+1;                   //value为float型
c=value*0.0625;                //c为int型
}
else
value=tem/32;
c=value*0.0625;
}

       
void display()
{
read_temp();
wei[0]=c/100;           //百位
wei[1]=c%100/10;                 //十位
wei[2]=c%100%10;                   //个位
//wei[4]=c%100%10%10;                //小数位
write_command(0x80+0x40+0x07);
write_data(wei[0]+0x30);
write_command(0x80+0x40+0x08);
for(i=1;i<3;i++)
{write_data(wei+0x30);
}
write_command(0x80+0x40+0x0a);
write_data(wei[10]);
write_data(wei[2]+0x30);

}

6YES0PX9C[Z_E18C7PQBJHK.png
改变温度一直这样
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
superyxy
1楼-- · 2019-07-19 15:59
王栋春 发表于 2016-12-28 21:20
以后我学习单片看来要引以为戒了 别到时将自己搞晕了

{:6:
猎国倾城
2楼-- · 2019-07-19 18:31
 精彩回答 2  元偷偷看……
猎国倾城
3楼-- · 2019-07-19 18:34
superyxy 发表于 2016-12-28 21:26
不是我不想写,可这个18B20程序就是这个模版呀。只有编写过知道.

每个人有每个人的编程风格,要想别人能看懂你的程序,最好详细注释,这样利于别人读程序,也利于你排错。
superyxy
4楼-- · 2019-07-19 23:51
好吧
superyxy
5楼-- · 2019-07-20 00:38
感谢

superyxy
6楼-- · 2019-07-20 00:44
猎国倾城 发表于 2016-12-28 19:09
看到你的程序,我也也炸了

我知道我问题了所在了。原来是实现延迟不是我想的那精确,认为for(i=0;i<5;i++)_nop_();就是延迟5us。实际上要大的多;

一周热门 更多>