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();
}
}
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/258877.html