给你一个例程参考
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //单总线端口定义
uchar flag1; //正或负标记
sbit dula=P2^6; //段选
sbit wela=P2^7; //位选
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,//0~f数组
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,//0~9带小数点数组
0x87,0xff,0xef};
/************DS18B20操作程序声明****************/
void dsreset(); //复位和初始化
bit tmpreadbit(); //读1位数据
uchar tmpread(); //读取一个字节数据
void tmpwritebyte(uchar dat); //写一个字节
void tmpchange(); //发送操作指令
uint tmp(); //读取温度值
/************显示程序声明****************/
void display(uint temp); //数码管显示程序
/************延时程序声明****************/
void delay(uchar k); //50us延时程序
void delay1ms(uint k); //1ms延时程序
/************主程序****************/
void main()
{
tmpchange(); //初始化DS18B20
delay1ms(1000); //延时1s等待稳定
while(1)
{
tmpchange(); //发送操作指令
display(tmp()); //数码管显示读到的温度数据
}
}
//初始化DS18B20
//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动
void dsreset() //复位和初始化
{
uint i; //用作短延时的计数变量
DS=0; //发送低电平
i=103; //赋值
while(i>0)i--; //相对长时间低电平896us
DS=1; //发送高电平
i=4; //赋值
while(i>0)i--; //相对非常短时间高电平38us
}
//向DS18B20读取一位数据
//读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,
//之后DS18B20则会输出持续一段时间的一位数据
bit tmpreadbit() //读1位数据
{
uint i; //用作短延时的计数变量
bit dat; //位变量
DS=0; //发送低电平
i++; //少许延时
DS=1; //发送高电平
i++;i++; //执行一个i++;3.25us
dat=DS; //读1位数据
i=8;
while(i>0)i--;//短延时
return (dat); //返回dat值
}
//读取一个字节数据, 通过调用tmpreadbit()来实现
uchar tmpread() //读取一个字节数据
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();//按位分8次读取一个字节数据
//最先读出的是最低位数据
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return(dat); //返回dat值
}
//向DS18B20写入一个字节数据
void tmpwritebyte(uchar dat) //写一个字节
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++) //一个字节分8次按位写入
{
testb=dat&0x01;//把dat最低位赋值与testb
dat=dat>>1; //dat左移一位
//写"1", 让低电平持续2个小延时, 高电平持续8个小延时
if(testb) //写 1
{
DS=0;
i++;i++;
DS=1;
i=8;
while(i>0)
i--;
}
else
{
DS=0; //写 0
i=8;
while(i>0)
i--;
DS=1;
i++;i++;
}
}
}
//向DS18B20发送温度转换命令
void tmpchange() //发送温度转换命令
{
dsreset(); //复位和初始化
delay(1); //延时
tmpwritebyte(0xcc); //写入跳过序列号命令字
tmpwritebyte(0x44); //写入温度转换命令字
}
uint tmp() //读取温度值
{
float tt; //单精度浮点型数据变量
uint temp; //变量温度
uchar a,b;
dsreset(); //发送复位和初始化命令
delay(1);
tmpwritebyte(0xcc); //写入跳过序列号命令字
tmpwritebyte(0xbe); //写入读取数据令字
//连续读取两个字节数据
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //两个字节组成一个整型变量
temp=temp|a;
//DS18B20的精确度为0.0625度, 即读回数据的最低位代表0.0625度
tt=temp*0.0625;
//将它放大10倍, 使显示时可显示小数点后一位, 并对小数点后第二2进行4舍5入
//如t=11.0625, 进行计数后, 得到value = 111, 即11.1 度
temp=tt*10+0.5;
return temp; //返回3位有效数
}
//显示当前温度值, 精确到小数点后一位
void display(uint temp) //显示程序
{
static uchar count=0;
switch(count)
{
case 0:
dula=0;
P0=table[temp/100]; //显示十位
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
count=1;
break;
case 1:
dula=0;
P0=table1[temp/10%10]; //显示个位
dula=1;
dula=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
count=2;
break;
case 2:
P0=table[temp%10]; //显示1/10位
dula=1;
dula=0;
P0=0x7b;
wela=1;
wela=0;
count=0;
break;
}
}
void delay(uchar k) //11.0592MHz 50us延时
{
uchar a,b;
for(b=k;b>0;b--)
for(a=43;a>0;a--);
}
void delay1ms(uint k) //11.0592MHz 1ms延时
{
uint i,j;
for(i=k;i>0;i--)
for(j=114;j>0;j--);
} |