基于51单片机自动浇花1602液晶显示设计
1、系统功能介绍
-
系统构成:
- 采用STC89C52单片机+ADC0832+LCD1602液晶+土壤湿度传感器+抽水电机+ 按键+蜂鸣器设计而成。
-
系统功能:
-
- 产品自带单片机上电复位电路、手动复位电路(复位按键)、晶振电路(给单片机提供时钟周期)。
-
- 采集LCD1602液晶显示土壤湿度,报警参数可以同时显示出来。
-
- 可以设置湿度的上下限报警范围。
-
- 当湿度低于下限值时,打开水泵进行抽水自动灌溉同时声光报警,当湿高于上限值时,自动关闭水泵停止灌溉。
-
- 具有手动模式,按减键手动打开抽水电机,可以按加键手动关闭抽水电机。
-
-
可根据本篇文章完成毕业设计的开题报告、任务书、设计等
2、资料下载
- 资料下载链接:https://download.csdn.net/download/qq_39020934/89662438
- 更多设计视频:https://space.bilibili.com/3537120073353692
3、系统电路介绍
3.1、STC89C52单片机核心系统电路设计
- STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
STC89C52主要特性如下:
- (1)8K字节程序存储空间;
- (2)512字节数据存储空间;
- (3)内带4K字节EEPROM存储空间;
- (4)可直接使用串口下载
单片机最小系统电路图如下图所示
实物图:
3.2、ADC0832 A/D采样电路设计
- ADC0832其实就是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。是目前国内应用最广泛的8位通用A/D芯片。
芯片特性:
- 1)8路输入通道,8位A/D转换器,即分辨率为8位。
- 2)具有转换起停控制端。
- 3)转换时间为100μs(时钟为640kHz时),130μs(时钟为500kHz时)
- 4)单个+5V电源供电
- 5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
- 6)工作温度范围为-40~+85摄氏度
- 7)低功耗,约15mW。
电路原理图:
实物图:
3.3、LCD1602液晶显示模块电路设计
- LCD显示器分为字段显示和字符显示两种。其中字段显示与LED显示相似,只要送对应的信号到相应的管脚就能显示。字符显示是根据需要显示基本字符。本设计采用的是字符型显示。系统中采用LCD1602作为显示器件输出信息。与传统的LED数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机应用设计中最常用的显示器件了。LCD1602可以显示2行16个汉字。
LCD1602主要技术参数如下
- (1)显示容量为16×2个字符;
- (2)芯片工作电压为4.5~5.5V;
- (3)工作电流为2.0mA(5.0V);
- (4)模块最佳工作电压为5.0V;
- (5)字符尺寸为2.95×4.35(W×H)mm。
电路原理图:
实物图:
3.4、5V水泵控制电路设计
- 在本系统中,通过三极管驱动水泵,当单片机的控制引脚为高电平时,三极管导通,此时水泵开始工作
电路原理图
实物图
4、程序设计
4.1、独立按键程序
void key() //独立按键程序
{
P3 |= 0xf0;
if((P3 & 0xf0) != 0xf0) //按键按下
{
delay_1ms(1); //按键消抖动
if((P3 & 0xf0) != 0xf0)
{ //确认是按键按下
switch(P3 & 0xf0)
{
case 0xd0: key_can = 3; break; //得到k2键值
case 0xb0: key_can = 2; break; //得到k3键值
case 0x70: key_can = 1; break; //得到k4键值
}
}
}
}
4.2、ad0832读取电压值程序
unsigned char ad0832read(bit SGL,bit ODD)
{
unsigned char i=0,value=0,value1=0;
SCL=0;
DO=1;
CS=0; //开始
SCL=1; //第一个上升沿
SCL=0;
DO=ODD;
SCL=1; //第二个上升沿
SCL=0;
DO=SGL;
for(i=0;i<8;i++)
{
SCL=0; //开始从第四个下降沿接收数据
value<<=1;
SCL=1;
if(DO)
value++;
}
return value;
}
4.3、LCD1602显示数据程序
/***********************************************
函数名称:DispStr
功 能:让液晶从某个位置起连续显示一个字符串
参 数:x--位置的列坐标
y--位置的行坐标
ptr--指向字符串存放位置的指针
返回值 :无
***********************************************/
void DispStr(uchar x,uchar y,uchar *ptr)
{
uchar *temp;
uchar i,n = 0;
temp = ptr;
while(*ptr++ != '\0') n++; //计算字符串有效字符的个数
for (i=0;i<n;i++)
{
Disp1Char(x++,y,temp[i]);
if (x == 0x10)
{
break;
}
}
}
4.4、毫秒延时程序
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}