基于51单片机的温湿度光强二氧化碳气体家庭环境检测proteus仿真

硬件设计

仿真图1:
该设计是基于51单片机的温湿度光强二氧化碳检测系统,由LCD1602作为显示器,温湿度采用的SHT11传感器,ADC采用的TLC2543,光强就是光敏传感器,气体检测这里采用的是电位器模拟的。该设计仅做了采集和显示,没有阈值设置功能。
基于51单片机的温湿度光强二氧化碳气体家庭环境检测proteus仿真_第1张图片

仿真图2:
该设计为基于51单片机的温度检测系统,由LCD1602作为显示器,温度采用DS18B20,通过4个按键设置阈值,超出阈值会LED报警;该设计为温度专用的检测系统。
基于51单片机的温湿度光强二氧化碳气体家庭环境检测proteus仿真_第2张图片

仿真图3:
该设计为基于51单片机的温湿度检测系统,由LCD1602作为显示器,温湿度采用DHT11, 通过3个按键设置阈值,当温湿度超过上下限之后会触发分别的继电器;
基于51单片机的温湿度光强二氧化碳气体家庭环境检测proteus仿真_第3张图片

仿真图3:
该设计为基于51单片机的温湿度烟雾气体检测,由LCD1602作为显示器,温湿度采用DHT11, 三个按键设置温湿度上下限,LED指示,这里的气体同样是用滑动变阻器来模拟的。
基于51单片机的温湿度光强二氧化碳气体家庭环境检测proteus仿真_第4张图片

程序设计:

仿真图1的部分代码:

#include 	
#include "lcd.h"
#include  
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define NACK	0
#define ACK		1
#define MEASURE_TEMP	0x03	//000 0001  1
#define MEASURE_HUMI	0x05	//000 0010  1
#define STATUS_REG_W	0x06	//000 0011  0
#define STATUS_REG_R	0x07	//000 0011  1
#define RESET			0x1E	//000 1111  0
ulong volt;//测量的电压值
sbit Data=P2^3;   //定义数据线
sbit CLK=P3^3;//定义时钟信号口
sbit DIN=P3^1;//定义2543数据写入口
sbit DOUT=P3^0;//定义2543数据读取口
sbit CS=P3^2;//定义2543片选信号口
sbit Data_P    = P2^4;			// SHT11传感器的数据管脚
sbit Sck_P     = P2^3;			// SHT11传感器的时钟管脚
sbit BEEP =P2^5;
uchar tmpe,h;
uchar rec_dat[9];   //用于显示的接收数据数组
uchar temp_max = 30;
uchar humi_min = 60;
ulong C2_max = 3500000;
ulong LUX_max = 3500000;
ulong C2_now = 0;
ulong LUX_now = 0;
unsigned char temp;							// 保存温度
unsigned char humi;				  		// 保存湿度

enum { TEMP,HUMI };
typedef union              		//定义共用同类型
{
	unsigned int i;
	float f;
}value;


int display = 0;
void delay(uchar ms) 
{  // 延时子程序 
uchar i; 
while(ms--) 
{ 
  for(i = 0;i<250;i++);  
} 
}

char ShtWriteByte(unsigned char value)
{
	unsigned char i,error=0;
	for(i=128;i>0;i>>=1)  // 高位为1,循环右移
	{
		if (i&value)
			Data_P=1;       	// 和要发送的数相与,结果为发送的位
		else
			Data_P=0;
		Sck_P=1;
		_nop_();						// 延时3us
		_nop_();
		_nop_();
		Sck_P=0;
	}
	Data_P=1;    					// 释放数据线
	Sck_P=1;
	error=Data_P;  				// 检查应答信号,确认通讯正常
	_nop_();
	_nop_();
	_nop_();
	Sck_P=0;
	Data_P=1;
	return error; 				// error=1 通讯错误
}

char ShtReadByte(unsigned char ack)
{
	unsigned char i,val=0;
	Data_P=1; 						// 释放数据线
	for(i=0x80;i>0;i>>=1)	// 高位为1,循环右移
	{
		Sck_P=1;
		if(Data_P)
			val=(val|i);    	// 读一位数据线的值
		Sck_P=0;
	}
	Data_P=!ack;    			// 如果是校验,读取完后结束通讯
	Sck_P=1;
	_nop_();							// 延时3us
	_nop_();
	_nop_();
	Sck_P=0;
	_nop_();
	_nop_();
	_nop_();
	Data_P=1; 						// 释放数据线
	return val;
}


void ShtTransStart(void)
{
	Data_P=1;
	Sck_P=0;
	_nop_();
	Sck_P=1;
	_nop_();
	Data_P=0;
	_nop_();
	Sck_P=0;
	_nop_();
	_nop_();
	_nop_();
	Sck_P=1;
	_nop_();
	Data_P=1;
	_nop_();
	Sck_P=0;
}

void ShtConnectReset(void)
{
	unsigned char i;
	Data_P=1; 		   		//准备
	Sck_P=0;
	for(i=0;i<9;i++)  	//DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
	{
		Sck_P=1;
		Sck_P=0;
	}
	ShtTransStart();   	//启动传输
}

附:http://www.jh-tec.cn/archives/7114

你可能感兴趣的:(51单片机,proteus,单片机)