1、前言
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉小洪学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,小洪学长分享优质毕业设计项目,今天要分享的是基于51单片机智能浇花语音播报系统
2、简介
基于51单片机智能浇花语音播报系统
1、LCD1602实时监控的温湿度,光照强度,土壤湿度。
2、通过按键设置温湿度,光照强度,土壤湿度
3、当温湿度大于设置的阈值时声光报警
4、当光照大于设置的阈值时声光报警
5、当土壤湿度小于设置的阈值时开启水泵浇水,并语音播报
3、组成
本设计由STC89C52单片机+LCD1602屏幕+DHT11温湿度+土壤湿度模块+光敏模块+水泵模块+语音播报模块+蜂鸣器电路+按键+电源电路
4、实现效果
1602屏幕实时显示
整体展示
5、设计原理
5.1 STC89C52RC简介
STC89C52RC单片机使用范围十分广泛,而且是每个电子设备设计者的首选芯片,此款芯片深得广大用户的喜爱。这款单片机是基于8051单片机进行加强改造的,在对于指令代码的编写时能完全兼容传统8051单片机,所以在程序的编写方面更加便捷。其优点就是有很高的可靠性、价格实惠、功耗比较低,STC89C52RC单片机芯片在技术方面最主要的优点就是采用了Flash存贮器技术,这种技术的使用不仅降低了制造的成本,并且在软件和硬件方面都能与8051单片机完全兼容,还采用了高密度非易失存储制造技术制造,将多功能8位CPU和闪烁存储器组合在单个芯片中,所以可以被中国的大多数用户接受。其程序的电可擦写特性,使得开发与试验更加容易,也为了很多嵌入式控制系统提供了一种灵活性高且价廉的方案选择。
在芯片内部有12时钟/机器周期和6时钟/机器周期,我们可以进行随意的选择。它的工作电压为:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)。其工作频率在0~40MHz之间,和普通的8051单片机相比更加方便,在实际使用中它的工作频率可达48MHz。我们能使用的应用程序空间为8K字节,在片上集成512字节RAM。芯片上有32个通用的I/O口,就是4组分别是P1、P2、P3、P4,每组各有8个I/O口。复位后的4组接口是准双向口/弱上拉,当被作为总线扩展使用时,就不用加上拉电阻,而作为I/O口使用时,就需加上拉电阻。在芯片内部内置的ISP(在系统可编程)和IAP(在应用可编程)技术,让其编程和仿真都变得十分简便,省去使用专用编程器和专用仿真器的麻烦,并且还可以直接通过串口(RxD/P3.0,TxD/P3.1)下载用户程序,下载速度很快,这使得程序的烧写更加容易。还有看门狗的功能。外部中断4路,下降沿中断或低电平触发电路,Power Down模式可由外部中断低电平触发中断方式唤醒。共有3个16位定时器/计数器,即定时器T0、T1、T2。通用异步串行口(UART),还可用定时器软件实现多个UART。
STC89C52RC引脚功能说明:
VCC(40引脚):电源电压
VSS(20引脚):接地
P0端口(P0.0~P0.7,39~32引脚):P0口是一个漏极开路的8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。此时,P0口内部上拉电阻有效。在Flash ROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。验证时,要求外接上拉电阻。
P1端口(P1.0~P1.7,1~8引脚):P1口是一个带内部上拉电阻的8位双向I/O口。P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。
P2端口(P2.0~P2.7,21~28引脚):P2口是一个带内部上拉电阻的8位双向I/O端口。P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。
在访问外部程序存储器和16位地址的外部数据存储器(如执行“MOVX @DPTR”指令)时,P2送出高8位地址。在访问8位地址的外部数据存储器(如执行“MOVX @R1”指令)时,P2口引脚上的内容(就是专用寄存器(SFR)区中的P2寄存器的内容),在整个访问期间不会改变。在对Flash ROM编程和程序校验期间,P2也接收高位地址和一些控制信号。
P3端口(P3.0~P3.7,10~17引脚):P3是一个带内部上拉电阻的8位双向I/O端口。P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。P3做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流。
STC89C52RC单片机的芯片引脚图,如图所示。
图 STC89C52RC单片机引脚图
晶振电路
对于每个单片机系统中都会有晶振电路,晶振在整个单片机系统中起到举足轻重的作用。它结合单片机内部电路,产生时钟频率,有了这个基础单片机才能执行全部的指令,完成所需的功能。同时,时钟频率产生的快慢直接影响单片机运行速度的快慢,时钟频率越高,相对的单片机运行的速度也是越快的。晶振其实就是电能与机械能相互转化的晶体共振技术,为其单片机提供稳定、精确的单频振荡。
晶振电路一般会有两个电容组成,也叫做负载电容。其单片机的工作状态一般会处于并联谐振状态。而其中负载电容的大小会根据晶振的要求来选取确定值。晶振的频率就是在它提供的负载电容下完成的测试,使其减小误差的产生。同时也能保证温漂产生的误差,选取相同的电容值,是为了保证晶振电路的正常运行,如果两个电容的取值不同,甚至相差过大的话,都会容易造成谐振的不平衡,导致停振或干脆振不起来。
在此次的设计中XTAL1和XTAL2端外接石英晶体作为定时元件,在STC89C52RC芯片内部有用于构成振荡器的高增益反向放大器,从而实现自激振荡,产生时钟。晶体振荡器的工作频率一般在1.2~12MHZ之间选择,电容C1、C2一般在10PF~40PF之间取值都是可以的。在这里我选用了12MHZ的工作频率和两个22PF的电容构成晶振电路,STC89C52RC单片机的晶振电路如图3.2所示。
图 晶振电路
复位电路
复位电路也是单片机中重要的一部分,在单片机启动运行时,首先要进行复位操作,而单片机自己又不能独自完成,所以要结合外部电路进行复位操作。如图3.3为复位电路图。RST引脚是复位信号的输入端。当输入连续两个机器周期以上高电平时为有效,当晶振频率为12MHZ时,复位信号持续的时间应超过2us才能完成复位操作。当我们加上复位电路,单片机上电以后,RST引脚会先保持一小段时间的高电平而后变为低电平,这就是单片机复位的过程。
图 复位电路
6、部分核心代码
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include "delay.h"
#include "dht21.h"
#include "bh1750.h"
#include "1602.h"
sbit SCL1=P2^2; //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
sbit DO=P2^3; //DO定义为P1口的第4位脚,连接ADC0832DO脚
sbit CS=P2^0; //CS定义为P1口的第4位脚,连接ADC0832CS脚
uchar shidu; //湿度等级
uchar s_high = 70,s_low = 25; //湿度报警参数
sbit dianji = P2^1; //电机IO定义
sbit beep=P3^3; //蜂鸣器
sbit SET1_key=P3^7; //翻页设置键
sbit SET_key=P3^6; //设置键
sbit ADD_key=P3^5; //加键
sbit DEC_key=P3^4; //减键
char dis0[16]; //打印数组初始化
char dis1[16]; //打印数组初始化
unsigned long time_20ms=0; //定时器计数
unsigned int idata Alarm_TRSD=25; //土壤湿度报警值
unsigned int idata Alarm_temp=32; //温度报警值
unsigned int idata Alarm_mhu=80; //湿度报警值
unsigned int idata Alarm_valLigh=450; //光照报警值
unsigned int idata set_flag=0; //设置标志
bit set1_flag; //翻页设置标志
bit yuyin_flag=0; //翻页设置标志
bit rekey =0;//防止重复按下
bit read_dht21 = 0; //定时读取温湿度
bit disFlag = 0 ;//定时更新显示
uint i;
int dis_data; //变量
float valLigh; //光照值
void main (void)
{
Init_Timer0(); //定时器0初始化
UART_Init(); //初始化串口
DelayMs(20); //延时有助于稳定
Init_BH1750(); //初始化BH1750
Single_Write_BH1750(0x01); // power on
Single_Write_BH1750(0x10); // H- resolution mode
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear();
for(i=0;i<2;i++)
{
yuyin(1);
}
while (1) //主循环
{