本文主要是介绍51 单片机实现温度计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
通过温度感应元件 DS18B20 能感应周围的温度,然后再通过数码管显示当前的温度
它是这个样子的
当前我在室内,我开了取暖器,它显示温度是
下面是这个程序的源代码
/*****************************************************************************程序功能:实时采集当前环境温度值,并显示于数码管上*****************************************************************************/#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //声明DS18B20
uint temp; // 定义当前的温度
uchar flag1; //记录温度的升高或者降低
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};void delay(uint count) //延时函数
{uint i;while(count){i=200;while(i>0)i--;count--;}
}
void dsreset(void) //初始化命令
{uint i;DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;
}bit tmpreadbit(void) //读入一个bit
{uint i;bit dat;DS=0;i++; //i++ 的作用 延时DS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return (dat);
}uchar tmpread(void) //读取一个比特的数据
{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);
}void tmpwritebyte(uchar dat) //把比特数据借给 DS18B20
{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //write 1{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0; //write 0i=8;while(i>0)i--;DS=1;i++;i++;}}
}void tmpchange(void) //DS18B20 开始改变
{dsreset();delay(1);tmpwritebyte(0xcc); // address all drivers on bustmpwritebyte(0x44); // initiates a single temperature conversion
}uint tmp() //获取当前温度
{float tt;uchar a,b;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();b=tmpread();temp=b;temp<<=8; //two byte compose a int variabletemp=temp|a;tt=temp*0.0625;temp=tt*10+0.5;return temp;
}void display(uint temp) //显示程序
{uchar A1,A2,A2t,A3;A1=temp/100;A2t=temp%100;A2=A2t/10;A3=A2t%10;dula=0;P0=table[A1]; //显示百位dula=1;dula=0;wela=0;P0=0x7e;wela=1;wela=0;delay(1);dula=0;P0=table1[A2]; //显示十位dula=1;dula=0;wela=0;P0=0x7d;wela=1;wela=0;delay(1);P0=table[A3]; //显示个位dula=1;dula=0;P0=0x7b;wela=1;wela=0;delay(1);
}void main()
{uchar a;do{tmpchange();for(a=10;a>0;a--){ display(tmp());}} while(1);
}
这篇关于51 单片机实现温度计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!