51单片机关于温度传感器的问题,学了好久终于把程序写出来,可是不知错在哪了 求指导

2019-03-24 17:42发布

下面是我的程序
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit dq=P1^0;
uint x,y;
uchar shi,ge,shifen,d;
uchar code num[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void delayus(uchar z)
{
        while(z--);
}
void delayms(uchar z)
{
        for(x=110;x>0;x--)
                for(y=z;y>0;y--){};
}

void ds18b20init()
{
        uint t;
        dq=0;
        delayus(110);
        dq=1;
        delayus(4);
        t=dq;
        while(t);       
}
void ds18b20write(uchar a)
{
        uint i;
        for(i=0;i<8;i++)
        {
                dq=0;
                delayus(1);
                dq=a&0x01;
                delayus(11);
                dq=1;
                a>>=1;
        }
}
uchar ds18b20readbit()
{
        uchar dat;
        dq=0;
        _nop_();
        dq=1;
        dat=dq;
        return dat;               
}
uchar ds18b20read()
{
        uchar i,j,k;
        k=0;
        for(i=0;i<8;i++)
        {
                j=ds18b20readbit();
                k=(j<<7)|(k>>1);
        }
        return k;
}
uchar ds18b20tempchange()
{
        uchar a,b;
        uint c;
        ds18b20init();
        ds18b20write(0xcc);
        ds18b20write(0x44);
        //delayms(100);
        ds18b20init();
        ds18b20write(0xcc);
        ds18b20write(0xbe);
        //delayms(100);
        a=ds18b20read();
        b=ds18b20read();
        b<<=8;
        c=b|a;
        d=c*0.0625*10+0.5;
        return d;       
}
void display()
{
        wela=0;
        dula=0;
       
        shi=d/100;
        ge=d%100/10;
        shifen=d%100%10;
        while(1)
        {
                wela=1;
                P0=0xfe;
                wela=0;
                dula=1;
                P0=num[shi];
                dula=0;
                delayms(1);
                wela=1;
                P0=0xfd;
                wela=0;
                dula=1;
                P0=num[ge];
                dula=0;
                delayms(1);
                wela=1;
                P0=0xfb;
                wela=0;
                dula=1;
                P0=0x80;
                dula=0;
                delayms(1);
                wela=1;
                P0=0xf7;
                wela=0;
                dula=1;
                P0=num[shifen];
                dula=0;
                delayms(1);
        }
}
void main()
{
        while(1)
        {
                display();
        }
}













此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
喵爱小鱼鱼
1楼-- · 2019-03-25 08:02
JOketinnle 发表于 2016-4-9 21:54
我之前碰到别人的程序就像移植到自己的DPJ上,直到我用了18B20 我写了4遍 都不好使,之后像这种比较常用芯 ...

对于这种简单的器件,一般看懂数据手册,根据时序图,自己写出底层驱动,特别是注意数据的格式。那么成功的几率就大了。
mcu5i51
2楼-- · 2019-03-25 11:38
 精彩回答 2  元偷偷看……

一周热门 更多>