DS18B20是目前比较常用的一种
温度测试芯片。其具有微型化、
低功耗、高性能、抗干扰强等优点。同时可以直接将温度转化为数字信号提供给处理器。详细的资料请参见芯片的资料说明。
本实验是一个简单的温度检测实验。单片机将检测到的温度用数码管显示。程序如下:
=================================================================================================
#include
#define uchar unsigned char
#define uint unsigned int
int a,b,c,temp;
sbit DS=P3^3;//18B20端口设置
uchar code table[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F //"9"
};
void dsdelay(int num)// 延时10约为53us 时钟为11.0592M
{
while(num--);
}
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
int init() //18B20初始化
{
uchar x=0;
DS=1;
dsdelay(8);//延时44us
DS=0;
dsdelay(110); //延时约500us
DS=1;
dsdelay(14); //稍微延时,读取x
x=DS;
dsdelay(20);
}
uchar readchar() //从18B20中读取1个字节
{
uchar i=0;
uchar dat;
for(i=8;i>0;i--)
{
DS=0;
dat>>=1;
DS=1;
if(DS)
dat|=0x80;
dsdelay(4);
}
return(dat);
}
void writechar(uchar dat) //向18B20中写数据
{
uchar i=0;
for(i=8;i>0;i--)
{
DS=0;
DS=dat&0x1;
dsdelay(5);
DS=1;
dat>>=1;
}
}
uint readtemp() //读取温度值
{
uchar a;
uchar b;
uint t;
float tt;
a=0;
b=0;
t=0;
tt=0;
init();
writechar(0xcc); //跳过读序号列号的操作
writechar(0x44); // 启动温度转换
init();
writechar(0xcc); //跳过读序号列号的操作
writechar(0xbe); //读取温度寄存器
a=readchar(); //读高8位
b=readchar(); //读高8位
t=b;
t<=8;
t=t|a;//两字节合成一个整型变量。
tt=t*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
t= tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
return(t);
}
void display() //数码管显示温度值
{
P1=0xf0; //位选
P2=table[a];//段选
delay(3);
P1=0xf1;
P2=table[b];
delay(3);
P1=0xf2;
P2=0x08;
delay(3);
P1=0xf3;
P2=table[c];
}
void main()//主函数
{
int m;
m=0;
while(1)
{
if(m==0) //消除85现象
{
delay(500);
temp=readtemp();
delay(500);
delay(200);
m=1;
}
else
{
temp=readtemp();
a=temp/100;
b=temp0/10;
c=temp;
display();
}
}
}