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

这篇具有很好参考价值的文章主要介绍了【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.将芯片代码进行编译测试,结果正确无任何错误

【51单片机Keil+Proteus8.9】温室盆栽灌溉系统,单片机,嵌入式硬件,51单片机

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

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

【51单片机Keil+Proteus8.9】温室盆栽灌溉系统,单片机,嵌入式硬件,51单片机

【51单片机Keil+Proteus8.9】温室盆栽灌溉系统,单片机,嵌入式硬件,51单片机

【51单片机Keil+Proteus8.9】温室盆栽灌溉系统,单片机,嵌入式硬件,51单片机

【51单片机Keil+Proteus8.9】温室盆栽灌溉系统,单片机,嵌入式硬件,51单片机

【51单片机Keil+Proteus8.9】温室盆栽灌溉系统,单片机,嵌入式硬件,51单片机

六、软件源码

#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--);

}文章来源地址https://www.toymoban.com/news/detail-808647.html

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;
		}
	}
}

到了这里,关于【51单片机Keil+Proteus8.9】温室盆栽灌溉系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Proteus8仿真:51单片机使用串口进行双机通讯

    元器件 名称 电阻 RES 51单片机 AT89C51 电容 CAP 晶振 CRYSTAL BCD数码管 7SEG-BCD 串口初始化: 首先根据相关的串口寄存器编写对应的初始化代码: STC89C51单片机设有两个定时器/计数器,因定时器1有4种工作方式,而常选用定时器1的工作方式2(8位自动重装)作为波特率的溢出率。 串口

    2024年02月04日
    浏览(33)
  • Proteus8仿真:51单片机A/D转换(ADC0808)

    元器件 名称 排阻 RESPACK-8 51单片机 AT89C51 数码管 7SEG-MPX4-CA-BLUE ADC芯片 ADC0808 滑动变阻器 POT-HG ADC0808引脚作用 项目 Value ADDA-C 选择IN通道 IN0-7 模拟量输入 VREF+ ADC参考电压 VREF- ADC参考地 CLOCK 时钟 VREF+ ADC参考电压 OUT1-8 数字信号输出 START 起始信号 OE 输出使能 EOC 结束信号 ADC080

    2024年02月11日
    浏览(30)
  • 51单片机的智能温室大棚控制系统【proteus仿真+程序+报告+原理图】

    该系统由AT89C51单片机+LCD1602模块+DS18B20温度传感器模块+DS1302时间模块+继电器驱动模块+电位器模块构成。本方案适用于智能温室大棚、蔬菜大棚等各类设计中。 版本一: 1、 DS18B20 温度传感器检测大棚温度 2、光照/湿度电位器模拟,ADC0832进行转换 3、水泵/风扇/加热丝/补光灯

    2023年04月20日
    浏览(46)
  • 【MCU】单片机从 keilC51 编程到 Proteus8.9 仿真再到 STC-ISP 烧录保姆级流程

    ① 安装 USB转串口驱动(CH340) ② 打开文件夹“单片机软件开发板USB转串口CH340驱动” ③ 双击安装程序“CH341SER” ④ “用户账户控制”点击“是” ⑤ 点击“安装” ⑥ 安装成功点击“确定”,然后点击“关闭” 至此,USB转串口驱动安装完毕。 ① 启动程序“Keil uVison5” ②

    2024年02月03日
    浏览(39)
  • 51单片机实现简易计算机,Keil4代码Proteus工程一步到位

    目录  前言  Proteus硬件部分 键盘 程序部分 运算代码逻辑(代码解释) LCD屏幕显示运算结果 输入部分 键值判断部分 删除按键的实现 程序执行运算 Hello,大家好。想做关于嵌入式的一些小项目已经很久了,今天借着我们课设的机会,给大家展示我自己对代码逻辑的理解,为了方

    2024年02月08日
    浏览(33)
  • 单片机仿真软件Proteus8.0的安装及使用

    介绍: Proteus是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、

    2023年04月09日
    浏览(39)
  • keil和proteus联手实操单片机

    学习单片机这部分实践课时,遇到代码保存和格式转换问题,下面,我们针对这个问题进行傻瓜式教学灯塔的实践操作,keil用的是Keil uVision2 软件,proteus用到是8.6版。 第一步,先打开keil,就会发现有file大图标,  打开file,单击file下的new..,出现下面的新界面 然后再这个编

    2024年02月04日
    浏览(44)
  • 【51单片机系列】proteus仿真单片机的串口通信

    本文参考:https://zhuanlan.zhihu.com/p/425809292。 在proteus之外使用串口软件和单片机通信。通过在proteus设计一个单片机接收PC发送的数据,并将接收的数据发送出去,利用软件【Configure Virtual Serial Port Driver】创建一对虚拟串口,利用软件【串口助手】向单片机发送数据。 proteus仿真

    2024年01月17日
    浏览(42)
  • 【PROTEUS-51单片机串口通信仿真】

    本次实验对51单片机的串口进行了双机通信的仿真,实现了51单片机的简单双机通信;现对本次仿真的结构及实现的功能做简要的介绍, 本次仿真主要构成:主机U1-MASTER、从机U2-SLAVE、以及LED显示部分(第一部分显示主机接收到的信息、第二部分显示从机接收到的信号); 实

    2024年01月15日
    浏览(63)
  • 【Proteus仿真】【51单片机】贪吃蛇游戏

    本项目使用Proteus8仿真51单片机控制器,使用8*8LED点阵、按键模块等。 主要功能: 系统运行后,可操作4个按键控制小蛇方向。 B站演示视频:https://space.bilibili.com/444388619 视频地址:https://space.bilibili.com/444388619/video 专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联

    2024年02月06日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包