基于51单片机水位监测控制自动抽水—LCD1602
基于51单片机水位监控抽水
(仿真+程序+原理图+设计报告)
功能介绍
具体功能:
本产品采用单片机+LCD1602液晶显示+继电器+抽水电机+蜂鸣器设计而成。
主要功能:
1.通过水位传感器对水位检测,把检测到的结果送入单片机进行处理;
2.LCD1602显示水位0-4水位等级;
3.水位检测为0时,开始抽水并报警,最高水位自动取消抽水;
4.若水位在1~3之间,可以通过按键手动开启/关闭抽水;
程序
#include<reg52.h>
#include <intrins.h>
/*****************宏定义******************/
#define uint unsigned int
#define uchar unsigned char
#define u8 unsigned char
#define u16 unsigned int
/***********位操作端口定义**************/sbit speak=P2^0; // 蜂鸣器
sbit JK2=P1^6; // 水位继电器sbit led3=P2^7; //3/4水位指示灯
sbit led2=P2^4; //1/2水位指示灯
sbit led1=P2^1; //1/4水位指示灯sbit SW041=P1^0; //1/4水位
sbit SW021=P1^1; //1/2水位
sbit SW043=P1^2; //3/4水位
sbit SW01=P1^3; //满水位/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
void delay_ms(uint q)
{uint i,j;for(i=0;i<q;i++)for(j=0;j<110;j++);
}/***********************************************************************************************************
按键检测相关函数
***********************************************************************************************************/
//按键
sbit Key1=P1^4; //设置键
sbit Key2=P1^5; //加按键#define KEY_SET 1 //设置
#define KEY_ADD 2 //加//完整资料
//微信公众号:木子单片机//========================================================================
// 函数: u8 Key_Scan()
// 应用: temp=u8 Key_Scan();
// 描述: 按键扫描并返回按下的键值
// 参数: NONE
// 返回: 按下的键值
// 版本: VER1.0
// 备注: 该函数带松手检测,按下键返回一次键值后返回0,直至第二次按键按下
//========================================================================
u8 Key_Scan()
{ static u8 key_up=1;//按键按松开标志if(key_up&&(Key1==0||Key2==0)){delay_ms(10);//去抖动 key_up=0;if(Key1==0) return 1;else if(Key2==0)return 2;}else if(Key1==1&&Key2==1)key_up=1; return 0;// 无按键按下
}uchar Mode=0; //
/***********************************************************************************************************
LCD1602相关函数
***********************************************************************************************************///LCD管脚声明 (RW引脚实物直接接地,因为本设计只用到液晶的写操作,RW引脚一直是低电平)
sbit LCDRS = P2^5;
sbit LCDEN = P2^6;//LCD延时
void LCDdelay(uint z) //该延时大约100us(不精确,液晶操作的延时不要求很精确)
{uint x,y;for(x=z;x>0;x--)for(y=10;y>0;y--);
}
//写命令
void write_com(uchar com)
{LCDRS=0; P0=com;
// DAT=com;LCDdelay(5);LCDEN=1;LCDdelay(5);LCDEN=0;
}
//写数据
void write_data(uchar date)
{LCDRS=1;P0=date;
// DAT=date;LCDdelay(5);LCDEN=1;LCDdelay(5);LCDEN=0;
}/*------------------------------------------------选择写入位置
------------------------------------------------*/
void SelectPosition(unsigned char x,unsigned char y)
{ if (x == 0) { write_com(0x80 + y); //表示第一行}else { write_com(0xC0 + y); //表示第二行}
}
/*------------------------------------------------写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{ SelectPosition(x,y) ;while (*s) { write_data( *s); s ++; }
}
//========================================================================
// 函数: void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
// 应用: LCD_Write_Char(0,1,366,4) ;
// 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366
// 参数: x:行,y:列,s:要显示的字,l:显示的位数
// 返回: none.
// 版本: VER1.0
// 备注: 最大显示65535
//========================================================================
void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
{ SelectPosition(x,y) ;if(l>=5)write_data(0x30+s/10000%10); //万位if(l>=4)write_data(0x30+s/1000%10); //千位if(l>=3)write_data(0x30+s/100%10); //百位if(l>=2)write_data(0x30+s/10%10); //十位if(l>=1)write_data(0x30+s%10); //个位}
/*1602指令简介write_com(0x38);//屏幕初始化write_com(0x0c);//打开显示 无光标 无光标闪烁write_com(0x0d);//打开显示 阴影闪烁write_com(0x0d);//打开显示 阴影闪烁
*/
//1602初始化
void Init1602()
{uchar i=0;write_com(0x38);//屏幕初始化write_com(0x0c);//打开显示 无光标 无光标闪烁write_com(0x06);//当读或写一个字符是指针后一一位write_com(0x01);//清屏}/**********主函数******************/
void main()
{ u8 j=0;u8 key;u8 sd=2;Init1602(); //调用初始化显示函数LCD_Write_String(0,0," Shuiwei Kz "); //开机界面LCD_Write_String(1,0," Dj: "); while(1){if(!JK2)LCD_Write_String(1,6," Start ");elseLCD_Write_String(1,6," Stop ");key=Key_Scan(); //按键扫描if(key==KEY_SET){sd=1;}if(key==KEY_ADD){sd=0;}if((SW01==1)&&(SW043==1)&&(SW021==1)&&(SW041==1)) //0水位 指示 启动水泵加水{led1=0; led2=1; led3=1; JK2=0;j++;if(j<10){speak=1;}else if(j<20){speak=0;} //else j=0;Mode=0;//禁止手动浇水LCD_Write_Char(1,5,0,1) ;sd=2;delay_ms(3);}if((SW01==1)&&(SW043==1)&&(SW021==1)&&(SW041==0)) //1/4水位指示{led1=1; speak=1;led2=0; led3=1; Mode=1;//允许手动浇水LCD_Write_Char(1,5,1,1) ;}if((SW01==1)&&(SW043==1)&&(SW021==0)&&(SW041==0)) //1/2水位指示{led1=1; speak=1;led2=0; led3=1; Mode=1;//允许手动浇水LCD_Write_Char(1,5,2,1) ;}if((SW01==1)&&(SW043==0)&&(SW021==0)&&(SW041==0)) //3/4水位指示{led1=1; speak=1;led2=0; led3=1; Mode=1;//允许手动浇水LCD_Write_Char(1,5,3,1) ;}if((SW01==0)&&(SW043==0)&&(SW021==0)&&(SW041==0)) //如果水满了 指示灯指示 停止加水{led1=1; speak=1;led2=1; led3=0; Mode=0;//禁止手动浇水JK2=1; LCD_Write_Char(1,5,4,1) ;sd=2;}} }
硬件设计
使用元器件:
单片机:STC89C52;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
蜂鸣器:BUZZER;排针4-Pin;
直插电解电容:10uf、1000uf;
直插瓷片电容:30P;5V小水泵;
5mm发光二极管;DC电源插座;
水位小板;按键6X6X5MM;
PNP 三极管;NPN三极管;
色环电阻:2.2K、1k、10k;
LCD1602液晶显示器;
HRS4FH-S5V继电器;
自锁开关:SW8*8;
晶振:12MHZ;
导线:若干;
设计资料
01仿真图
本设计使用proteus7.8和proteus8.9两个版本设计!具体如图!
02原理图
本系统原理图采用Altium Designer19设计,具体如图!
03程序
本设计使用软件keil5版本编程设计!具体如图!
04设计报告
七千字设计报告,具体如下!
05设计资料
全部资料包括程序(含注释)、仿真源文件 、AD原理图、任务书、开题报告、设计报告、实物图、元件清单等。具体内容如下,全网最全! !
大家共同学习进步:
点赞分享一起学习成长。