【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 P0void 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 screenlcd_cmd(0x0E); //Display On, Cursor Blinkinglcd_cmd(0x38); //2 lines and 5*7 matrixlcd_cmd(0x80); //Force Cursor to beginning of firstdisplay("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;}}
}

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

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

相关文章

PHP+MySQL组合开发:微信小程序万能建站源码系统 附带完整的搭建教程

随着移动互联网的快速发展&#xff0c;微信小程序已成为企业进行移动营销的重要工具。然而&#xff0c;对于许多中小企业和个人开发者来说&#xff0c;开发一个功能完善、用户体验良好的小程序是一项复杂的任务。罗峰给大家分享一款微信小程序万能建站源码系统。该系统采用PHPM…

小白准备蓝桥杯之旅(c/c++b组)

前言&#xff1a;省赛获奖比例高达百分之60,只要比一半的人努力&#xff0c;你就能大概率获奖。 寒假做的3件事 1.稳基础 熟练掌握基础语法部分&#xff0c;c比c多个stl库优势&#xff0c;c语言的同学需要会实现c中stl库部分 2.刷真题 大概比赛前30天&#xff0c;坚持每天做…

ros2 基础教程-使用ROS 2进行相机标定

ROS 2进行相机标定&#xff08;Camera Calibration&#xff09; 相机&#xff08;摄像头&#xff09;是一种非常精密的光学仪器&#xff0c;对外界环境的感知非常敏感。由于摄像头内部和外部的一些原因&#xff0c;摄像头采集的图像常常会发生一定的畸变。如果直接将采集到的图…

JAVA和C++ SECS/GEM300开发和概念

编译SECS示例程序 1. 示例程序使用默认路径&#xff1a; D:\SECS 稳定版\SECS Debug\ 2. 该操作分为俩步 ① 将C#的Secs库编译成设备相同Net版本。 如.net3.5、4.0、4.5等等 ② 编译金南瓜SECS demo程序 编译C#的SecsEquip.dll 1. 找到SecsEquip项目 项目文件 使用Visua…

电商平台spu和sku的完整设计

