DS18B20的程序,找了半天也没找到问题在哪里,温度显示不出来
炼气士 2011-06-25 09:18:04 #include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dq=P3^3; // DS18B20
sbit led=P0^0;
sbit E=P2^2;
sbit RS=P2^0;
sbit RW=P2^1;
uchar sign=0;
uchar tempI,tempD;
uchar tempIH,tempIL,tempDH,tempDL;
code uchar datas[]={"0123456789"};
//--1602
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void write_com(uchar com)
{
RS = 0;
RW = 0;
P0 = com;
E = 0;
delay_50us(10);
E = 1;
delay_50us(20);
E = 0;
}
void init1602(void)
{
delay_50us(300);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
void write_data(uchar dat)
{
RS = 1;
RW = 0;
P0 = dat;
E = 0;
delay_50us(10);
E = 1;
delay_50us(20);
E = 0;
}
void display()
{
write_com(0x80);
//if(sign)
write_data(sign?'-':'+');
write_data(tempIH);
write_data(tempIL);
write_data('.');
write_data(tempD);
}
// DS18b20
void delay7us(uint i)
{
while(i--);
}
void init_18b20()
{
dq=1;
_nop_();
dq = 0;
delay7us(80);
// 释放总线
dq = 1;
delay7us(60);
// while(dq);
}
void write_18b20(uchar dat)
{
uchar i;
dq=1;
_nop_();
for(i=0;i<8;i++)
{
dq = 0;
_nop_();
_nop_();
dq = dat&0x01;
delay7us(10);
dq = 1;
dat>>=1;
delay7us(1);
}
delay7us(10);
}
uchar read_18b20()
{
uchar i ,value;
for(i=0;i<8;i++)
{
dq = 0;
_nop_();
_nop_();
_nop_();
_nop_();
dq = 1;
_nop_();
_nop_();
value>>=1;
if(dq)
value|=0x80;
delay7us(10);
dq = 1;
}
delay7us(10);
return value;
}
void readTemp()
{
uchar a,b;
uint c;
init_18b20();
write_18b20(0xcc);
write_18b20(0x44);
delay7us(300); // 温度转换
init_18b20();
write_18b20(0xcc);
write_18b20(0xbe);
a = read_18b20();
b = read_18b20();
c = b;
c=c<<8+a;
if(b&0xf0)
{
sign = 1; // 1是负,0是正
c=~c+1;
}else
{
sign = 0;
}
tempI=(c&0x0700)<<4+(c&0x00f0)>>4;
tempD=((c&0x0f)*0.625);
tempIH = datas[tempI/10];
tempIL= datas[tempI%10];
tempD = datas[tempD/10];
}
void main(void)
{
init1602();
while(1)
{
readTemp();
display();
}
}
1602上总是显示+00.0