基于单片机的蔬菜大棚温湿度控制系统

1设计任务

利用AT89C51单片机为核心控制元件,设计一个节日彩灯门,设计的系统实用性强、操作简单,实现了智能化、数字化。

本系统通过SHT11传感器测量出大棚内的温湿度,并将温湿度电信号传至单片机AT89C51,单片机系统通过预先设定温湿度值产生差值从而产生相应的控制信号,控制T75S5D11-5V继电器为主的温湿度控制模块,再分别控制相应的升温、加湿系统对蔬菜大棚进行升温和加湿。

2. 设计要求

2.1系统方案论证

根据设计任务,分析设计系统的组成,给出实现设计任务的几种方案,分析比较几种设计方案的优略,本着尽量以软件代替硬件,同时力求电路简单,工作可靠的原则,确定总体设计方案。

2.2系统硬件电路设计

根据系统设计方案进行软、硬件的分配,软、硬件设计分别进行。硬件设计包括单片机最小系统和扩展接口及配置,硬件结构在设计时要选择合适的元器件,硬件电路要简洁、工作可靠,需用Proteus绘制整个系统的电路仿真原理图。

2.3软件设计

根据该系统要求的功能进行软件设计,简述软件的功能,并根据每个模块的功能绘制软件流程图,根据流程图编写程序并汇编调试通过;列出软件清单,软件清单要求加以注释。

