【51单片机Keil+Proteus8.9】温室盆栽灌溉系统

实验五

  • 实验名称

温室盆栽灌溉系统

软件设计:

1. 定义对应的引脚和端口的别名。

2. 编写延时函数,用于控制程序的执行速度。

3. 编写LCD控制函数,包括发送命令和发送数据两种操作。

4. 编写显示函数,用于在LCD上显示字符串。

5. 编写获取AD转换结果的函数,用于测量环境湿度。

6. 编写显示百分比的函数,用于在LCD上显示湿度百分比。

7. 编写按键扫描函数,用于检测按键的状态。

8. 在主函数中,初始化LCD显示屏,并显示初始界面。

9. 进入主循环,不断执行以下操作:

   a. 扫描按键,根据按键的状态更新标准湿度值。

   b. 根据当前选择的花卉类型,显示相应的花卉名称。

   c. 获取环境湿度,并计算百分比。

   d. 在LCD上显示当前湿度百分比和标准湿度。

   e. 根据湿度与标准湿度的比较结果,控制水泵、风机和LED灯的状态。

具体:

  1. delay函数实现了一个简单的延迟函数,n为延迟的时间,具体延迟的时间可以通过调整循环的次数来实现。
  2. lcd_cmd函数用于发送命令到液晶显示屏。a为要发送的命令值,将它赋给P0端口,然后将RS置为0以表示发送命令,将EN置为1以启动命令传输,延迟一段时间后将EN置为0以停止传输。
  3. lcd_data函数用于向液晶显示屏发送数据。和lcd_cmd函数相似,不同之处在于将RS置为1以表示发送数据。
  4. display函数用于在液晶显示屏上显示字符串。通过指针ptr遍历字符串,对每个字符调用lcd_data函数进行显示。
  5. delay_10us函数用于微秒级别的延迟。通过循环次数来实现延迟。
  6. 利用`display_percentage`函数来将温度值转换成字符串,并显示百分比值。

  1.将芯片代码进行编译测试,结果正确无任何错误

2.生成HEX文件,放入AT89C51芯片中运行硬件电路。

3.不同花卉的阈值湿度和土壤湿度:

六、软件源码

#include<reg51.h>

#include<intrins.h>

typedef unsigned char u8;

typedef unsigned int u16;

sbit RS=P2^0;

sbit RW=P2^1;

sbit EN=P2^2;

sbit CS=P3^0;

sbit CLK=P3^1;

sbit DIO=P3^2;

sbit D_STD=P1^0;

sbit P_STD=P1^1;

sbit R_STD=P1^2;

sbit INC=P1^3;

sbit DEC=P1^7;

sbit FMQ=P2^3;

sbit LED_RED=P2^4;

sbit WATER=P2^5;

#define LCD P0

void delay_10us(u16 ten_us)

{

while(ten_us--);

}

void delay(int n)

{

int i,j;

for(i=0;i<n;i++)

for(j=0;j<255;j++);

}

void lcd_cmd(char a)

{

LCD = a;

RS = 0;

EN = 1;

delay(10);

EN = 0;

}

void lcd_data(char a)

{

LCD = a;

RS = 1;

EN = 1;

delay(10);

EN = 0;

}

void display(char *ptr)

{

while(*ptr != '\0')

{

lcd_data(*ptr);

ptr++;

}

}

u8 getADRes()

{

u8 i, data1=0, data2=0;

CS=0;

CLK=0;DIO=1;_nop_();

CLK=1;_nop_();

CLK=0;DIO=1;_nop_();

CLK=1;_nop_();

CLK=0;DIO=0;_nop_();

CLK=1;_nop_();

CLK=0;DIO=1;_nop_();

for(i=0; i<8; i++)

{

CLK=1;_nop_();

CLK=0;_nop_();

data1=(data1<<1)|(u8)DIO;

}

for(i=0; i<8; i++)

{

data2=data2|(u8)DIO<<i;

CLK=1;_nop_();

CLK=0;_nop_();

}

CS=1;

return(data1==data2)?data1:0;

}

void display_percentage(u8 value)

{

u8 temp[3];

temp[0]=value/100+'0';

temp[1]=value%100/10+'0';

temp[2]=value%100%10+'0';

if(temp[0]=='1')lcd_data(temp[0]);

lcd_data(temp[1]);

lcd_data(temp[2]);

lcd_data('%');

}

u8 key_scan(u8 mode)

