DS18B20能读数据但数据错误【已解决】

2019-07-16 05:55发布

本帖最后由 qq312448494 于 2012-5-15 22:47 编辑

程序分享出来给需要的人作参考
#include<reg52.h>
#define uint        unsigned int
#define uchar        unsigned char

sbit        DQ=P2^2;     //DS18B20单总线
sbit        dula=P2^6;   //控制数码管段选的锁存器
sbit        wela=P2^7;   //控制数码管位选的锁存器
sbit rs=P3^5;        
sbit lcden=P3^4;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7;
sbit wr=P3^6;

void        delay(int us)
{
        int s;
        for(s=0;s<us;s++);
}
void delay1(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}



void write_com(uchar com)
{
        rs=0;
        lcden=0;
        P0=com;
        delay1(5);
        lcden=1;
        delay1(5);
        lcden=0;        
}

void write_date(uchar date)
{
        rs=1;
        lcden=0;
        P0=date;
        delay1(5);
        lcden=1;
        delay1(5);
        lcden=0;        
}
void init()
{
    wr=0;
    dula=0;
        wela=0;
        lcden=0;

        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
}

uchar        reset()
{
        uchar presence;
        DQ=0;
        delay(29);
        DQ=1;
        delay(3);
        presence=DQ;
        delay(25);
        return(presence);
}

uchar        read_bit()
{
        uchar        i;
        DQ=0;
        DQ=1;
        for(i=0;i<3;i++);
        return(DQ);
}
void write_bit(char bitval)
{
        DQ=0;
        if(bitval==1)DQ=1;
        delay(5);
        DQ=1;
}

uchar read_byte()
{
        uchar i;
        uchar value=0;
        for(i=0;i<8;i++)
        {
                if(read_bit())value|=0x01<<i;
                delay(6);
        }
        return(value);
}

void        write_byte(char val)
{
        uchar i;
        uchar temp;
        for(i=0;i<8;i++)
        {
                temp=val>>i;
                temp&=0x01;
                write_bit(temp);
        }
        delay(5);
}
uint        get_tmp()
{
        uchar a,b,temp;
        float tt;
        reset();
        write_byte(0xcc);//SkipROM
        write_byte(0x44);//开始转换
        delay(31);
        reset();
        write_byte(0xcc);
        write_byte(0xbe);
        a=read_byte();
        b=read_byte();
        temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625;
  temp=tt*10+0.5;
        return(temp);        
}
void display(uchar num)
{
        uchar bai,shi,ge;
        bai=num/100;
        shi=(num%100)/10;
        ge=(num%100)%10;

        write_com(0x80);
        write_date(0x30+bai);
        write_com(0x81);
        write_date(0x30+shi);
        write_com(0x82);
        write_date(0x30+ge);
}

void        main()
{
        uchar a;
        uint tmp;
        init();
        while(1)
        {
                for(a=28;a>0;a--)
                {        
                        tmp=get_tmp();
                        display(tmp);
                        delay(60);

                }
               
        }        

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
qq312448494
1楼-- · 2019-07-16 08:38
哎。没人回呀~
qq312448494
2楼-- · 2019-07-16 12:46
高手帮帮忙。。。。
yjk282
3楼-- · 2019-07-16 14:03
把转换时间调长一点
qq312448494
4楼-- · 2019-07-16 18:55
yjk282 发表于 2012-4-30 20:49
把转换时间调长一点

问题解决了,谢谢朋友了。
yqldt
5楼-- · 2019-07-16 22:21
 精彩回答 2  元偷偷看……
mk7891010
6楼-- · 2019-07-17 00:31
转换时间是在那一段程序中,高手能解释一下吗

一周热门 更多>