#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DATA = P1^0; //DS18B20接入口
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
char bai,shi,ge; //定义变量
/*延时子函数*/
void delay(uint num)
{
while(num--) ;
}
/*************DS18b20温度传感器函数*********************/
void Init_DS18B20(void) //传感器初始化
{
uchar x=0;
DATA = 1; //DQ复位
delay(10); //稍做延时
DATA = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us //450
DATA = 1; //拉高总线
delay(20);
x=DATA; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(30);
}
//读一个字节
ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DATA = 0; // 给脉冲信号
dat>>=1;
DATA = 1; // 给脉冲信号
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DATA = 0;
DATA = dat&0x01;
delay(10);
DATA = 1;
dat>>=1;
}
delay(8);
}
//读取温度
int ReadTemperature(void)
{
uchar a=0;
uchar b=0;
int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
t=b;
t<<=8;
t=t|a; //得到温度值的各个位的值
t=t*0.0625; //得到实际的温度值
return(t);
}
/*显示子函数*/
void display(int bai,int shi,int ge)
{
P0 = 0xff; //对数码管清零,防止串扰
P2=0xfb;
P0=table[bai]; //显示百位
delay(50); //一小段延时动态显示
P0 = 0xff; //对数码管清零,防止串扰
P2=0xf7;
P0=table[shi]; //显示十位
delay(50);
P0 = 0xff;
P2=0xef;
P0=table[ge] & 0x7f; //显示个位
delay(100);
P0 = 0xff;
P2=0xdf;
P0=table[0]; //显示小数位,这里没有处理小数位,默认的为0
delay(50);
}
void main()
{
int temp;
while(1)
{
temp = ReadTemperature(); //读温度
bai = temp / 100; //获取百位
shi = temp % 100 / 10; //获取十位
ge = temp % 10; //获取个位
display(bai,shi,ge); //显示函数
}
}