问答

汇集网友智慧,解决技术难题

21ic问答首页 - DS18B20 请各位大佬帮忙看一下哪里不正确,

DS18B20 TE FOR ui 总线

DS18B20 请各位大佬帮忙看一下哪里不正确,

LaLa4j2020-12-31
void delay_us(uint count)//进入一次该函数需要11.95us
{
        while(count--);        //执行一次cout-- 需要6.5us
}                        //即delay_us(2)的延时时间为6.5*2+11.95


void delay_ms(uint y)
{
        uint x;
        for(;y>0;y--)
        {
                for(x=110;x>0;x--);
        }
}

uchar DS18B20Init(void)       //send reset and initialization command
{
  uchar i=0;
  DS=0;
  delay_us(82);//复位,至少延时480us,挂在总线上的DS18B20将被复位
  DS=1;//释放总线,
        i=0;
        while(DS)//延时等待82us
        {
                delay_ms(1);
                i++;
                if(i>5)
                {
                        return 0;//初始化失败
                }
        }

        return 1;//初始化成功
}



void writebyte(uchar byte)   //write a byte to ds18b20
{
  uchar j;
  for(j=0;j<8;j++)
  {
                DS=0;//每次写入一个数据之前需要把总线拉低
                _nop_();//15us内要释放总线,产生写时序
                DS=byte&0x01;//写入字节从最低位开始
                delay_us(10);//延时不少于60us,不可以大于120us
                DS=1;//释放总线,准备下一次数据写入
                byte>>=1;
  }
}
       
uchar readbyte(void)       //读字节
{
   uchar i,j,byte;
         for(i=0;i<8;i++)
         {
     DS=0;       
                 _nop_();
           _nop_();//延时至少1us,产生读时序
           DS=1;
     delay_us(1);//释放总线
     j=DS;//数据采集,
           delay_us(10);//延时不少于60us
                 byte=(j<<7)|(byte>>1);
                 delay_us(6);
        }
         return byte;
}
void main()
{
        int i,temp;
        uchar L,H;
        while(1)
        {
               
          DS18B20Init();//初始化
          delay_ms(1);
    writebyte(0xcc);  // address all drivers on bus,发送跳跃ROM指令
    writebyte(0x44);  // initiates a single temperature conversion,发送温度转换指令
          DS18B20Init();//主机和DS18B20做任何通讯前需要对其初始化
    delay_ms(1);
    writebyte(0xcc);//发送跳跃ROM
          writebyte(0xbe);//读取DS18B20暂存器值
          L=readbyte();//读低俗暂存器的值
          H=readbyte();//读高速暂存器的值
          i=H;
          i<<=8;//H移到高8位
          i|=L;//L写入i的低字节
        if(i<0)
        {
                i=i-1;
                temp=~i;
        }
        else
        {
                temp=i;       
        }
        i=temp*0.0625*10000        ;//浮点型数据转换
        Display(i);
        }
}
回答 +关注 10
804人浏览 3人回答问题 分享 举报
3 个回答

您需要登录后才可以回复 登录 | 注册