找回密码
 注册会员
搜索附件  
MCU资讯论坛 附件中心 单片机论坛 51单片机论坛 DS18B20温度计.rar

DS18B20温度计.rar

 

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);
}




QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-27 01:05 , Processed in 0.036950 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部