{

u8 key=1;

if(mode)key=1;

if(key==1&&(D_STD==0||P_STD==0||R_STD==0||INC==0||DEC==0))

{

delay_10us(1000);

key=0;

if(D_STD==0)

return 0;

else if(P_STD==0)

return 1;

else if(R_STD==0)

return 2;

else if(INC==0)

return 3;

else if(DEC==0)

return 4;

}

else if(D_STD==1&&P_STD==1&&R_STD==1&&INC==1&&DEC==1)

{

key=1;

}

return 5;

}

void main()

{

u8 value=0, index=0, key_value=0;

char standard[3]={40, 50, 30};

RW=0;

WATER=0;

FMQ=1;

LED_RED=0;

lcd_cmd(0x01); //clear screen

lcd_cmd(0x0E); //Display On, Cursor Blinking

lcd_cmd(0x38); //2 lines and 5*7 matrix

lcd_cmd(0x80); //Force Cursor to beginning of first

display("shuixianhua");

lcd_cmd(0xC0);

display("N:");

lcd_cmd(0xC8);

display("S:");

while(1)

{

key_value=key_scan(0);

if(key_value==3){

standard[index]++;

if(standard[index]>100)standard[index]=100;

}else if(key_value==4){

standard[index]--;

if(standard[index]<0)standard[index]=0;

}else if(key_value>=0&&key_value<=2){

index=key_value;

}

switch(index){

case 0: lcd_cmd(0x80);

display("shuixianhua");

break;

case 1: lcd_cmd(0x80);

display("mudanhua");

break;

case 2: lcd_cmd(0x80);

display("meiguihua");

break;

}

lcd_cmd(0xC2);

value=getADRes()*100/255;

display_percentage(value);

lcd_cmd(0xCA);

display_percentage(standard[index]);

if(value<standard[index]){

WATER=1;

FMQ=0;

LED_RED=1;

}else{

WATER=0;

FMQ=1;

LED_RED=0;

}

}

}

六、软件源码
#include<reg51.h>
#include<intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit CS=P3^0;
sbit CLK=P3^1;
sbit DIO=P3^2;
sbit D_STD=P1^0;
sbit P_STD=P1^1;
sbit R_STD=P1^2;
sbit INC=P1^3;
sbit DEC=P1^7;
sbit FMQ=P2^3;
sbit LED_RED=P2^4;
sbit WATER=P2^5;

#define LCD P0

void delay_10us(u16 ten_us)
{
	while(ten_us--);
}

void delay(int n)
{
	int i,j;
	for(i=0;i<n;i++)
	for(j=0;j<255;j++);
}

void lcd_cmd(char a)
{
	LCD = a;
	RS = 0;
	EN = 1;
	delay(10);
	EN = 0;
}

void lcd_data(char a)
{
	LCD = a;
	RS = 1;
	EN = 1;
	delay(10);
	EN = 0;
}

void display(char *ptr)
{
	while(*ptr != '\0')
	{
		lcd_data(*ptr);
		ptr++;
	}
}

u8 getADRes()
{
	u8 i, data1=0, data2=0;
	CS=0;
	
	CLK=0;DIO=1;_nop_();
	CLK=1;_nop_();
	
	CLK=0;DIO=1;_nop_(); 
	CLK=1;_nop_();
	
	CLK=0;DIO=0;_nop_();
	CLK=1;_nop_();
	
	CLK=0;DIO=1;_nop_(); 
	
	for(i=0; i<8; i++)
	{
		CLK=1;_nop_();
		CLK=0;_nop_();
		data1=(data1<<1)|(u8)DIO; 
	}
	
	for(i=0; i<8; i++)
	{
		data2=data2|(u8)DIO<<i;
		CLK=1;_nop_();
		CLK=0;_nop_();
	}
	CS=1;
	
	return(data1==data2)?data1:0;
}

void display_percentage(u8 value)
{
	u8 temp[3];
	temp[0]=value/100+'0';
	temp[1]=value%100/10+'0';
	temp[2]=value%100%10+'0';
	if(temp[0]=='1')lcd_data(temp[0]);
	lcd_data(temp[1]);
	lcd_data(temp[2]);
	lcd_data('%');
}

u8 key_scan(u8 mode)
{
	u8 key=1;
	if(mode)key=1;
	if(key==1&&(D_STD==0||P_STD==0||R_STD==0||INC==0||DEC==0))
	{
		delay_10us(1000);
		key=0;
		if(D_STD==0)
		return 0;
		else if(P_STD==0)
		return 1;
		else if(R_STD==0)
		return 2;
		else if(INC==0)
		return 3;
		else if(DEC==0)
		return 4;
	}
	else if(D_STD==1&&P_STD==1&&R_STD==1&&INC==1&&DEC==1)
	{
		key=1;
	}
	return 5;
}

