微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 测试ds18b20时,读取的温度为255,问题出在哪啦?

测试ds18b20时,读取的温度为255,问题出在哪啦?

时间:10-02 整理:3721RD 点击:
#include "reg52.h"
sbit DQ = P1^4;
//单总线延时函数
#ifndef STC12  
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
        while(t--);
}
#else
void Delay_OneWire(unsigned int t)  //STC12C5260S2
{
        unsigned char i;
        while(t--){
                for(i=0;i<12;i++);
        }
}
#endif
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                DQ = 0;
                DQ = dat&0x01;
                Delay_OneWire(5);
                DQ = 1;
                dat >>= 1;
        }
        Delay_OneWire(5);
}
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
        unsigned char i;
        unsigned char dat;
        for(i=0;i<8;i++)
        {
                DQ = 0;
                dat >>= 1;
                DQ = 1;
                if(DQ)
                {
                        dat |= 0x80;
                }            
                Delay_OneWire(5);
        }
        return dat;
}
//DS18B20初始化
bit init_ds18b20(void)
{
          bit initflag = 0;
         
          DQ = 1;
          Delay_OneWire(12);
          DQ = 0;
          Delay_OneWire(80); // 延时大于480us
          DQ = 1;
          Delay_OneWire(10);  // 14
          initflag = DQ;     // initflag等于1初始化失败
          Delay_OneWire(5);
          return initflag;
}
//DS18B20温度采集程序:整数
unsigned char rd_temperature(void)
{
    unsigned char low,high;
    unsigned char temp;
          init_ds18b20();
          Write_DS18B20(0xCC);
          Write_DS18B20(0x44); //启动温度转换
          Delay_OneWire(200);
          init_ds18b20();
          Write_DS18B20(0xCC);
          Write_DS18B20(0xBE); //读取寄存器
          low = Read_DS18B20(); //低字节
          high = Read_DS18B20(); //高字节
          temp = high<<4;
          temp |= (low>>4);
          return temp;
}
这个程序问题吗

255的话就是FF,那就是说温度没转换完,没有读到18B20寄存器里面的值,这个问题就多了,应该是你的总线时序的问题,你最好拿示波器调试一下 看看哪里错了

是程序的问题                  

温度转换的程序呢?

嗯嗯,时序调整过来,就好了

时序没有调整好

最后一个就是温度转换的程序

对的  问题不难 转换下思路就好了

谢谢大神啦

要的话 我给你发一个把

是哪个时序问题啊?小编能分享一下修改后的代码吗?我的一直初始化失败

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top