|
为什么我的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
}
关键是写和读示数都没有反应,网上也找别人的实例看了,但是自己仿照他们的程序写了,却是无法运行。。。纠结啊。。。。求大神帮忙看一看。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|