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

[复制链接]
1409|3
 楼主| LaLa4j 发表于 2020-12-31 20:07 | 显示全部楼层 |阅读模式
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);
        }
}
tyw 发表于 2021-1-1 10:15 | 显示全部楼层





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
谭翬 发表于 2021-1-1 14:08 | 显示全部楼层
18B20的读写程序网上很多,基本上都能用,注意点:
1、上电要延时后,再给18B20初始化;
2、根据单片机的晶振频率,计算读写的延时程序。
xyz549040622 发表于 2021-1-1 23:18 来自手机 | 显示全部楼层
楼上说得对,延时,延时一定要准确。针对你的芯片,延时函数一定要准确,需要你。测试一下时间是否正确。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部