0 前言
🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 基于单片机的智能窗户系统(源码+硬件+论文)
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
🧿 项目分享:见文末!
1 主要功能
主要功能:一款基于单片机的智能窗户设计,主要可以实现烟雾、光照、温湿度采集。当烟雾超标、温湿度超标时,会自动打开窗户、风扇通风。当光线过暗(晚上)会自动关闭窗户,光线过亮时(白天)会自动打开窗户。还可以进行手动开关窗户。
-
1.使用STC89C52RC单片机做主控制器。
-
2.使用LCD1602显示温湿度、烟雾、光照值。
-
3.使用MQ-2检测烟雾值。
-
4.使用DHT11检测温湿度。
-
5.使用光敏电阻检测光照值。
-
6.使用E18-D80NK检测人体触发情况。
-
7.使用继电器带动风扇通风。
-
8.当在手动打开窗户的时候,人体传感器检测到人时,会自动报警且关窗。
-
9.按键具有手动开关窗、阀值设定灯作用。
2 硬件设计(原理图)
PCB图
仿真效果
3 核心软件设计
控制程序,根据解码得到的结果去执行需要的操作,开窗户、关窗户、停止移动、调节实时时间、调节开窗户时间、调节关窗户时间、时间增加、时间减少、显示电路、实时时间显示。主程序流程如图
关键代码
#include <reg52.h>//库函数
#include <dht11.h> //库函数//#include <adc0832.h> //AD转换库函数
#define uchar unsigned char//宏定意
#define uint unsigned int//宏定意
#define ulong unsigned long//宏定意
bit s=1;
sbit rs=P2^0;//LCD 1602引脚定意
sbit rd=P2^1;//LCD 1602引脚定意
sbit lcden=P2^2;//LCD 1602引脚定意
sbit menu=P2^5; //主功能键
sbit add=P2^4;//加键
sbit dec=P2^3;//减键
sbit open=P2^6;//手动 开
sbit close=P2^7;//手动 关
sbit IR=P3^5; //红外感 应
sbit BEEP=P3^1;// 报警
sbit pf=P3^0;//排风
#define MOTORSTEP P1 //宏定义,定义P1口为步进电机驱动端口
uchar dsflj,kval,lofl,menusw,con,befl,zhenfl,fanfl,brigfl;// 各种变量标记 正返转标记
uint sudu,dwbrigfl,humfl; //电机速度 //光度下限/湿度标记
uchar count0,second,zhenzhuan,fanzhuan,timeflg,opensw,closesw,keysw;//时钟变量 正反转 变量
uint adc0,adc1;
uint upbrig,dwbrig,kwbrig,uphum,uptemp,upsmo; // 下限 亮度 上限湿度// 上限温度
uint hour,minit,secon,DSdat,VAldat ,time;//时钟变量
uint ONhour,ONminit,ONsecon; //开窗时间变量
uint OFhour,OFminit,OFsecon; //关窗时间变量
uchar U8T_data_H,U8RH_data_H;
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
uchar f=0;
uchar Im[4]={0x00,0x00,0x00,0x00}; //遥控码存储空间
uchar show[2]={0,0}; //变量申明
ulong m,Tc; //变量申明
uchar IrOK; //变量申明
void delay(uint z);//开窗时间变量
void write_rvalue(); //显示函数
//以下是各种字幕提示语数组
uchar code logo1[]= "Welcome to use ";
uchar code logo2[]="window system ";
uchar code logo3[]="S=253T=85oCU=85%";
uchar code logo4[]="Br= 12:00:00 ";
uchar code logo5[]="window open ";
uchar code logo6[]="window close ";
uchar code logo7[]="GWbrig= LUX ";
uchar code logo8[]="UP-Hum= % ";
uchar code logo9[]="Please input... ";
uchar code logo10[]="Please wait... ";
uchar code logo11[]="UP-TEM= oC ";
uchar code logo12[]="SEtime 12:00:00";
uchar code logo13[]="ONtime12:00:00";
uchar code logo14[]="OFtime 12:00:00";
uchar code logo15[]="UP-SMO= ";
uchar code logo16[]="KWbrig= LUX ";
void delaymoto() //步进电机每一步间延迟函数
{
uint y=sudu;
while(y--);
}
uchar code FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //步进电机驱动值数组
uchar code REV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //步进电机驱动值数组
xdata num1 [4] = {0x00,0x00,0x00,0x00,};
xdata num2 [4] = {0x00,0x00,0x00,0x00,};
xdata num3 [4] = {0x00,0x00,0x00,0x00,};
xdata num4 [4] = {0x00,0x00,0x00,0x00,}; // AD转换变量组组
xdata num5 [4] = {0x00,0x00,0x00,0x00,}; // AD转换变量组组
void delaylog(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=500;y>0;y--);
}
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
void SETP_MOTOR_FFW() //反转
{
uint i=0;
for(i=0;i<8;i++) //8步一个循环
{
MOTORSTEP=FFW[i]; //取值赋给P1驱动口
delaymoto();
}
}
void SETP_MOTOR_REV() //正转
{
uint i=0;
for(i=0;i<8;i++) //8步一个循环
{
MOTORSTEP=REV[i]; //取值赋给P1驱动口
delaymoto();
}
}
void write_com(uchar com) //LCD 1602写指令
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)//LCD 1602写数据
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init1602()//LCD 1602初始化
{
uchar num;
rd=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<16;num++)
{
write_date(logo1[num]);//开机字幕
delay(2);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_date(logo2[num]);//开机字幕
delay(2);
}
delaylog(200);
write_com(0x80);
for(num=0;num<16;num++)//开机字幕
{
write_date(logo6[num]);
delay(2);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_date(logo10[num]);//开机字幕
delay(2);
}
}
void write_sfm() // 拆分个位十位显示
{
uchar shi ,ge;
shi=DSdat/10;
ge=DSdat%10;
write_date(0x30+shi);
write_date(0x30+ge);
}
4 实现效果
5 最后
包含内容
🧿 项目分享:见文末!
**项目分享: ** https://blog.csdn.net/m0_984093