#include <reg51.h>	
#include "lcd.h"
#include <intrins.h> 
#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 led1=P1^0;
sbit Data_P    = P2^4;			// SHT11传感器的数据管脚
sbit Sck_P     = P2^3;			// SHT11传感器的时钟管脚
sbit led =P2^5;
sbit jr=P1^2;
sbit js=P1^1;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;uchar tmpe,h;
uchar mode;
uchar temp_max = 40;
uchar temp_min = 10;
uchar humi_max = 40;
uchar humi_min = 10;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;       	// 和要发送的数相与,结果为发送的位elseData_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();   	//启动传输
}char ShtMeasure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
{unsigned error=0;unsigned int i;ShtTransStart();  		// 启动传输switch(mode)       		// 选择发送命令{case 1 :   					// 测量温度error+=ShtWriteByte(0x03);break;case 2 :   					// 测量湿度error+=ShtWriteByte(0x05);break;default:break;}for(i=0;i<65535;i++)if(Data_P==0)break;  					// 等待测量结束if(Data_P)error+=1;   			// 如果长时间数据线没有拉低,说明测量错误*(p_value) =ShtReadByte(1);  		// 读第一个字节,高字节 (MSB)*(p_value+1)=ShtReadByte(1); 		// 读第二个字节,低字节 (LSB)*p_checksum =ShtReadByte(0);  	// read CRC校验码return error;  									// error=1 通讯错误
}void CalcSHT11(float *p_humidity ,float *p_temperature)
{const float C1=-4.0;	 			// 12位湿度精度 修正公式const float C2=+0.0405;			// 12位湿度精度 修正公式const float C3=-0.0000028;	// 12位湿度精度 修正公式const float T1=+0.01;	 			// 14位温度精度 5V条件 修正公式const float T2=+0.00008;	 	// 14位温度精度 5V条件 修正公式float rh=*p_humidity;	 			// rh: 12位 湿度float t=*p_temperature;			// t:  14位 温度float rh_lin;								// rh_lin: 湿度 linear值float rh_true;							// rh_true: 湿度 ture值float t_C;	 								// t_C : 温度 ℃t_C=t*0.01 - 40;	 					//补偿温度rh_lin=C3*rh*rh + C2*rh + C1;					//相对湿度非线性补偿rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;		//相对湿度对于温度依赖性补偿*p_temperature=t_C;	 				//返回温度结果*p_humidity=rh_true;	 			//返回湿度结果
}unsigned char TempCorrect(int temp)
{if(temp<0)	temp=0;if(temp>970)  temp=970;if(temp>235)  temp=temp+10;if(temp>555)  temp=temp+10;if(temp>875)  temp=temp+10;temp=(temp%1000)/10;return temp;
}unsigned char HumiCorrect(unsigned int humi)
{if(humi>999)  humi=999;if((humi>490)&&(humi<951))  humi=humi-10;humi=(humi%1000)/10;return humi+4;
}void ReadShtData()
{value humi_val,temp_val;  	// 定义两个共同体,一个用于湿度,一个用于温度unsigned char error;  							// 用于检验是否出现错误unsigned char checksum;  						// CRCunsigned int temp1,humi1;						// 临时读取到的温湿度数据error=0; 										//初始化error=0,即没有错误error+=ShtMeasure((unsigned char*)&temp_val.i,&checksum,1); 	//温度测量error+=ShtMeasure((unsigned char*)&humi_val.i,&checksum,2); 	//湿度测量if(error!=0) 		  					//如果发生错误,系统复位ShtConnectReset();else{humi_val.f=(float)humi_val.i; 				//转换为浮点数temp_val.f=(float)temp_val.i;  				//转换为浮点数CalcSHT11(&humi_val.f,&temp_val.f);  	//修正相对湿度及温度temp1=temp_val.f*10;temp=TempCorrect(temp1);humi1=humi_val.f*10-50;humi=HumiCorrect(humi1);humi1=humi1-1;}}void key()
{if(key1==0){delay(1);if(key1==0){mode++;while(!key1);}}if(mode==1){if(key2==0){temp_max++;}if(key3==0){temp_max--;}}if(mode==2){if(key2==0){temp_min++;}if(key3==0){temp_min--;}}if(mode==3){if(key2==0){humi_max++;}if(key3==0){humi_max--;}}if(mode==4){if(key2==0){humi_min++;}if(key3==0){humi_min--;}}				if(mode==5){mode=0;}
}void main(void)
{LcdInit();ShtConnectReset();DisplayListChar(0,0,"tmpe:");DisplayListChar(8,0,"HR:");DisplayListChar(0,1,"tmpe:");DisplayListChar(9,1,"HR:");jr=0;js=0;while(1){ ReadShtData();key();DisplayOneChar(11,0,(char)(humi/10+'0'));DisplayOneChar(12,0,(char)(humi%10+'0'));DisplayOneChar(5,0,(char)(temp/10+'0'));DisplayOneChar(6,0,(char)(temp%10+'0'));DisplayOneChar(14,0,(char)(mode%10+'0'));DisplayOneChar(6,1,(char)(temp_min/10+'0'));DisplayOneChar(7,1,(char)(temp_min%10+'0'));DisplayOneChar(3,1,(char)(temp_max/10+'0'));DisplayOneChar(4,1,(char)(temp_max%10+'0'));DisplayOneChar(14,1,(char)(humi_min/10+'0'));DisplayOneChar(15,1,(char)(humi_min%10+'0'));DisplayOneChar(11,1,(char)(humi_max/10+'0'));DisplayOneChar(12,1,(char)(humi_max%10+'0'));if(temp>temp_max){led=0;delay(20000);led=1;jr=0;		}if(temp<temp_min){jr=1;led=0;delay(10000);led=1;}if(humi>humi_max){led=0;delay(5000);led=1;js=0;}if(humi<humi_min){js=1;led=0;delay(1000);led=1;}else{jr=0;js=0;}}				
}

完整代码点开链接私信  免费  获取。

【iBot机器人工作室的个人空间-哔哩哔哩】 https://b23.tv/ryUWVKa

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/235817.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx配置文件全解析【深度剖析细节】

文章目录 &#x1f4a5; 简介&#x1f4ab; 基本结构&#x1f349; 事件处理器&#x1f96d; 配置分析&#x1f34f; 配置示例 &#x1f349; HTTP服务器&#x1f96d; 配置分析&#x1f34f; 配置示例 &#x1f349; 虚拟主机 &#x1f34a; 优化&#x1f354; 总结 &#x1f…

RK3568 android 13 内置 google GMS服务

需求&#xff1a;Android 系统在国外使用安装app很多需要gms服务&#xff0c;否则无法正常使用&#xff0c;所以出厂前必须要把GMS包集成进系统 1.下载gms包https://download.csdn.net/download/qq_46524402/88136401 2.解压gms包 并放到Android SDK根目录的vender文件夹下 3…

分享从零开始学习网络设备配置--任务4.3 使用动态路由RIPng实现网络连通

任务描述 某公司使用IPv6技术搭建企业网络&#xff0c;由于静态路由需要管理员手工配置&#xff0c;在网络拓扑发生变化时&#xff0c;也不会自动生成新的路由&#xff0c;因此采用IPv6动态路由协议RIPng实现网络连通&#xff0c;实现任意两个节点之间的通信&#xff0c;并降低…

软件工程 课后题 选择 查缺补漏

在一张状态图中只能有一个初态&#xff0c;而终态则可以没有&#xff0c;也可以有多个 所有的对象可以成为各种对象类&#xff0c;每个对象类都定义了一组 方法 通过执行对象的操作可以改变对象的属性&#xff0c;但它必须经过 消息 的传递 UML应用于 基于对象的面向对象的方…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)项目搭建

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)项目搭建 持续更新中… java+vue+微信小程序项目】从零开始搭建——健身房管理平台 项目简介Java项目搭建(IDEA)1.新建项目2.项目类型3.项目设置4…