一、关于数据库表的设计 1、商品属性表 比如一个衣服有颜色、尺码、款式这个叫属性表 -- ------------------------ -- 商品属性表 -- ------------------------ DROP TABLE IF EXISTS attribute; CREATE TABLE attribute (id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT CO…

LabVIEW振动数据采集与分析系统

在这个项目中&#xff0c; LabVIEW软件配合精确的硬件组件&#xff0c;以实现高效的振动数据采集和复杂信号分析。硬件方面&#xff0c;系统采用了PCB振动加速度传感器的高灵敏度传感器&#xff0c;以及NI9234型号的数据采集卡&#xff0c;确保了数据采集的高精度和可靠性。软件…

yarn包管理器在添加、更新、删除模块时,在项目中是如何体现的

技术很久不用&#xff0c;就变得生疏起来。对npm深受其害&#xff0c;决定对yarn再整理一遍。 yarn包管理器 介绍安装yarn帮助信息最常用命令 介绍 yarn官网&#xff1a;https://yarn.bootcss.com&#xff0c;学任何技术的最新知识&#xff0c;都可以通过其对应的网站了解。无…

(C语言)编译和链接

前言͟͟͞͞&#x1f48c;&#xff1a;对于现在的各种编译器而言许多都是好多个功能的集成&#xff0c;那么我们的代码到底是如何去实现的呢&#xff1f;难道我们的计算机可以直接读懂我们所写的代码&#xff0c;并运行吗&#xff1f;对于很多细心的小伙伴们可能会想这样的问题…

基于docker创建nginx容器

docker一键安装可以参考我这个博客&#xff1a;一键安装docker 1.创建基础容器 docker run -p280:280 --name nginx -d nginx创建挂载到容器的宿主机文件夹 mkdir -p /home/000nginx-ebrms-ftp/html mkdir -p /home/000nginx-ebrms-ftp/logs mkdir -p /home/000nginx-ebrms-f…

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

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

Java 内存模型深度解析

优质博文&#xff1a;IT-BLOG-CN 一、并发编程模型的两个关键问题 【1】并发中常见的两个问题&#xff1a;线程之间如何通信及线程之间如何同步。通信是指线程之间以何种机制来交换信息。在命令式编程中&#xff0c;线程之间的通信机制有两种&#xff1a;内存共享和消息传递&…

FPGA开发设计

一、概述 FPGA是可编程逻辑器件的一种&#xff0c;本质上是一种高密度可编程逻辑器件。 FPGA的灵活性高、开发周期短、并行性高、具备可重构特性&#xff0c;是一种广泛应用的半定制电路。 FPGA的原理 采用基于SRAM工艺的查位表结构&#xff08;LUT&#xff09;&#xff0c;…

智慧校园源码,云平台电子班牌系统,智能交互识别终端和移动化教育管理系统

智慧校园云平台电子班牌系统&#xff0c;利用先进的云计算技术&#xff0c;将教育信息化资源和教学管理系统进行有效整合&#xff0c;实现基础数据共享、应用统一管理。借助全新的智能交互识别终端和移动化教育管理系统&#xff0c;以考勤、课表、通知、家校互通等功能为切入点…

Linux 内核被冬季风暴 “封印“

Linus Torvalds在内核邮件列表上宣布&#xff0c;由于他所在的美国俄勒冈州波特兰地区受到严重冬季风暴的影响&#xff0c;导致网络和电力中断。波特兰及其周边地区气温急降至零下 -10C&#xff0c;因此他不得不临时中断对Linux 6.8内核的合并窗口操作。 Linus于1月7日发布了Li…

Odrive 学习系列四:如何使用脚本自动初始化odrive配置

一、背景: 在学习markbase的教程后,发现odrive的初始化配置命令确实有点多。尽管odrive有自动补全: 且可以通过 ctrl + → 来快速补全: 但是对初学者而言,仍旧有比较大的工作量。 而针对于此,我们可以通过powershell脚本的方式来解决这个问题。 二、设计初始化…

Electron Apple SignIn 登录

本人写博客&#xff0c;向来主张&#xff1a;代码要完整&#xff0c;代码可运行&#xff0c;文中不留下任何疑惑。 最讨厌写博客&#xff0c;代码只留下片段&#xff0c;文中关键的东西没写清楚。之前看了那么多文章&#xff0c;就是不告诉我clientId从哪来的。 官方资料地址&…

HCIA-HarmonyOS设备开发认证-序

序 最近涉及到HarmonyOS鸿蒙系统设备开发&#xff0c;在网络上已经有很多相关资料&#xff0c;视频教程&#xff0c;我也移植了公司的一个stm32G474板卡&#xff0c;运行LiteOS-m L0系统。 一面看资料一面移植&#xff0c;遇到不少坑&#xff0c;当看到运行的LOGO时&#xff0…

Halcon基于描述符的模板匹配

Halcon基于描述符的模板匹配 与基于透视形变的模板匹配类似&#xff0c;基于描述符的模板匹配能够在物体处于透视形变的状态下进行匹配&#xff0c;并且已标定和未标定的相机图像都适用。与透视形变不同的是&#xff0c;它的模板不是根据边缘轮廊创建的&#xff0c;而是根据特…

Elasticsearch 入门向使用

文章目录 ElasticSearch简介倒排索引安装(单节点)分词器kibana与Mysql概念上的对比索引库CRUD文档CRUDDSL查询相关性算分Function Score Query自定义算分Boolean Query 搜索结果处理排序分页高亮 数据聚合 aggregations自动补全数据同步集群 ElasticSearch 简介 Elasticsearc…

【人工智能课程】计算机科学博士作业一

【人工智能课程】计算机科学博士作业一 1 任务要求 模型拟合&#xff1a;用深度神经网络拟合一个回归模型。从各种角度对其改进&#xff0c;评价指标为MSE。掌握技巧&#xff1a; 熟悉并掌握深度学习模型训练的基本技巧。提高PyTorch的使用熟练度。掌握改进深度学习的方法。 …