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

硬件设计

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

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

仿真图:

基于51单片机的自动浇花浇水系统LCD1602显示仿真_第1张图片
原理图:
基于51单片机的自动浇花浇水系统LCD1602显示仿真_第2张图片

程序设计

#include
#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

你可能感兴趣的:(单片机,51单片机,proteus)