ds18b20温度传感器问题[急!!!]

2019-07-16 03:28发布

做的一个温度报警系统,程序烧录到开发板上温度显示正常,但是一到最小系统上温度就检测有误,数值为16度不变....
外围电路加了4.7K上拉电阻,我感觉也没有问题。
附程序:ds18b20.c
********************************************************************************8
/*DS18B20命令:
READ ROM                33H         读rom
MATCH ROM                                               55H         匹配rom
SKIP ROM                CCH         跳过rom
SEARCH ROM              F0H         搜索rom
ALARM ROM               ECH         警告rom
WRITE SCRATCHPAD        4EH         写暂存器
READ SCRATCHPAD         BEH         读暂存器
COPY SCRATCHPAD                                        48H         复制暂存器
COVERT T                44H         温度转换开始
RECALL E2               B8H         重调用E2存储器
READ POWER SUPPLY       B4H         读供电方式
*/

#ifndef DS18B20_H
#define DS18B20_H
#include "common.h"

sbit DS18B20=P2^0;        //自已定义IO口

unsigned char L_18B20,H_18B20; //分别存放低八位 高八位的数据;
unsigned char fg=0,zhengshu,xiaoshu1,xiaoshu2;        //fg为负数标志位,zhengshu是温度的整数部分,xiaoshu1是十分位,xiaoshu2是百分位


void Reset_18B20(void);                                //ds18b20复位程序
void Wait_18B20();                                        //等待程序,等待ds18b20应答
bit Readbit_18B20(void);                        //读取一个bit的数据
unsigned char Readbyte_18B20(void);         //读取一个字节的数据
void Writebyte_18B20(unsigned char b);        //写一个字节(控制字)
void Convert(void);                                                //开始转换
void Read_18B20(void);                                        //读取ds18b20


void Reset_18B20(void)//ds18b20复位程序
{
        unsigned char i;
        DS18B20=0;
        i=110;
        while(i>0)i--;
        DS18B20=1;
        i=6;
        while(i>0)i--;
}

void Wait_18B20()//等待程序,等待ds18b20应答
{
        unsigned char i=255;
        while(DS18B20)
        {
                i--;
                if(i==0)        return;        //超时
        }
        while(~DS18B20)
        {
                i--;
                if(i==0)        return;//超时

        }
        i=6;
        while(i>0)i--;
}

bit Readbit_18B20(void)        //读取一个bit的数据
{
        unsigned char i;
        bit b;
        DS18B20=0;
        i++;i++;   
        DS18B20=1;
        i++;i++;i++;i++;i++;
        b=DS18B20;
        i=13;
        while(i>0)i--;
        return b;
}

unsigned char Readbyte_18B20(void) //读取一个字节的数据
{
        unsigned char i,j,b;
        b=0;
        for(i=1;i<=8;i++)
        {
                j=Readbit_18B20();
                b=(j<<7)|(b>>1);        //又玩野
        }
        return b;
}

void Writebyte_18B20(unsigned char b)//写一个字节(控制字)
{
   unsigned char j,i;
        bit temp;
        for(j=1;j<=8;j++)
        {
                temp=b&0x01;
                b=b>>1;
                if(temp) // 写“1”
                {
                        DS18B20=0;
                        i++;i++;i++;i++;i++;  
                        DS18B20=1;
                        i=13;
                        while(i>0)i--;
                }
                else         //写“0”
                {
                        DS18B20=0;
                        i=13;
                        while(i>0)i--;
                        DS18B20=1;
                        i++;i++;i++;i++;i++;  
                }       
        }
}

void Convert(void)                                //开始转换
{
        Reset_18B20();
        Wait_18B20();                                                //等待应答脉冲
        Writebyte_18B20(0xcc);        //跳过序列号脉冲
        Writebyte_18B20(0x44);        //转换命令
}


void Read_18B20(void) //读取ds18b20
{       
        Convert();
        Reset_18B20();
        Wait_18B20();
        Writebyte_18B20(0xcc);                //跳过ROM
        Writebyte_18B20(0xbe);          //发送读取命令
        L_18B20=Readbyte_18B20();        //读取低八位数据
        H_18B20=Readbyte_18B20();        //读取高八位数据
        if(H_18B20>0x7f)      //最高位为1时温度是负
        {
                 L_18B20=~L_18B20;         //补码转换,取反加一
                 H_18B20=~H_18B20+1;      
                 fg=1;      //读取温度为负时fg=1
   }
        zhengshu=L_18B20/16+H_18B20*16; //整数部分
        xiaoshu1=(L_18B20&0x0f)*10/16; //小数第一位
        xiaoshu2=(L_18B20&0x0f)*100/16%10;//小数第二位

}

#endif


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
暮鼓
1楼-- · 2019-07-16 04:05
你都说程序没问题了,光发程序上来怎么解决问题。。。。
shangshu22
2楼-- · 2019-07-16 09:48
暮鼓 发表于 2012-11-29 17:02
你都说程序没问题了,光发程序上来怎么解决问题。。。。

在最小系统上有问题,我可能时序方面的问题?
lstcspring
3楼-- · 2019-07-16 13:59
单总线主要是时序问题,注意调一下
345629836
4楼-- · 2019-07-16 16:42
99给张看看没有引脚不好找问题的
liuzhaoxin1020
5楼-- · 2019-07-16 21:54
 精彩回答 2  元偷偷看……

一周热门 更多>