久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

51單片機(jī)做的溫濕度測量儀

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年07月07日   【字體:

本人去年用51單片機(jī)做的溫濕度傳感器模塊,有實(shí)物,有程序,供大家分享。
該1602液晶的D0~D7數(shù)據(jù)口連接單片機(jī)的P17~P10口,所以程序里的指令和數(shù)據(jù)都是逆向輸入的。
程序和電路圖下載: http://www.zg4o1577.cn/f/溫濕度傳感器+1602原理圖.rar


#include<reg52.h> 
#include<intrins.h> 
#include<math.h> 
#define uchar unsigned char 
#define uint unsigned int 

#define noACK 0 
#define ACK 1
#define STATUS_REG_W 0x06
#define STATUS_REG_R 0x07
#define MEASURE_TEMP 0x03 
#define MEASURE_HUMI 0x05 
#define RESET 0x1e

sbit SCK =P1^0;
sbit DATA=P1^1;
sbit led1=P1^7; 

sbit  rs=P2^3; //H數(shù)據(jù),L命令
sbit  en=P2^5; //高脈沖使能,使能脈寬最小150ns
sbit  rw=P2^4;
uchar code table_temp[]=" TEMP: ";
uchar code table_humi[]=" HUMI: ";
uchar code table_c[]=" C  ";
uchar code table_p[]=" %  ";
uchar error=0; 

void delayms(uint z) 
{ 
	uint i,j; 
	for(i=z;i>0;i--) 
	for( j=110;j>0;j--); 
} 

//啟動時(shí)序 
void transstart() 
{ 
	SCK=1;
	_nop_(); 
	DATA=0;
	_nop_(); 
	SCK=0;
	_nop_();
	_nop_();
	_nop_(); 
	SCK=1;
	_nop_(); 
	DATA=1;
	_nop_(); 
	SCK=0; 
} 

//寫入命令子函數(shù) 
uchar write_byte(uchar value) 
{ 
	uchar i; 
	for(i=0x80;i>0;i=i/2) 
	{ 
		if(i&value) 
			DATA=1; 
		else 
			DATA=0; 
		SCK=1; 
		_nop_();
		_nop_();
		_nop_(); 
		SCK=0; 
	} 
	DATA=1; 
	SCK=1; 
	error=DATA; 
	SCK=0; 
	return error; 
} 

//從傳感器讀數(shù)據(jù) 
uchar read_byte(bit ack) 
{ 
	uchar i,val=0; 
	DATA=1; 
	for(i=0x80;i>0;i=i/2) 
	{ 
		SCK=1; 
		if(DATA) 
		val=val|i; 
		SCK=0; 
	} 
	DATA=!ack; 
	SCK=1; 
	_nop_();
	_nop_();
	_nop_(); 
	SCK=0; 
	DATA=1; 
	return val; 
} 

//
void connectionreset() 
{ 
	uchar i; 
	DATA=1; 
	SCK=0; 
	for(i=0;i<9;i++) 
	{ 
		SCK=1; 
		SCK=0; 
	} 
	transstart(); 
} 

uint measure1() //測量溫度函數(shù)
{ 
	uchar value_1,value_2;
	uint tempvalue;
	transstart();
	error+=write_byte(MEASURE_TEMP);
	if(error!=0)
	{
		connectionreset();
	}
	else 
	{ 
		while(DATA==1)
		{
			_nop_();
		}
		if(DATA==0)
		{ 
			value_1=read_byte(ACK);
			value_2=read_byte(noACK);
			tempvalue=value_2+value_1*256; //轉(zhuǎn)換成 16 位的 int 型
		}
		else error=1; 
	} 
	return tempvalue; 
}
 
uint measure2() //測量濕度函數(shù)
{ 
	uchar value_1,value_2; 
	uint tempvalue; 
	transstart(); 
	error+=write_byte(MEASURE_HUMI); 
	if(error!=0) 
	connectionreset(); 
	else 
	{ 
		while(DATA==1) 
		_nop_(); 
		if(DATA==0) 
		{ 
			value_1=read_byte(ACK);
			value_2=read_byte(noACK); 
			tempvalue=value_2+value_1*256; 
		} 
		else error=1; 
	} 
	return tempvalue; 
} 

void lcdwrdata(uchar dat)
{
	dat = ((dat&0x01)<<7)|((dat&0x02)<<5)|((dat&0x04)<<3)|((dat&0x08)<<1)|((dat&0x10)>>1)|((dat&0x20)>>3)|((dat&0x40)>>5)|((dat&0x80)>>7);
	rs=1;//寫數(shù)據(jù)時(shí)RS拉高
	en=1;
	P0=dat;
	delayms(6);
	en=0;
	delayms(6);
}

void lcdwrcom(uchar cdat)//寫指令數(shù)據(jù)到LCD  
{	
	cdat = ((cdat&0x01)<<7)|((cdat&0x02)<<5)|((cdat&0x04)<<3)|((cdat&0x08)<<1)|((cdat&0x10)>>1)|((cdat&0x20)>>3)|((cdat&0x40)>>5)|((cdat&0x80)>>7);
	rs=0;//寫指令時(shí)RS拉低
	en=1;
	P0=cdat;//
	delayms(6);//不加此延時(shí)將導(dǎo)致不能寫入指令,但能寫入顯示數(shù)據(jù)
	en=0;
	delayms(6);
}

