【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.hqwc.cn/news/418030.html

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

相关文章

免费使用IntelliJ IDEA的7种方式(2024 最新版)

大家好&#xff0c;我是小黑&#xff0c;今天要和大家分享的是如何免费使用 IntelliJ IDEA。我们都知道&#xff0c;作为一名程序员&#xff0c;拥有一个高效的开发工具是至关重要的。IntelliJ IDEA 无疑是市面上最受欢迎的开发工具之一。但是&#xff0c;获取授权的成本有时会…

探究Java中的链表

引言&#xff1a; 在Java编程中&#xff0c;链表是一种常见的数据结构&#xff0c;具有灵活的内存管理和动态的元素插入与删除能力。本篇博客将深入探讨链表的结构和概念&#xff0c;比较链表与顺序表的区别&#xff0c;介绍Java中LinkedList的常用函数并通过示例说明LinkedLis…

Android Termux技能大揭秘:安装MySQL并实现公网远程连接

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装MariaDB二. 安装cpolar内网穿透工具三. 创建安全隧道映射mysql四. 公网…

class_12:析构函数

#include <iostream>using namespace std;class Myclass{ private:int* datas; public:Myclass(int size){datas new int[size];}~Myclass(){cout<<"析构函数被调用"<<endl;delete [] datas;} };int main() {cout << "Hello World!&qu…

【复现】科达ViewShot登录系统数据库信息泄露漏洞_23

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 科达ViewShot视频监控系统采用数字化、网络化和智能化相融合的新一代视频监控技术&#xff0c;支持领先的视音频编解码算法&#…

x-cmd pkg | ncat - 网络调试工具

目录 简介首次用户快速实验指南通用的网络连接器强大的网络调试功能相关作品竞品进一步探索 简介 Ncat 是一个功能丰富的网络工具&#xff0c;用于在网络中读取、写入、重定向和加密数据。它可以处理各种安全测试和管理任务。 Ncat 是 Nmap 工具集的一部分&#xff0c;适合交…

国科大模式识别与机器学习2015-2019、2021、2023仅考题

2015 &#xff08;8&#xff09;试描述线性判别函数的基本概念&#xff0c;并说明既然有线性判别函&#xff0c;为什么还需要非线性判别函数&#xff1f;假设有两种模式&#xff0c;每类包括6个4维不同的模式&#xff0c;且良好分布。如果他们是线性可分的。问权向量至少需要几…

抖音小店无货源怎么做?新手常见问题解析,做抖店前认真阅读

大家好&#xff0c;我是电商花花。 要说现在线上创业项目什么最靠谱&#xff0c;那首先就是正处于红利期的抖音小店无货源电商项目。 无货源模式不需要货源&#xff0c;创业起来的成本低&#xff0c;风险低&#xff0c;深受创业者喜欢。 很多人都是看到抖音的巨大流量&#…

Linux 批量添加 known_hosts

前言 我们在做完linux ssh 免密登录后&#xff0c;通常会执行一些自动化任务&#xff08;比如启动Spark集群&#xff09;&#xff0c;也就是需要ssh到每台节点执行相同命令。但是有一个问题就是如果 known_hosts 文件中不存在这个ip的话&#xff0c;在第一次连接时会弹出确认公…

【C++入门】STL容器--vector底层数据结构剖析

目录 前言 1. vector的使用 vector的构造 vector迭代器 vector空间相关的接口 vector 功能型接口 find swap insert erase 2. vector内部数据结构剖析 reserve push_back和pop_back size、capacity、empty、operator[ ]&#xff1b; insert和erase resize swap 拷贝构造和…

Rust - 初识结构体

struct&#xff0c;或者 structure&#xff0c;是一个自定义数据类型&#xff0c;允许命名和包装多个相关的值&#xff0c;从而形成一个有意义的组合。如果你熟悉一门面向对象语言&#xff0c;struct 就像对象中的数据属性。 定义并实例化结构体 结构体和之前介绍过的元组类似…

介绍几个免费的国内chatgpt网站

概述&#xff1a;水点文章。 第一&#xff1a;chataa网站 chataa (chat778.com) 进去之后注册一下&#xff0c;即可免费使用。 第二&#xff1a;AlchatOS网站 AIchatOS 第三&#xff1a;ChatGPT在线聊天 ChatGPT在线聊天 (zxf7460.cn) 第四&#xff1a;说我真帅&#xff0…