基于51单片机的自动浇花浇水系统LCD1602显示仿真

文章目录[隐藏]

硬件设计

基本框架
该电路的工作原理是由STC89C52单片机和ADC0832组成系统的核心部分,湿度传感器将采集到的数据直接传送到ADC0832的IN端作为输入的模拟信号。选用湿度传感器和AD转换,电路内部包含有湿度采集、AD转换、单片机译码显示等功能。单片机需要采集数据时,发出指令启动A/D转换器工作,ADC0832根据送来的地址信号选通IN1通道,然后对输入的模拟信号进行转换,转换结束时,EOC输出高电平,通知单片机可以读取转换结果,单片机通过调用中断程序,读取转换后的数据。最后,单片机把采集到的湿度数据经过软件程序处理后送到LCD1602进行显示。自动浇水系统设计为智能和手动两个部分:智能浇水部分是通过单片机程序设计浇水的上下限值与感应电路送入单片机的土壤湿度值相比较,当低于下限值时,单片机输出一个信号控制浇水,高于上限值时再由单片机输出一个信号控制停止浇水;手动部分是由通过关闭单片机电源,由外围电路供电进行浇灌。

土壤温湿度采集与显示
土壤温湿度采集与显示系统以单片机STC89C52为控制核心,通过软件设置达到具体动作实现。土壤的温湿度是由ADC0832和两个点位器进行模拟并送入单片机,通过单片机的I/O口把检测到的土壤温湿度值用LCD显示出来。同时,如果系统在智能浇水设置情况下,则该值与设定的浇水上下限值相比较,若低于下限值,则单片机发出一个控制信号,开始浇水。若高于上限值时,单片机再发出一个控制信号控制,停止浇水。如果系统设置在手动浇水情况下,则按照设定好的定时浇水时间进行浇水,温湿度检测电路把检测到的土壤温湿度值显示在LCD上,以达到对土壤温湿度实时监测的目的。

仿真图:

在这里插入图片描述
原理图:
在这里插入图片描述

程序设计

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int 

sbit ad_cs=P1^3;	 //ADC0832的控制位
sbit ad_clk=P1^0;
sbit ad_dat=P1^1;

sbit lcd_rs=P3^0;	 //LCD1602的控制位
sbit lcd_e=P3^1;

sbit key1=P1^4;		 //独立按键
sbit key2=P3^2;
sbit key3=P3^3;

sbit relay=P1^6;     //继电器
sbit led=P1^7;     //指示灯

bit flag=1;		     //工作模式标志
bit flag_motor=1;	 //手动模式下,抽水机开关标志
bit flag_jia=0;
bit flag_jian=0;

uchar Hum_H=60;		 //自动模式下,湿度设定最大值
uchar Hum_L=30;		 //自动模式下,湿度设定最小值

uchar num=0;

/********************延时函数1ms*****************
void delay_ms(uint a)					
{
	uint i;
	while(a--)
	for(i=0;i<125;i++);
}
*************************************/


/*******************延时函数50us******************/
void delay_50us(uint a)
{
	uint i;
	while(a--)
	for(i=0;i<19;i++);
}
/*************************************/

/*******************ADC读取******************/
uchar read_ad(uchar channel)  
{
	uchar i;
	uchar dat1,dat2;
	ad_clk=0;
	ad_cs=0;
	ad_dat=1;
	ad_clk=1;
	ad_clk=0;  //起始信号

	ad_dat=1;
	ad_clk=1;
	ad_clk=0;  //选择单通道模式

	ad_dat=channel;//0对应通道0,1对应通道1
	ad_clk=1;
	ad_clk=0;

	ad_dat=1;

	for(i=0;i<8;++i)
	{
	 	ad_clk=1;
		ad_clk=0;
		dat1=dat1<<1;
		if(ad_dat)
		dat1|=0x01;	
	
	}
	for(i=0;i<8;i++)
	{
	 	dat2=dat2>>1;
		if(ad_dat)
		dat2|=0x80;	
		
		ad_clk=1;
		ad_clk=0;
	} 
	ad_cs=1;
	return (dat1==dat2)?dat1:0;
	
}
/*************************************/

/*******************LCD1602初始化******************/
void write_com(uchar com)	//写指令
{
	lcd_e=0;
	lcd_rs=0;
	P0=com;
	delay_50us(10);
	lcd_e=1;
	delay_50us(10);
	lcd_e=0;
}

void write_data(uchar dat)  //写数据
{
	lcd_e=0;
	lcd_rs=1;
	P0=dat;
	delay_50us(10);
	lcd_e=1;
	delay_50us(10);
	lcd_e=0;
}			 

void init_lcd1602()		 //lcd 初始化
{
	delay_50us(300);
	write_com(0x38);
	delay_50us(100);
	write_com(0x38);
	delay_50us(100);
	write_com(0x38);
	write_com(0x38);
	write_com(0x08);
	write_com(0x01);
	write_com(0x06);
	write_com(0x0c);
}

void display_shu(uchar add,uchar dat)	  //显示数字
{
	uchar l,m;
	
//	k=dat/100;
	l=dat%100/10;
	m=dat%10;

	write_com(0x80+add);
//	write_data(k+0x30);
	write_data(l+0x30);
	write_data(m+0x30);
}

void display_string(uchar add,uchar *dat)  //显示字符串
{
	uchar i;
 	write_com(0x80+add);
	while(dat!=0&&(*dat!='\0')&&i<16)
	{
	 	write_data(*dat);
		dat++;
		i++;
		if(i==15) i=0;
	}
}
/*****************************************/

/****************主函数*******************/
void main()
{
	EA=1;							  //开总中断
	EX0=1;							  //开外部中断0
	EX1=1;							  //开外部中断1
	IT0=0;							  //外部中断0触发方式为低电平
	IT1=0;							  //外部中断1触发方式为低电平
	
	init_lcd1602();	
//	relay=0;
	display_string(0,"Hum:  %");      //实时显示当前的湿度
	display_string(11,"H:  %");       //显示设置的湿度最大值

	display_string(0x40,"Mode:");	  //显示工作模式
	display_string(0x40+11,"L:  %");  //显示设置的湿度最小值


附:http://www.jh-tec.cn/archives/7141

版权声明:本文为CSDN博主「m0_60139146」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_60139146/article/details/122290907

生成海报
点赞 0

m0_60139146

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于8051单片机实现电子时钟+数字秒表设计

概述 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许

Keil报错 requires ANSI-style prototype

在进行模块化程序设计时遇到这种error: 这是头文件没有定义的问题 首先在同一个目录下建立一个.h文件: 第二步打开文件,进行编辑。要用到#ifndef……#define……#endif&#xff0

基于AT89C51的蓝牙循迹避障小车

基于AT89C51的蓝牙循迹避障小车 对标题的解读: AT89C51:在下使用的是STC89C52这款芯片,c51和c52在新手入门阶段是一样的,所以不必纠结于到底是哪个名字&#xff