哪位大侠帮我看看为什么调试不出来 ds18b20

2019-07-16 02:52发布

#include<reg52.h>
#include<intrins.h>
sbit ds=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uint t)
{
for(t;t>0;t--)
{
_nop_();_nop_();_nop_();_nop_();
}
_nop_(); _nop_();
}

void init()//初始化
{
        bit x;
        ds=1;       
        delay(1);
        ds=0;
        delay(32);
        ds=1;
        delay(4);
        x=ds;
        delay(32);
//        return x;
}
void ds_wbit(bit i)//写一位
{                       
                ds=0;
                _nop_();
                _nop_();//总线拉低持续时间要大于1us       
                ds=i;
                delay(3);//延时60us 等待取样
                ds=1;//释放总线               
       
}
void ds_wbyte(uchar dat)//写一个字节
{
        uchar i;
        while(i++<8)
        {
                ds_wbit(dat&0x01);
                dat>>=1;
       
        }

}



bit ds_rbit()//读一位
{
        uchar ret;
        ds=0;
        _nop_();_nop_();
        ds=1;
        _nop_(); _nop_();
        _nop_(); _nop_();
        ret=ds;
        delay(3);
        ds=1;
        return ret;
}
uchar ds_rbyte()//读一个字节
{
        uchar i,j,dat;
        for(i=0;i<8;i++)
        {
                j=ds_rbit();
                dat=(j<<7)|(dat>>1);
                /*dat>>=1;//先读最低位
                if(ds_rbit())
                        dat|=0x80;*/       
        }
        return dat;

}
void tempchange(void)  //DS18B20 begin change
{
  init();
  delay(1);
  ds_wbyte(0xcc);  // address all drivers on bus
  ds_wbyte(0x44);  //  initiates a single temperature conversion
}
uint get()
{
        uchar a,b;
        uint t=0;
        float tt;               
        /*ds_wbyte(0xcc);//跳过读序列号的操作
        ds_wbyte(0x44);//启动温度转换*/
        init();//复位
        ds_wbyte(0xcc);//跳过读序列号操作
        ds_wbyte(0xbe);//读取温度寄存器等(共可读九个寄存器)其中前两个就是温度
        a=ds_rbyte();//获取温度低8位
        b=ds_rbyte();//获取温度高8位
        t=b;
        t<<=8;
        t=t|a;//两个8位的字节 组合为一个字
        tt=t*0.0625;//温度转化
        t=tt*10+0.5;//对结果进行4舍5入
        return t;
}
void display(uint temp)
{
        uint bai,shi,ge;
        uchar cnt;
       
        bai=temp/100;
        shi=temp%100/10;
        ge=temp%100%10;
       
        cnt++;
        switch(cnt)
        {
                case 1: P0=0xff;
                                dula=1;
                                P0=table[bai];
                                dula=0;
                               
                                wela=1;
                                P0=0xfe;
                                wela=0; break;
                case 3: P0=0xff;
                                dula=1;
                                P0=table[shi];
                                dula=0;
                       
                                wela=1;
                                P0=0xfd;
                                wela=0; break;
                case 5:P0=0xff;
                                dula=1;
                                P0=table[ge];
                                dula=0;
                               
                                wela=1;
                                P0=0xfb;
                                wela=0; break;
                case 7: cnt=0; break;
                default:break;

        }
       

}
void main()
{       
        //uint a;
       
        init();
        do
        {
                tempchange();
                delay(100);
                display(get());
       
        }while(1);

}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
3htech
1楼-- · 2019-07-16 03:14
先用keil仿真一下波形,看看发送波形是否正确。
3htech
2楼-- · 2019-07-16 06:10
先用Keil仿真一下发送的波形,看看是否正确。
zhlndsq-484
3楼-- · 2019-07-16 06:30
hobbye501
4楼-- · 2019-07-16 10:22
 精彩回答 2  元偷偷看……

一周热门 更多>