打印

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

[复制链接]
814|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 | 只看该作者
DS18B20性能特点及工作原理.pdf (797.45 KB)
DS18B20的工作原理及应用.pdf (4.4 MB)
DS18B20说明书.pdf (2.98 MB)
DS18B20温度传感器中文资料.pdf (2.12 MB)

使用特权

评论回复
板凳
谭翬| | 2021-1-1 14:08 | 只看该作者
18B20的读写程序网上很多,基本上都能用,注意点:
1、上电要延时后,再给18B20初始化;
2、根据单片机的晶振频率,计算读写的延时程序。

使用特权

评论回复
地板
xyz549040622| | 2021-1-1 23:18 | 只看该作者
楼上说得对,延时,延时一定要准确。针对你的芯片,延时函数一定要准确,需要你。测试一下时间是否正确。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