void main()
{
	u8 value=0, index=0, key_value=0;
	char standard[3]={40, 50, 30};
	RW=0;
	WATER=0;
	FMQ=1;
	LED_RED=0;
	lcd_cmd(0x01); //clear screen
	lcd_cmd(0x0E); //Display On, Cursor Blinking
	lcd_cmd(0x38); //2 lines and 5*7 matrix
	lcd_cmd(0x80); //Force Cursor to beginning of first
	display("shuixianhua");
	lcd_cmd(0xC0);
	display("N:");
	lcd_cmd(0xC8);
	display("S:");
	while(1)
	{
		key_value=key_scan(0);
		if(key_value==3){
			standard[index]++;
			if(standard[index]>100)standard[index]=100;
		}else if(key_value==4){
			standard[index]--;
			if(standard[index]<0)standard[index]=0;
		}else if(key_value>=0&&key_value<=2){
			index=key_value;
		}
		switch(index){
			case 0: lcd_cmd(0x80);
							display("shuixianhua");
							break;
			case 1: lcd_cmd(0x80);
							display("mudanhua");
							break;
			case 2: lcd_cmd(0x80);
							display("meiguihua");
							break;
		}
		lcd_cmd(0xC2);
		value=getADRes()*100/255;
		display_percentage(value);
		
		lcd_cmd(0xCA);
		display_percentage(standard[index]);
		
		if(value<standard[index]){
			WATER=1;
			FMQ=0;
			LED_RED=1;
		}else{
			WATER=0;
			FMQ=1;
			LED_RED=0;
		}
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# dataGridView 列的勾选框改变事件

dataGridView 增加一列 DataGridViewCheckBoxColumn 然后设置复选框值如下图&#xff1a; dataGridView增加两个事件 private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e){//提交改变&#xff0c;触发dataGridView1_CellValueChanged事件&…

3Dmax灯光学习(Vray灯光应用)

渲染效果图可以用渲染100哦&#xff0c;最高支持max2024&#xff0c;cr11&#xff0c;vr6.2&#xff0c;支持LUT和Acescg工作流等常用插件&#xff0c;同时森林插件7.43也进行了支持&#xff0c;注册填邀请码【7788】即可免费测试&#xff01; 灯光应用 普通灯光/标准灯光(外景…

Unity vs Godot :哪个游戏引擎更适合你?

Unity vs Godot &#xff1a;哪个游戏引擎更适合你&#xff1f; 游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来&#xff0c;Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较&#xff0c;以期为开发者提供正确的选择建议。 Godot和Unity都有…

mac PyCharm 上传文件到远程服务器+远程服务器下载到本地

1 部署配置 选择SFTP name&#xff1a;test6 输入ssh账号和密码。保存密码和30s心跳。 2 目录映射 Local path&#xff08;本地mac机器&#xff09;&#xff1a;/Users/clevercode/PycharmProjects/test6 Root path&#xff08;远程服务机器&#xff09;&#xff1a;/home/…

Debian 10.13.0 安装图解

引导和开始安装 这里直接回车确认即可&#xff0c;选择图形化安装方式。 选择语言 这里要区分一下&#xff0c;当前选中的语言作为安装过程中安装器所使用的语言&#xff0c;这里我们选择中文简体。不过细心的同学可能发现&#xff0c;当你选择安装器语言之后&#xff0c;后续安…

关于运维·关于Zabbix监控平台的面试点

目录 引言&#xff1a;明人不说暗话&#xff0c;今天分享几个在面试的时候常被问到关于Zabbix监控平台的面试点 1、zabbix的优点 2、zabbix的缺点 3、zabbix的监控模式 4、zabbix自定义监控怎么做 5、zabbix的自动发现功能 6、zabbix分布式监控有什么特点 引言&#xff1…

找不到mfc100.dll的解决方法,怎么修复mfc100.dll文件

当我们在使用电脑时&#xff0c;时常可能会遇到各类系统提示的错误信息。"找不到mfc100.dll" 就是这些错误之一&#xff0c;该错误提示会妨碍我们执行一些应用程序或特定代码。为了帮助读者克服这个技术障碍&#xff0c;本篇文章将详尽阐明导致该问题的根本原因&…

技术硬实力,阿里巴巴为什么要开源Spring Cloud Alibaba?

Spring Cloud Alibaba是阿里巴巴开源的一款高性能的微服务RPC框架&#xff0c;关于Spring Cloud Alibaba的详细介绍我这里就不啰嗦了&#xff0c;大家可以参考官网及相关源码&#xff0c;我这里只是想聊的是“阿里巴巴为什么要开源Spring Cloud Alibaba”&#xff0c;只要追根朔…

日常生活小技巧 -- Wireshark显示过滤器语法规则

抓包工具 Wireshark 过滤器使用还是用的比较少的。看一下怎么用的。 一、显示过滤器&#xff1a; 显示过滤表达示在工具栏下方的“显示过滤器”输入框输入即可生效。 点击管理显示过滤&#xff1a; 可以看到还是有一些示例的&#xff1a; 比如&#xff1a; 只显示80端口&am…

员工工作效率提高妙招

通过实际的工作量纪实&#xff0c;大量的基础数据得以充分有效地运用&#xff0c;客户对华恒智信顾问团队的认真工作态度以及细致的工作方法表示认同与肯定&#xff0c;认为这为企业提供了一种量化的定编模式以及管理的量化依据&#xff0c;非常值得推广运用。 一、现存问题 某…

工作中使用Redis的10种场景

前言 Redis作为一种优秀的基于key/value的缓存&#xff0c;有非常不错的性能和稳定性&#xff0c;无论是在工作中&#xff0c;还是面试中&#xff0c;都经常会出现。 今天这篇文章就跟大家一起聊聊&#xff0c;我在实际工作中使用Redis的10种场景&#xff0c;希望对你会有所帮助…

滚动菜单+图片ListView

目录 Fruit.java FruitAdapter MainActivity activity_main.xml fruit.xml 整体结构 Fruit.java public class Fruit {private String name;private int imageId;public Fruit(String name, int imageId) {this.name name;this.imageId imageId;}public String getNam…

ZooKeeper 简介

1、概念介绍 ZooKeeper 是一个开放源码的分布式应用程序协调服务&#xff0c;为分布式应用提供一致性服务的软件&#xff0c;由雅虎创建&#xff0c;是 Google Chubby 的开源实现&#xff0c;是 Apache 的子项目&#xff0c;之前是 Hadoop 项目的一部分&#xff0c;使用 Java …

小程序宿主环境-组件swiper

巧识小程序的开发过程学习. 在我们的list.wxml中创建组件 <swiper class"swiper-container" indicator-dots indicator-color"white" indicator-active-color"grey" autoplay interval"2000" circular><!--第一个轮播图--&…

中电金信「财务公司核心系统白皮书」

随着数字技术的深度应用&#xff0c;数字化转型正迎来新一轮变革。如何促进企业战略转型&#xff0c;助力企业发展提质增效&#xff0c;以标准化、数字化、精细化支撑企业实现高质量发展&#xff0c;已成为财务公司数字化转型的重要课题。 为落实国资委加快建设世界一流财务管…

【Qt-license】误操作qt下载导致只能安装商业版试用十天,无法安装社区版

背景&#xff1a; 原本是为了学习qml&#xff0c;需要下载一个design studio&#xff0c;而这个需要比较新版的安装程序&#xff0c;但新版的安装程序官方都是online安装。于是从官网找下载链接。毕竟是英文的&#xff0c;又心急&#xff0c;误打误撞中我选择了商业版试用。 其…

gh0st远程控制——客户端界面编写(二)

● 补充小知识&#xff1a;枚举类型的使用 每个控件&#xff08;比如列表&#xff09;都对应一个自己的唯一的变量 使用枚举类型可以将变量名与编号进行绑定&#xff0c;以后程序需要扩展的时候&#xff0c;只需要在定义枚举变量的位置重新修改编号就可以了&#xff0c;这样全…

CentOS上安装Mellanox OFED

打开Mellanox官网下载驱动 Linux InfiniBand Drivers 点击下载链接跳转至 Tgz解压缩执行 ./mlnxofedinstall发现缺少模块 # ./mlnxofedinstall Logs dir: /tmp/MLNX_OFED_LINUX.11337.logs General log file: /tmp/MLNX_OFED_LINUX.11337.logs/general.log Verifying KMP rpm…

Git中,版本库和远程库有什么区别

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

Win10 打开文件突然鼠标变成一个蓝色大圈卡住点不了也打不开文件,重启电脑也是这样

环境: Win10 专业版 加密客户端环境 问题描述: Win10 打开桌面word文件突然鼠标变成一个蓝色大圈卡住点不了也打不开文件,重启电脑也是这样,只有蓝色圈变大没有鼠标指针出现圈卡着不会动,和那些有鼠标箭头加小蓝色圈不一样 解决方案: 某网上查看的,还是要自己排查…