给你一个现成的代码,自己试着调一下,我原来试过的,可以用,稍微改一下串口
#include<reg52.h>
sbit ds18b20_pin=P1^7; //单总线引脚
void ds18b20_init(); //ds18b20初始化
bit ds18b20_reset(); //ds18b20复位
void ds18b20_write_dat(unsigned char dat);//些数据到ds18b20
unsigned char ds18b20_read_dat();//读数据
/****************************************
*DS18B20 初始化
*函数名称:ds18b20_init()
*说明:本初始化程序可以不要,因为18B20在出厂时就被配置为12位精度了
*****************************************/
void ds18b20_init()
{
ds18b20_reset();
ds18b20_write_dat(0xcc); //跳过ROM
ds18b20_write_dat(0x4e); //写暂存器
ds18b20_write_dat(0x20); //往暂存器的第三字节中写上限值
ds18b20_write_dat(0x00); //往暂存器的第四字节中写下限值
ds18b20_write_dat(0x7f); //将配置寄存器配置为12位精度
ds18b20_reset();
}
/*********************************************
*DS18B20复位及存在检测(通过存在脉冲可以判断DS18B20是否损坏
*函数名称:ds18b20_reset()
*说明:函数返回一个位标量(0或1)flag=0存在,反之flag=1不存在
**********************************************/
bit ds18b20_reset()
{
unsigned char i;
bit flag;
ds18b20_pin=0; //拉低总线
for(i=240;i>0;i--); //延时480微秒,产生复位脉冲
ds18b20_pin=1; //释放总线
for(i=40;i>0;i--); //延时80微秒对总线采样
flag=ds18b20_pin; //对数据脚采样
for(i=200;i>0;i--); //延时400us等待总线恢复
return (flag);
}
/********************************************
*写数据到DS18B20
*函数名称:ds18b20_write_dat()
*********************************************/
void ds18b20_write_dat(unsigned char dat)
{
unsigned char i,j;
for(i=8;i>0;i--)
{
ds18b20_pin=0; //拉低总线,产生写信号
for(j=2;j>0;j--); //延时4us
ds18b20_pin=dat&0x01; //发送1位
for(j=30;j>0;j--); //延时60us,写时序至少要60us
ds18b20_pin=1; //释放总线,等待总线恢复
dat>>=1; //准备下一位数据的传送
}
}
/**********************************************
*从DS18B20中读数据
*函数名称:ds18b20_read_dat()
*
**********************************************/
unsigned char ds18b20_read_dat()
{
unsigned char i,j,tempdat;
for(i=8;i>0;i--)
{
tempdat>>=1;
ds18b20_pin=0; //拉低总线,产生读信号
for(j=2;j>0;j--); //延时4us
ds18b20_pin=1; //释放总线,准备读数据
for(j=4;j>0;j--); //延时8us读数据
if(ds18b20_pin==1)
{
tempdat|=0x80;
}
for(j=30;j>0;j--); //延时60us
ds18b20_pin=1; //拉高总线,准备下一位数据的读取
}
return(tempdat); //返回读到的数据
}
|