DS18B20问题:自己调试的程序总是不能正确,哪位大虾帮我看看,非常感谢。附件里面有仿真文件。
#include<reg51.h>
#include<intrins.h>
#define MSB 0x80
#define LSB 0x01
#define SKIP_ROM 0XCC
#define READ_SCRATCHPAD 0XBE
#define CONVER_T 0X44
//COMMON PIN
sbit DQ = P3^0;
sbit INTH = P2^0;
sbit INTL = P2^1;
sbit DFH = P2^2;
sbit DFL = P2^3;
code led_tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
unsigned char count,tempint,tempdf;
/**********************************************************************/
void Display(void);
void Read_DS18B20();
void Init_DS18B20(void);
void Read_DS18B20_byte(void);
void Delay(unsigned char i);
void Write_DS18B20(unsigned char dat);
/**********************************************************************/
void main(void)
{
while(1)
{
Read_DS18B20();
Display();
}
}
/**********************************************************************/
void Read_DS18B20()
{
unsigned char i,j;
Init_DS18B20();
Write_DS18B20(SKIP_ROM);
Write_DS18B20(CONVER_T);
for(i=0;i<20;i++)
{
for(j=0;j<200;j++)
{
count=600;
while(--count);
}
}
Init_DS18B20();
Write_DS18B20(SKIP_ROM);
Write_DS18B20(READ_SCRATCHPAD);
Read_DS18B20_byte();
}
/*************************************************************************/
void Init_DS18B20(void)
{
unsigned char flag;
flag = 0;
DQ=1;
count = 10;
while(--count);
DQ = 0;
count = 250;
while(--count); //延时500us>480us
DQ = 1;
count = 20;
while(--count); //延时40us
while(DQ==0)
{
count = 120;
while(--count);
if(DQ)
{
count = 240;
while(--count);
break;
}
}
}
/**********************************************************************/
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for (i=0; i<8; i++)
{
DQ = 0;
count = 8;
while(--count);
DQ = dat&LSB;
count = 20;
while(--count);
dat>>=1;
DQ = 1;
_nop_();
}
}
/*********************************************************************/
void Read_DS18B20_byte(void)
{
unsigned char temp,i,j,temph,templ,tempinth,tempintl,tempdfh;
j=2,temp=0x00;
do
{
for(i=0;i<8;i++)
{
temp>>=1;
DQ = 0;
_nop_();
_nop_();
DQ = 1;
count = 4;
while(--count);
if(DQ)
temp=temp|0x80;
count = 10;
while(--count);
}
if(j==2)
templ=temp;
else
temph=temp;
}while(--j);
temph<<=8;
temph|=templ;
temp=temph*0.0625;
temp=temp*10+0.5;//放大10倍后,4舍5入
tempinth=temp/100;
tempintl=temp/10%10;
tempdfh=temp%10;
}
/**********************************************************************/
void Display()
{
unsigned char tempinth,tempintl,tempdfh;
tempinth=led_tab[tempint/10];
tempintl=led_tab[tempint%10]|0x80;//带上小数点
tempdfh =led_tab[tempdf/10];
for(count=0;count<200;count++)
{
INTH=1;
P0=tempinth;
Delay(5);
INTH=0;
INTL=1;
P0=tempintl;
Delay(5);
INTL=0;
DFH=1;
P0=tempdfh;
Delay(5);
DFH=0;
DFL=1;
P0 = 0XC6;
Delay(5);
DFL=0;
}
}
/**********************************************************************/
void Delay(unsigned char t)
{
while(--t);
}