【android开发-04】android中activity的生命周期介绍

1&#xff0c;返回栈 android中使用任务task来管理activity&#xff0c;一个任务就是一组存放在栈里的活动的集合&#xff0c;这个栈被称为返回栈。栈是一种先进先出的数据结构。当我们启动一个新的活动&#xff0c;他会在返回栈中人栈&#xff0c;并处以栈顶的位置&#xff0…

C# 用代码设置受保护的Excel

写在前面 在导出Excel文件的时候&#xff0c;为了防止文件内容被篡改&#xff0c;这时候就需要对Excel设置工作簿保护和工作表保护&#xff0c;本文使用的是Spire.XLS的免费版本来实现&#xff0c;免费版本是受限的&#xff0c;但是一般情况下已经够用了。 通过NuGet引入Free…

使用npm发布typescript包

使用npm发布typescript包 什么是NPM NPM&#xff08;节点包管理器&#xff09;是 JavaScript 编程语言的默认包管理器。NPM 注册表是一个公共存储库&#xff0c;充当存储和分发 JavaScript 包的中心枢纽。它允许开发人员轻松安装、管理和共享可重用的 JavaScript 代码包&…

RNN:文本生成

文章目录 一、完整代码二、过程实现2.1 导包2.2 数据准备2.3 字符分词2.4 构建数据集2.5 定义模型2.6 模型训练2.7 模型推理 三、整体总结 采用RNN和unicode分词进行文本生成 一、完整代码 作者在文章开头地址中使用C实现了这一过程&#xff0c;为了便于理解&#xff0c;这里我…

智跃人力资源管理系统 SQL注入漏洞复现

0x01 产品简介 智跃人力资源管理系统是基于B/S网页端广域网平台&#xff0c;一套考勤系统即可对全国各地多个分公司进行统一管控&#xff0c;成本更低。信息共享更快。跨平台&#xff0c;跨电子设备 0x02 漏洞概述 智跃人力资源管理系统GenerateEntityFromTable.aspx接口处存在…

生成对抗网络(GAN)手写数字生成

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09; 二、什么是生成对抗网络1. 简单介绍2. 应用领域 三、网络结构四、构建生成器五、构建鉴别器六、训练模型1. 保存样例图片2. 训练模型 七、生成动图 一、前言 我的环境&#xff1…

centos服务器安装docker和Rabbitmq

centos服务器 一 centos安装docker1 安装docker所需要的依赖包2配置yum源3查看仓库中所有的docker版本4安装docker5 设置docker为开机自启6验证docker是否安装成功 二 使用docker安装RabbitMQ拉取RabbitMQ镜像创建并运行容器 一 centos安装docker 1 安装docker所需要的依赖包 …