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

2019-07-15 11:47发布

#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;
}

这个程序问题吗

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
hobbye501
1楼-- · 2019-07-15 13:20
255的话就是FF,那就是说温度没转换完,没有读到18B20寄存器里面的值,这个问题就多了,应该是你的总线时序的问题,你最好拿示波器调试一下 看看哪里错了 最佳答案
ST_Lover
2楼-- · 2019-07-15 16:47
是程序的问题                  
西域狼
3楼-- · 2019-07-15 17:47
温度转换的程序呢?
Qing_S
4楼-- · 2019-07-15 20:26
 精彩回答 2  元偷偷看……
Qing_S
5楼-- · 2019-07-15 20:32
ST_Lover 发表于 2017-3-6 10:38
是程序的问题

时序没有调整好
Qing_S
6楼-- · 2019-07-15 23:51
西域狼 发表于 2017-3-6 13:28
温度转换的程序呢?

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

一周热门 更多>