永发信息网

用AVR单片机驱动ds18b20的程序,总是读不出温度。

答案:2  悬赏:50  手机版
解决时间 2021-02-26 10:01
  • 提问者网友:藍了天白赴美
  • 2021-02-25 19:54
#define data 3
void tepdelay(unsigned int a)
{
while(a--);
}
unsigned char Init_DS18B20()
{
unsigned char i=0;
DDRC|= (1< PORTC&=~(1< tepdelay(100);
PORTC|=(1< tepdelay(40);
DDRC&=~(1 < tepdelay(40);
if(PINC&0x08)
{
tepdelay(60);
return 0;
}
else
{
tepdelay(50);
return 1;
}
}
unsigned char ReadOneChar()
{
unsigned char i=0;
unsigned char dat = 0;
for(i=8;i>0;i--)
{ dat>>=1;DDRC|=(1 <
PORTC&=~(1< tepdelay(10);
PORTC|=(1< DDRC &= ~(1 < if(PORTC&=~(0x01< dat|=0x80;
tepdelay(10);
}
return(dat);
}
void WriteOneChar(unsigned char dat)//写一个字节
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DDRC|=(1 < PORTC&=~(1< if(dat&0x01)
{
PORTC|=(1< }
else
{
PORTC&=~(1< }
tepdelay(10);
PORTC|=(1< dat>>=1;
//tepdelay(10);
}
}
unsigned int Readtemp()//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //连续读两个字节数据 //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a; //两字节合成一个整型变量。
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}
最佳答案
  • 五星知识达人网友:鸠书
  • 2021-02-25 20:58
主要是延迟,把时间搞准就可以了。 多用示波器看波形。

if(PORTC&=~(0x01<
注意:读端口引脚状态,是读PINC,不是读PORTC
全部回答
  • 1楼网友:逐風
  • 2021-02-25 21:15
通常读不出温度都是因为通讯的时序不对,楼主可以百度一下读ds18b20时序,最好是自己通过示波器查看信号的时序
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