原创 DS18B20的AVR驱动

2008-4-16 22:09 4109 8 8 分类: MCU/ 嵌入式

AVR接DS18B20,我在OURAVR上发过


  //m26温度测量通过串口传到电脑;8MHZ
#define CL_DQ PORTD&=~(1<<PD7)
#define SET_DQ PORTD|=(1<<PD7)
#define SET_OUT DDRD|=(1<<PD7)
#define SET_IN  DDRD&=~(1<<PD7)
#define IN_DQ  PIND&(1<<PD7)


 


void write_1820(uchar x)
{  uchar m;  
    CLI();
    for(m=0;m<8;m++)
    {
      CL_DQ;
       if(x&(1<<m))    //写数据,从低位开始
       {Delay_nus(2);SET_DQ; }
       else
      CL_DQ;
       Delay_nus(60);   //15~60us
      SET_DQ;
    Delay_nus(10);
    }
    SET_DQ;
 SEI();
}
uchar read_1820()
{   uchar temp,k,n; 
    CLI();
  temp="0";
    for(n=0;n<8;n++)
       {
      CL_DQ;
     //Delay_nus(2);      
      SET_DQ;
      //delay(3);    
      SET_IN;
   Delay_nus(1);
      k="IN"_DQ;    //读数据,从低位开始
      if(k)
      temp|=(1<<n);
      else
      temp&=~(1<<n);
      Delay_nus(70); //60~120us    
      SET_OUT;
   }
   SEI();
   return (temp);
}



void init_1820(void)
 {CLI();
 SET_OUT;
  SET_DQ;//输出1
  CL_DQ;
  Delay_nus(550);//拉低一段时间
  SET_DQ;//释放
  SET_IN;//输入
  Delay_nus(60);
  while(IN_DQ)  {;}//等待回复
  Delay_nus(240);//回复的低电平在60到240US
  SET_OUT;
  SET_DQ;//回到初始DQ=1;
  SEI();
 }


void Temper(void) //主函数
{
 
      uint j,tem;
  uchar i,temh,teml;
     init_1820();  //复位18b20
   write_1820(0xcc);   // 发出转换命令 搜索器件
      write_1820(0x44);     //启动
      for(j=1000;j>1;j--)
         Delay_nus(1000);//转换一次12位的 最多750MS
       init_1820();
      write_1820(0xcc);  //发出读命令
      write_1820(0xbe);
 
      teml="read"_1820();  //读数据
      temh="read"_1820();
   tem=(teml>>4)+(temh<<4);
   Int_to_Char(tem,Date);
      puts(Date);
  if(LCD)
  {
 
  LCD_write_string(2,1,"is :");
  LCD_write_string(8,1,Date);
  LCD_write_string(13,1,"du");
  }


 
     //每次转换需要延时
   Delay_nms(100);
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /1 下一条