void lcd_init()
{
	lcdwrcom(0x38); //0x38設(shè)置顯示模式為:16X2顯示,5X7點(diǎn)陣,8位數(shù)據(jù)接口
	lcdwrcom(0x0c); //打開顯示光標(biāo)閃爍
	lcdwrcom(0x06); //
	lcdwrcom(0x01); //
}

void display(float temp,float humi) //1602顯示函數(shù)(溫度,濕度)
{
	uint a,b,c,d,e,f,g,h;

	a=(temp/1000);
	b=((temp-a*1000)/100);
	c=((temp-a*1000-b*100)/10);
	d=(temp-a*1000-b*100-c*10);
	e=(humi/1000);
	f=((humi-e*1000)/100);
	g=((humi-e*1000-f*100)/10);
	h=(humi-e*1000-f*100-g*10);

	lcdwrcom(0x80+0x07);lcdwrdata('0'+a);
	lcdwrcom(0x80+0x08);lcdwrdata('0'+b);
	lcdwrcom(0x80+0x09);lcdwrdata('.')  ;
	lcdwrcom(0x80+0x0A);lcdwrdata('0'+c);
	lcdwrcom(0x80+0x0B);lcdwrdata('0'+d);
	lcdwrcom(0x80+0x47);lcdwrdata('0'+e);
	lcdwrcom(0x80+0x48);lcdwrdata('0'+f);
	lcdwrcom(0x80+0x49);lcdwrdata('.')  ;
	lcdwrcom(0x80+0x4A);lcdwrdata('0'+g);
	lcdwrcom(0x80+0x4B);lcdwrdata('0'+h);
	
}

float calc_temp(uint tempvalue) //計(jì)算溫度值子函數(shù) 
{ 
	const float d1=-39.9;
	const float d2=+0.01;
	float temp_final;
	tempvalue=tempvalue&0x3fff; //取出低 14 位
	temp_final=d1+d2*((float)tempvalue);
	return temp_final; //返回溫度值
}

//計(jì)算濕度值子函數(shù) 
float calc_humi(float humivalue) 
{ 
	const float c1=-4.0,c2=0.0405,c3=-0.0000028,t1=0.01,t2=0.00008; 
	float rh=humivalue; 
	float rhlin; 
	float rhtrue; 
	rhlin=c1+c2*rh+c3*rh*rh; 
	rhtrue=(27.87-25)*(t1+t2*rh)+rhlin; 
	if(rhtrue>100) 
		rhtrue=100; 
	if(rhtrue<0.1) 
		rhtrue=0.1; 
	humivalue=rhtrue; 
	return humivalue;
}
 
void main() 
{ 
	uint i; //定義計(jì)數(shù)器
	uint value1; //定義傳感器傳出來的數(shù)值(16位)
	uint value2; //定義傳感器傳出來的數(shù)值(16位)
	float dis_tempvalue; //定義溫度變量
	float dis_humivalue; //定義濕度變量
	//以下是初始化液晶操作
	rw=0;
	delayms(200);
	en=0;
	lcd_init();
	//以下是液晶固定顯示
	lcdwrcom(0x80+0x00); //第1行00位置
	for(i=0;i<7;i++)
	{
		lcdwrdata(table_temp[i]);
	}
	lcdwrcom(0x80+0x0C); //第1行0C位置
	for(i=0;i<4;i++)
	{
		lcdwrdata(table_c[i]);
	}
	lcdwrcom(0x80+0x40); //第2行40位置
	for(i=0;i<7;i++)
	{
		lcdwrdata(table_humi[i]);
	}
	lcdwrcom(0x80+0x4C); //第2行4C位置
	for(i=0;i<4;i++)
	{
		lcdwrdata(table_p[i]);
	}
	//
	while(1) 
	{ 
		connectionreset(); 
		error=0; 
		value1=measure1(); 
		value2=measure2(); 
		if(error==0) 
		{ 
			led1=0; 
			delayms(200); 
			led1=1; 
			delayms(200);
			dis_tempvalue=calc_temp(value1);   //計(jì)算溫度值
			dis_humivalue=calc_humi(value2);   //計(jì)算濕度值
			display(dis_tempvalue*100,dis_humivalue*100); //LCD1602顯示溫濕度
		} 
		else 
		{ 
			continue; 
		} 
	} 
} 
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 一区二区高清 | 国产午夜在线 | 亚洲精品成人网 | 欧美久久久网站 | 理论片午午伦夜理片影院 | 国产一区二区精华 | 欧美视频三区 | 国产99久久精品一区二区永久免费 | 亚洲日日夜夜 | 亚洲成人中文字幕 | 亚洲成人三区 | 羞羞视频一区二区 | 视频一区二区国产 | 黄网站色大毛片 | 国产精品久久久久久久久久久免费看 | 国产精品毛片一区二区三区 | 欧美日产国产成人免费图片 | 一区二区三区欧美 | 欧美精品一区二区在线观看 | 日韩在线播放中文字幕 | 一级女毛片 | 国产精品99一区二区 | 伊人久久大香线 | 二区视频| 97精品国产97久久久久久免费 | 久久国产精品一区二区 | 男女网站在线观看 | 国内精品伊人久久久久网站 | 精品久久久久久久久久久院品网 | 91精品国产91久久久久游泳池 | 国产精品亚洲一区二区三区在线 | 午夜久久久久 | 成人av一区二区亚洲精 | 欧美视频 亚洲视频 | 美女日批免费视频 | 一区二区在线不卡 | 日韩免费av | 成人妇女免费播放久久久 | 久久一二 | 夜夜草| 成人福利网站 |