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条回答
Jzeng123
1楼-- · 2019-03-24 22:03
求高手指点
philipchiu
2楼-- · 2019-03-24 23:27
 精彩回答 2  元偷偷看……
吴下阿蒙
3楼-- · 2019-03-24 23:40
这程序不需要你去写,就是拼接一下而已。
ienglgge
4楼-- · 2019-03-25 01:41
你的思路有问题,主函数直接调用display();display()中,用到了变量d,d你都没有赋值啊。
  主程序应该这样。先初始化传感器,再进行一些读写操作之类。再显示。
你也不执行初始化函数,也不执行读写操作。 显示函数写的也不对。显示函数,应该定义变量,比如执行个读函数,返回值给变量。再进行后面的计算。  你这程序,完全是自己写的吧。参考一下别的代码。虽然不一定能用,但很多地方比你的处理更合理。
JOketinnle
5楼-- · 2019-03-25 05:14
 精彩回答 2  元偷偷看……
喵爱小鱼鱼
6楼-- · 2019-03-25 06:35
d=c*0.0625*10+0.5; 有问题,详细参见英数据手册,注意BCD码

一周热门 更多>