大概看了一下,LZ的程序时序严重不符合DS18B20的要求,读不出温度来那是正常的,要是读出来那才是怪了!
下边给楼猪贴一个我自己写的例程:
(那些_nop_ ()和中文注释都是特别重要的地方,务必要符合中文注释的时序要求。延时函数都是经过严格仿真的,实际误差不超过5%!)
#ifndef _ds18b20_h_
#define _ds18b20_h_
#include<intrins.h>
sbit ds18b20=P3^7; //ds18b20 为温度传感器的i/o口线
void delay15us (unsigned int n) //使用22.1184兆晶振,延时 15*n 微秒;
{
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();
while(--n)
{
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();
}
}
unsigned char init_ds18b20(void) //初始化ds18b20
{
unsigned char initflag;
ds18b20=0;
delay15us(36);
ds18b20=1;
delay15us(6);
initflag = ds18b20;
delay15us(18);
ds18b20=1;
return (initflag); //返回0则初始化成功,否则初始化失败
}
void writeonechar(unsigned char dat)
{
unsigned char i=0;
for (i=8;i>0;i--)
{
ds18b20=0;
_nop_ ();
_nop_ ();
_nop_ (); //延时必须大于1us
ds18b20 = dat&0x01;
delay15us(4);
ds18b20=1;
dat>>=1;
}
}
unsigned char readonechar(void)
{
unsigned char i=0,dat=0;
for(i=8;i>0;i--)
{
dat>>=1;
ds18b20=0;
_nop_ ();
_nop_ ();
_nop_ (); //延时必须大于1us
ds18b20=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
if(ds18b20) dat|=0x80;
delay15us(4);
ds18b20=1;
}
return(dat);
}
void convert(void) //启动温度转换
{
init_ds18b20();
writeonechar(0xcc); //跳过读序号列号的操作
writeonechar(0x44); //启动温度转换
}
int readtemperature(void) //读取温度,需在启动温度转换750ms之后
{
unsigned char low=0,high=0;
int t=0;
init_ds18b20();
writeonechar(0xcc);
writeonechar(0xbe);//发出读取温度寄存器命令
low=readonechar();
high=readonechar();
t=high;
t<<=8;
t|=low;
return(t);
}
#endif
|