用DS18B20好长时间了,从来没有自已写过18B20的程序,以前都是复制别人的,今天有空自已写了个程序,居然还是花了好长时间才调通,惭愧呀,究竟还是学到一些东西,但还是有一个问题至今没有解决,就是18B20刚上电时总会出现85度,不知道怎么回事,该延时的我也都延时了,在网上也查了,很多网友也出现了这样的问题,知道EDN有很多高手,麻烦各位给看看,下面是我写的程序,我是通过串口进行调试的.
#include <reg51.h>
#include <intrins.h>
#include <math.h>
sbit ds18b20_DQ=P1^5;
bit pos_neg_temperature=0,serial_sendflag=0;
bit readds18b20=0;
unsigned long ambient_temp;
unsigned int time="0";
unsigned char idata temperature[2]={0x00,0x00};
unsigned char strbuffer[8];
unsigned char idata send_sbuf[9]={0x62,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x55};
bit ds18b20_reset();
void ds18b20_writedata(unsigned char wdata);
unsigned char ds18b20_readdata();
void delay(unsigned int k);
void read_temp();
bit ds18b20_reset()
{
unsigned int i;
bit flag;
ds18b20_DQ=0;
for(i=240*12;i>0;i--);
ds18b20_DQ=1;
for(i=40*12;i>0;i--);
flag=ds18b20_DQ;
for(i=200*12;i>0;i--);
return(flag);
}
void ds18b20_writedata(unsigned char wdata)
{
unsigned char j;
unsigned int i;
for(i=8;i>0;i--)
{
ds18b20_DQ=0;
for(j=2*12;j>0;j--);
ds18b20_DQ= wdata&0x01;
for(j=30*12;j>0;j--);
ds18b20_DQ=1;
wdata>>=1;
}
}
unsigned char ds18b20_readdata()
{
unsigned char j, tempdata;
unsigned int i;
for(i=8;i>0;i--)
{
tempdata>>=1;
ds18b20_DQ = 0;
for(j=2*12;j>0;j--);
ds18b20_DQ = 1;
for(j=4*12;j>0;j--);
if(ds18b20_DQ==1)
tempdata |= 0x80;
for(j=30*12;j>0;j--);
ds18b20_DQ =1;
}
return(tempdata);
}
void delay(unsigned int k)
{
unsigned int i;
for(i=(k/2)*12;i>0;i--);
}
void read_temp()
{
unsigned char i;
ds18b20_reset();
ds18b20_writedata(0xcc);
ds18b20_writedata(0x44);
delay(1000000);
ds18b20_reset();
ds18b20_writedata(0xcc);
ds18b20_writedata(0xbe);
delay(1000000);
for(i=0;i<2;i++)
{
temperature=ds18b20_readdata();
}
ds18b20_reset();
}
void change()
{
unsigned long temp;
unsigned char temp_data;
temp_data=temperature[1];
temp_data &= 0xf0;
if(temp_data==0xf0)
{
pos_neg_temperature=1;
if(temperature[0]==0)
{
temperature[0]=~temperature[0]+1;
temperature[1]=~temperature[1]+1;
}
else
{
temperature[0]=~temperature[0]+1;
temperature[1]=~temperature[1];
}
}
temp=temperature[1]*256+temperature[0];
temp=(int)((temp*625)/1000);
if(temp==850)
{
ambient_temp=0;
}
else
ambient_temp=temp;
}
void serial() interrupt 4 using 3
{
if(RI)
{
unsigned char ch,temp,i,n=0;
ch=SBUF;
RI=0;
if(ch==0x61)
{
for(i=0;i<=7;i++)
{
while(RI==0);
temp=SBUF;
RI=0;
strbuffer=temp;
if((i>=1)&&(i<=5))
{
n +=temp;
}
if(i==6)
{
if(n==strbuffer)
{
serial_sendflag=1;
}
else
serial_sendflag=0;
}
}
}
}
}
void time_init()
{
ES=1;
TMOD=0x21;
TH1=0xf3;
TL1=0xf3;
PCON=0x00;
TR1=1;
TR0=1;
SCON=0x50;
IE=0x90;
EA=1;
ET0=1;
}
timer0() interrupt 1 using 1
{
unsigned int i;
i=0;
TH0=(65536-8333)/256;
TL0=(65536-8333)%256;
if(time==5000)
{
time=0;
readds18b20=1;
}
time++;
}
void main()
{
unsigned int i="0";
time_init();
ds18b20_reset();
for(;;)
{
TMOD=0x21;
EA=1;
ET0=1;
TR0=1;
if(readds18b20==1)
{
ds18b20_reset();
read_temp();
delay(100);
change();
delay(100);
readds18b20=0;
}
if(serial_sendflag==1)
{
switch(strbuffer[1])
{
case 0xa1:
send_sbuf[6]=0x00;
send_sbuf[5]=0x00;
send_sbuf[2]=0xa1;
send_sbuf[3]=ambient_temp/256;
send_sbuf[4]=ambient_temp%256;
if(pos_neg_temperature==1)
{
send_sbuf[5]=0x01;
pos_neg_temperature=0;
}
send_sbuf[7]=send_sbuf[2]+send_sbuf[3]+send_sbuf[4]+send_sbuf[5]+send_sbuf[6];
for(i=0;i<=8;i++)
{
SBUF=send_sbuf;
while(TI==0);TI=0;
}
break;
case 0xa2:
for(i=0;i<=8;i++)
{
SBUF=send_sbuf;
while(TI==0);TI=0;
}
break;
}
serial_sendflag=0;
}
}
}
用户1353608 2009-12-15 16:21
用户184658 2009-3-9 16:15
用户184658 2009-3-9 16:10
用户165568 2009-3-4 20:50
用户165568 2009-3-4 20:48
用户1376028 2009-1-15 22:42
用户1376028 2009-1-15 22:39
用户114680 2008-11-17 11:28
用户114680 2008-11-17 11:26
用户61458 2008-11-13 23:18