打印
[AVR单片机]

MEGA8L写DS18B20

[复制链接]
893|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wlc824136|  楼主 | 2014-10-9 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写了一个18B20的程序,可不管怎么样显示都为0,求解。。程序如下:
#define DS18b20_H (PORTD|=(1<<PD6))
#define DS18b20_L (PORTD&=~(1<<PD6))
void Delayus(uint US)   
{
uint i;
US=US*5/4;      //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
for( i=0;i<US;i++);
}
void Delayms(uint MS)   
{
uint i,j;
for( i=0;i<MS;i++)
for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}
void DS18b20_Init(void)
{
DDRD|=0X40;
DS18b20_L;
Delayus(500);
DS18b20_H;
DDRD&=0XBF;
Delayus(500);
}
uchar read_18b20_byte(void)
{
uchar i;
uchar dat1,dat;
dat=0x00;
for(i=0;i<8;i++)
   {
    DDRD|=0X40;
DS18b20_L;
Delayus(3);
DS18b20_H;
DDRD&=0xBF;
Delayus(10);
dat=dat>>1;
dat1=(PIND&0X40);
if(dat1!=0x00)
  {
   dat|=0x80;
  }
Delayus(60);
   }
  return dat;
}
void write_18b20_byte(uchar date)
{
uchar i;
uchar j;
DDRD|=0X40;
for(i=0;i<8;i++)
  {  
   j=date&0x01;
   if(j!=0x00)
    {
  DS18b20_L;
  Delayus(20);
  DS18b20_H;
  Delayus(80);
}
   else
    {
  DS18b20_L;
  Delayus(90);
  DS18b20_H;
  Delayus(10);
}
   date=date>>1;
  }
}
uint GetTemp(void)
{
  uchar a,b;
  float tt;
  DS18b20_Init();
  write_18b20_byte(0xcc);
  write_18b20_byte(0x44);
  Delayms(5);
  DS18b20_Init();
  write_18b20_byte(0xcc);
  write_18b20_byte(0xbe);
  a=read_18b20_byte();
  b=read_18b20_byte();
  if(b>127)
   {
    zf=1;
a=~a+1;
b=~b;
   }
  else
   {
    zf=0;
   }
  temp=b;
  temp=temp<<8;
  temp=temp|a;
  tt=temp*0.0625;
  temp=tt*10+0.5;
  return temp;
}

相关帖子

沙发
wlc824136|  楼主 | 2014-10-10 08:54 | 只看该作者
找到问题了,延时时间不准。。。。。

使用特权

评论回复
板凳
bufubaoni| | 2014-10-10 09:39 | 只看该作者
延时有库函数很准的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wlc824136 + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

58

帖子

0

粉丝