新手一枚,请教大虾们18b20的一些问题

2020-01-30 13:39发布

为什么我的18b20无法读入温度示数呢?
代码如下:
#include <reg51.h>
#include <1602.h>
#define        uchar unsigned char
#define dataport P3
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit bf=P3^7;
void delay500();
uchar read_18b20();
void delay60();
bit reset(void);
void write_byte();       
sbit data_line=P2^3;
sbit flag1=P2^4;
uchar temp;
void main()
{
flag1=0;
while(flag1==0)
{reset();}       //若无响应则重新复位
//temp=0x20;
//write_byte();
read_18b20();
                   //以下为1602液晶的程序
init_1602();
read_state_1602();
write_data_1602(temp);
//write_commend_1602(0xc0);
//read_data_1602();
while(1);
}

/*<<<<<<<复位>>>>>>>>>>*/
bit reset(void)
{
uchar i;
data_line=0;   //拉低
delay500();
data_line=1;   //拉高等待响应
for(i=0;i<13;i++)
{
if(data_line==0)
{flag1=1;}        //有响应             延时(5i+2)us
}
if(data_line==1)
{
flag1=0;      //无响应
}
delay500();   //延时一段时间
data_line=1;  // 拉高结束
return flag1;
}

/**********************************写位******************************/
void write_byte()        //写位,有严格的时序要求
{
uchar i,j;
for(i=0;i<8;i++)
{
data_line=0;        //拉低
for(j=2;j>0;j--);  //延时4us
data_line=temp&0x01; //将最低位赋值给data_line
delay60();
data_line=1;
temp=temp>>1;    //带进位的右移
}
}
/**************************************读示数***********************/
uchar read_18b20()
{
        uchar i,j;
        temp = 0;
        for (i=8;i>0;i--)
                {       data_line= 0;       // 给脉冲信号
                temp>>=1;
                                for(j=2;j>0;j--);  //延时4us
                data_line= 1;      // 给脉冲信号
                                for(j=4;j>0;j--);  //延时8us
                if(data_line)
                { temp|=0x80;}
                delay60();
                                data_line=1;
        }
        return(temp);

}
void delay500()
{
uchar i;
for(i=0;i<166;i++);   //延时(3i+2)us

}

void delay60()
{
uchar i;
for(i=0;i<20;i++);   //延时(3i+2)us
}

关键是写和读示数都没有反应,网上也找别人的实例看了,但是自己仿照他们的程序写了,却是无法运行。。。纠结啊。。。。求大神帮忙看一看。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。