急,我用DS18B20编写的程序显示85,如果用手摸传感器后每次需要按复位键后才能显示当前温度,为什么?

发布时间:2019-08-02 09:26:04

这是程序帮忙看看,并能给点意见。谢谢了!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P3^4;
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
uint a;
uchar table[]={
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9'
};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay1(uint z)
{
while(z--);
}
void writ_lcd(uchar dat)
{
rs=0;
rw=0;
P0=dat;
delay(5);
e=1;
delay(5);
e=0;
}
void write_date(uchar date)
{
rs=1;
rw=0;
P0=date;
delay(5);
e=1;
delay(5);
e=0;
}
void init ()
{
writ_lcd(0x38);
writ_lcd(0x01);
writ_lcd(0x0f);
writ_lcd(0x06);
}
Init_DS18B20(void)
{
uchar x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
if(DQ==0)
{
return 0;
}
else return 1;
delay(20);
}
ReadOneChar(void)
{
uchar i = 0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1; // 数据右移一位
DQ = 1; // 给脉冲信号
if(DQ) // DQ为1
dat|=0x80; // 读出数据
delay1(4); // 延时
}
return(dat);
}
void WriteOneChar(unsigned char dat)
{
uchar i = 0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01; //写入一位数据
delay1(5);
DQ = 1;
dat>>=1; //右移一位数据
}
}
uint tmp()
{
uchar temp;
uint temp_data1, temp_data2;
Init_DS18B20(); // 初始化DS18B20 // 延时
WriteOneChar(0xcc); // 跳过序列号命令
WriteOneChar(0x44);
Init_DS18B20(); // 初始化ds18b2子函数
WriteOneChar(0xcc); // 跳过ROM命令
WriteOneChar(0xbe); // 发送读取数据命令
temp_data1=ReadOneChar(); // 连续读两个字节数据
temp_data2=ReadOneChar();
temp_data1>>=4;
temp_data2<<=4;
temp=temp_data1|temp_data2;
return temp;
}
void main()
{
init();
a=tmp();
write_date(table[a/100]);
write_date(table[a%100/10]);
write_date(table[a%10]);
while(1);
}

推荐回答

还没有选出推荐答案,请稍候访问或查看其他回答!
以上问题属网友观点,不代表本站立场,仅供参考!