基于51单片机智能窗帘系统—温湿度、光照、烟雾、定时、红外报警、手动、遥控 基于51单片机智能窗帘系统程序原理图设计报告功能介绍具体功能1.单片机的智能窗户采用51单片机LCD1602液晶显示红外探头DHT11MQ2步进电机蜂鸣器设计而成2.液晶实时显示目前的状态包括温度、湿度、烟雾浓度、光线强度、时间等信息3.智能窗户可以根据外接光线的强弱来进行自动开关窗户光线强弱的上下限可以按键调节4.不仅具有自动控制功能还可以手动开关窗户5.在开窗前提下如果红外探头检测到人体就会发出报警并且关闭窗户6.可以通过遥控器来进行开关窗户7.可添加一个风扇排风​演示视频基于51单片机智能窗帘系统—温湿度、光照、烟雾、定时、红外报警、手动、遥控程序/***微信公众号木子单片机****/ /*************** writer:shopping.w ******************/ #include reg52.h//库函数 #include dht11.h //库函数//如果 实物 打开 #include adc0832.h //AD转换库函数 #define uchar unsigned char//宏定意 #define uint unsigned int//宏定意 #define ulong unsigned long //宏定意 sbit rsP2^0;//LCD 1602 引脚定意 sbit rdP2^1;//LCD 1602 引脚定意 sbit lcdenP2^2;//LCD 1602 引脚定意 sbit menuP2^5; //主功能键 sbit addP2^4;//加键 sbit decP2^3;// 减键 sbit openP2^6;// 手动 开 sbit closeP2^7;// 手动 关 sbit IRP3^5; //红外感 应 sbit BEEPP3^1;// 报警 #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 f0; 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[]S253T85oCU85%; 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[]ONtime 12:00:00; uchar code logo14[]OFtime 12:00:00; uchar code logo15[]UP-SMO ; uchar code logo16[]KWbrig LUX ; void delaymoto() //步进电机每一步间延迟函数 { uint ysudu; 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(xz;x0;x--) for(y500;y0;y--); } void delay(uint z)//延时函数 { uint x,y; for(xz;x0;x--) for(y10;y0;y--); } void SETP_MOTOR_FFW() //反转 { uint i0; for(i0;i8;i) //8步一个循环 { MOTORSTEPFFW[i]; //取值赋给P1驱动口 delaymoto(); } } void SETP_MOTOR_REV() //正转 { uint i0; for(i0;i8;i) //8步一个循环 { MOTORSTEPREV[i]; //取值赋给P1驱动口 delaymoto(); } } void write_com(uchar com) //LCD 1602 写指令 { rs0; lcden0; P0com; delay(5); lcden1; delay(5); lcden0; } void write_date(uchar date)//LCD 1602 写数据 { rs1; lcden0; P0date; delay(5); lcden1; delay(5); lcden0; } void init1602()//LCD 1602 初始化 { uchar num; rd0; lcden0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(num0;num16;num) { write_date(logo1[num]);//开机字幕 delay(2); } write_com(0x800x40); for(num0;num16;num) { write_date(logo2[num]); //开机字幕 delay(2); } delaylog(200); //*************************************************** write_com(0x80); for(num0;num16;num) //开机字幕 { write_date(logo6[num]); delay(2); } write_com(0x800x40); for(num0;num16;num) { write_date(logo10[num]);//开机字幕 delay(2); } } void write_sfm() // 拆分 个位 十位显示 { uchar shi ,ge; shiDSdat/10; geDSdat%10; write_date(0x30shi); write_date(0x30ge); } 完整资料获取 ***微信公众号木子单片机****/ void keyscn()//按键扫描函数 { uchar num; //局部变量 if(keysw1) { if(opensw1) { if(open0) // 手动开窗 { write_com(0x80); for(num0;num16;num)//显示提示语 { write_date(logo5[num]); delay(2); } write_com(0x800x40); for(num0;num16;num)//显示提示语 { write_date(logo10[num]); delay(2); } closesw1; // 已打开标记 delay(10); if(open0) { while(!open); zhenzhuan1;// 正转 开启 fanzhuan0; // 返转关闭 second0;// 秒清零 步进电机 会停 keysw0; menusw0; } } } if(closesw1)//如果窗户是打开的 { if(close0)//按下手动开 { write_com(0x80); for(num0;num16;num)//显示提示语 { write_date(logo6[num]); delay(2); } write_com(0x800x40); for(num0;num16;num) { write_date(logo10[num]);//显示提示语 delay(2); } delay(10); if(close0) { while(!close); zhenzhuan0; //正转关 fanzhuan1; // 反转 开启 second0; // 定时清零 keysw0; // 标记请零 menusw0; } } } } if(menusw1)//如果窗户运行完毕 { if(menu0)// 如果主功能键按下 { lofl1; //字幕载入 delay(10); //延时消抖动 if(menu0) { while(!menu);//松手检测 dsflj0;// 关主页显示 kval; // 按键变量 keysw0;//不允许手动 开窗 和关窗 } } //*************************************************************************8 if(kval1) // 如果变量1 进入时间设定 { if(lofl1) { write_com(0x80); for(num0;num16;num) { write_date(logo12[num]);//显示提示语 delay(2); } write_com(0x800x40); for(num0;num16;num) //显示提示语 { write_date(logo9[num]); delay(2); lofl0; } DSdathour; write_com(0x808); // 刷新 设定时间 write_sfm(); DSdatminit; write_com(0x8011);// 刷新 设定时间 write_sfm(); DSdatsecon; write_com(0x8014); // 刷新 设定时间 write_sfm(); } } //uint hour,minit,secon; if(kval2)//如果变量2 进入小时设定 {DSdathour; // 刷新显示小时 write_com(0x400x408);// 显示坐标 write_com(0x0e); // 开关标 if(add0)// 如果加键按下 { while(!add); // 松手检测 hour; //小时 DSdathour; //送显示 write_sfm(); // 拆分 if(hour24) // {hour0;} } if( dec0) // 如果减键按下 { while(! dec);// 松手检测 hour--; //小时-- DSdathour; write_sfm(); //拆分限位 if(hour0)//限位 {hour23;} } } //**************************以下时 分钟设 定 秒钟设定 和上面小时一样 //只是就量不一样 不作注释******************************************* //******************************************************************** if(kval3) { DSdatminit; write_com(0x400x4011); write_com(0x0e); if(add0) { while(!add); minit; DSdatminit; write_sfm(); if(minit60) {minit0;} } if( dec0) { while(! dec); minit--; DSdatminit; write_sfm(); if(minit0) {minit59;} } } if(kval4) { DSdatsecon; write_com(0x400x4014); write_com(0x0e); if(add0) { while(!add); secon; DSdatsecon; write_sfm(); if(secon60) {secon0;} } if( dec0) { while(! dec); secon--; DSdatsecon; write_sfm(); if(secon0) {secon59;} } } //uint ONhour,ONminit,ONsecon; //uint OFhour,OFminit,OFsecon; //**************************以下 开窗时 小时 分钟设 定 秒钟设定 和上面小时一样 //只是就量不一样 不作注释******************************************* //************** //*************************************设定开时**************************************** if(kval5) { if(lofl1) { write_com(0x80); for(num0;num16;num) { write_date(logo13[num]); delay(2); } write_com(0x800x40); for(num0;num16;num) { write_date(logo9[num]); delay(2); } DSdatONhour; write_com(0x808); write_sfm(); DSdatONminit; write_com(0x8011); write_sfm(); DSdatONsecon; write_com(0x8014); write_sfm(); lofl0; } } if(kval6) { write_com(0x800x08); write_com(0x0e); if(add0) { while(!add); ONhour; DSdatONhour; write_sfm(); if(ONhour24) {ONhour0;} } if( dec0) { while(! dec); ONhour--; DSdatONhour; write_sfm(); if(ONhour0) {ONhour23;} } } if(kval7) { write_com(0x400x4011); write_com(0x0e); if(add0) { while(!add); ONminit; DSdatONminit; write_sfm(); if(ONminit60) {ONminit0;} } if( dec0) { while(! dec); ONminit--; DSdatONminit; write_sfm(); if(ONminit0) {ONminit59;} } } if(kval8) { write_com(0x400x4014); write_com(0x0e); if(add0) { while(!add); ONsecon; DSdatONsecon; write_sfm(); if(ONsecon60) {ONsecon0;} } if( dec0) { while(! dec); ONsecon--; DSdatONsecon; write_sfm(); if(ONsecon0) {ONsecon59;} } } //**************************以下 关窗时 小时 分钟设 定 秒钟设定 和上面小时一样 //只是就量不一样 不作注释******************************************* //************** //**************************************设定关时间************************************** if(kval9) { if(lofl1) { write_com(0x80); for(num0;num16;num) { write_date(logo14[num]); delay(2); } write_com(0x800x40); for(num0;num16;num) { write_date(logo9[num]); delay(2); lofl0; } DSdatOFhour; write_com(0x808); write_sfm(); DSdatOFminit; write_com(0x8011); write_sfm(); DSdatOFsecon; write_com(0x8014); write_sfm(); } } if(kval10) { write_com(0x800x08); write_com(0x0e); if(add0) { while(!add); OFhour; DSdatOFhour; write_sfm(); if(OFhour24) {OFhour0;} } if( dec0) { while(! dec); OFhour--; DSdatOFhour; write_sfm(); if(OFhour0) {OFhour23;} } } if(kval11) { write_com(0x400x4011); write_com(0x0e); if(add0) { while(!add); OFminit; DSdatOFminit; write_sfm(); if(OFminit60) {OFminit0;} } if( dec0) { while(! dec); OFminit--; DSdatOFminit; write_sfm(); if(OFminit0) {OFminit59;} } } if(kval12) { write_com(0x400x4014); write_com(0x0e); if(add0) { while(!add); OFsecon; DSdatOFsecon; write_sfm(); if(OFsecon60) {OFsecon0;} } if( dec0) { while(! dec); OFsecon--; DSdatOFsecon; write_sfm(); if(OFsecon0) {OFsecon59;} } } //**************************以下 亮度会上设定 和上面小时一样 //只是就量不一样 不作注释******************************************* //************** //********************************设定环境参数************************************ if(kval13) { write_com(0x0c); num4[4]dwbrig; write_rvalue(); if(lofl1) { write_com(0x80); for(num0;num16;num) { write_date(logo7[num]); delay(2); } write_com(0x800x40); for(num0;num16;num) { write_date(logo9[num]); delay(2); lofl0; } } if(add0) { delay(10); if(add0) { while(!add); dwbrig; num4[4]dwbrig; write_rvalue(); if(dwbrig250) {dwbrig0;} } } if(dec0) { delay(10); if(dec0) { while(!dec); dwbrig--; num4[4]dwbrig; write_rvalue(); if(dwbrig0) {dwbrig250;} } } } //********************************************************************* //********************************设定环境参数************************************ if(kval14) { write_com(0x0c); num4[4]kwbrig; write_rvalue(); if(lofl1) { write_com(0x80); for(num0;num16;num) { write_date(logo16[num]); delay(2); } write_com(0x800x40); for(num0;num16;num) { write_date(logo9[num]); delay(2); lofl0; } } if(add0) { delay(10); if(add0) { while(!add); kwbrig; num4[4]kwbrig; write_rvalue(); if(kwbrig250) {kwbrig0;} } } if(dec0) { delay(10); if(dec0) { while(!dec); kwbrig--; num4[4]kwbrig; write_rvalue(); if(kwbrig0) {kwbrig250;} } } } //**************************以下 湿度会上设定 和上面小时一样 //只是就量不一样 不作注释******************************************* //************** if(kval15) { num4[4]uphum; write_rvalue(); if(lofl1) { write_com(0x80); for(num0;num16;num) { write_date(logo8[num]); delay(2); } write_com(0x800x40); for(num0;num16;num) { write_date(logo9[num]); delay(2); lofl0; } } if(add0) { delay(10); if(add0) { while(!add); uphum; num4[4]uphum; write_rvalue(); if(uphum100) {uphum0;} } } if(dec0) { delay(10); if(dec0) { while(!dec); uphum--; num4[4]uphum; write_rvalue(); if(uphum0) {uphum100;} } } } //**************************以下 温度度会上设定 和上面小时一样 //只是就量不一样 不作注释******************************************* //************** if(kval16) { num4[4]uptemp; write_rvalue(); if(lofl1) { write_com(0x80); for(num0;num16;num) { write_date(logo11[num]); delay(2); } write_com(0x800x40); for(num0;num16;num) { write_date(logo9[num]); delay(2); lofl0; } } if(add0) { delay(10); if(add0) { while(!add); uptemp; num4[4]uptemp; write_rvalue(); if(uptemp100) {uptemp0;} } } if(dec0) { delay(10); if(dec0) { while(!dec); uptemp--; num4[4]uptemp; write_rvalue(); if(uptemp0) {uptemp100;} } } } //**************************以下烟雾度会上设定 和上面小时一样 //只是就量不一样 不作注释******************************************* //************** if(kval17) { num4[4]upsmo; write_rvalue(); if(lofl1) { write_com(0x80); for(num0;num16;num) { write_date(logo15[num]); delay(2); } write_com(0x800x40); for(num0;num16;num) { write_date(logo9[num]); delay(2); lofl0; } } if(add0) { delay(10); if(add0) { while(!add); upsmo; num4[4]upsmo; write_rvalue(); if(upsmo100) {upsmo0;} } } if(dec0) { delay(10); if(dec0) { while(!dec); upsmo--; num4[4]upsmo; write_rvalue(); if(uptemp0) {upsmo100;} } } } //*****退出设定********* if(kval18) { write_com(0x0c); kval0; dsflj1; lofl1; keysw1; if(lofl1) { write_com(0x80); for(num0;num16;num) { write_date(logo4[num]);//字幕显示 delay(2); } write_com(0x800x40); for(num0;num16;num)//字幕显示 { write_date(logo3[num]); delay(2); } lofl0; } } } } //步进电机函数 void setmoto() { char num; //zhenfl fanfl if(zhenzhuan1) //正转 { dsflj0; SETP_MOTOR_REV(); if(second10) { zhenzhuan0; P10X00; dsflj1; opensw0; closesw1; keysw1; menusw1; zhenfl1; fanfl0; brigfl0; humfl0; write_com(0x80); for(num0;num16;num) { //字幕显示 write_date(logo4[num]); delay(2); } write_com(0x800x40); //字幕显示 for(num0;num16;num) { write_date(logo3[num]); delay(2); } } } if(fanzhuan1) //反转 { dsflj0; SETP_MOTOR_FFW(); if(second10) { second0; P10X00; zhenfl0; fanfl1; fanzhuan0; dsflj1; dwbrigfl0; brigfl0; opensw1; closesw0; keysw1; menusw1; humfl1; write_com(0x80); for(num0;num16;num) //字幕显示 { write_date(logo4[num]); delay(2); } write_com(0x800x40); for(num0;num16;num) { //字幕显示 write_date(logo3[num]); delay(2); } } } } void TEMPHRDSPLAY() //显示空气温湿度函数 写入1602 { num1[4]U8T_data_H; //温度高8位即是整数部分 num1[1]num1[4]/10; //整数十位 num1[0]num1[4]%10; //整数个位 write_com(0x800x407); //显示温度 write_date(0x30num1[1]); write_date(0x30num1[0]); num2[4]U8RH_data_H; //湿度高8位即是整数部分 num2[3]num2[4]/10; //整数十位 num2[2]num2[4]%10; //整数个位 write_com(0x800x4013); //显示湿度 write_date(0x30num2[3]); write_date(0x30num2[2]); } void SMOGDSPLAY() //显示空气温湿度函数 写入1602 { num3[4]adc0; //温度高8位即是整数部分 num3[0]num3[4]%10; //显示ge位 num3[1]num3[4]%100/10; //显示shi位 num3[2]num3[4]%1000/100;//显示百位 write_com(0x800X402); write_date(0x30num3[2]); write_date(0x30num3[1]); write_date(0x30num3[0]); } void BRDSPLAY() { num5[4]adc1; //温度高8位即是整数部分 num5[0]num5[4]%10; //显示ge位 num5[1]num5[4]%100/10; //显示shi位 num5[2]num5[4]%1000/100;//显示百位 write_com(0x803); write_date(0x30num5[2]); write_date(0x30num5[1]); write_date(0x30num5[0]); } void write_rvalue() { num4[0]num4[4]%10; //显示ge位 num4[1]num4[4]%100/10; //显示shi位 num4[2]num4[4]%1000/100;//显示百位 write_com(0x807); //显示温度 write_date(0x30num4[2]); write_date(0x30num4[1]); write_date(0x30num4[0]); } void init() { TMOD0X11; //定时器设置 TH00X3C; //定时器0置初值 0.05S TL00XBA; EA1; //开总中断 ET01; //定时器0中断开启 TR01; //启动定时0 TL10X3C; //定时初值 TH10XBA; //定时初值 //总中断打开 TR11; //启动定时器 ET11; //软件没用到 RCAP2H (0xFFFF-50000)/256; //赋T2的预置值0x1000溢出30次就是1秒钟 RCAP2L (0xFFFF-50000)%256; TR21; //启动定时器 ET21; IT11; TH00; //定时器0初值 TL00; //定时器0初值 TR01; //定时器0启动 EX11; //外部中断 软件没用到 } void main()//主函数 { init(); init1602(); sudu200; //电要速度 zhenzhuan0;//上电关正转 fanzhuan1;//上电反转打开 dsflj1; // 显示打开 uptemp38; //温度上限 uphum80; //湿度上限 upbrig120; // 光控值 dwbrig10;//光控下限 kwbrig180; upsmo85; opensw1; closesw1; keysw1; menusw1; second0; zhenfl0; fanfl0; brigfl1; dwbrigfl1; humfl0; adc0 ADC0832(1,0); //差分模式CH0-CH1 adc1 ADC0832(1,1); //差分模式CH0-CH1 hour12; minit5; secon10; // 系统时间 这些值可以按键修改 ONhour12; // 自动开窗时间 为了方便演示 设定 一分钟后开 这些值可以按键修改 ONminit6; ONsecon10; OFhour12; // 自动关窗时间 为了方便演示 设定 一分钟后关 这些值可以按键修改 OFminit7; OFsecon10; while(1)//大循环 { keyscn(); setmoto(); if (dsflj1 ) { //get_temp(); //SHT10调用 //cal_wet();//SHT10调用 RH(); //DHT11 调用 // U8T_data_H SENSOR[k].temp;//SHT10调用 // U8RH_data_HSENSOR[k].wet;//SHT10调用 TEMPHRDSPLAY(); adc0 ADC0832(1,0); //差分模式CH0-CH1 SMOGDSPLAY(); adc1 ADC0832(1,1); //差分模式CH0-CH1 BRDSPLAY(); if(fanfl1) { if(adc1 kwbrig )//如果际亮度小与设定值 关窗 { zhenzhuan1; } if(Im[2]0x40) { Im[2]0x00; zhenzhuan1; } second0; if(U8T_data_Huptemp )//如果际温度大与设定值 开窗 { zhenzhuan1; } if(adc0upsmo )//如果际温度大与设定值 开窗 { zhenzhuan1; } } if(zhenfl1) { if(Im[2]0x44) { Im[2]0x00; fanzhuan1; } second0; if(U8RH_data_Huphum )//如果际湿度大与设定值 关窗 { fanzhuan1; brigfl0; dwbrigfl0; } if(adc1dwbrig )//如果际亮度小与设定值 关窗 { fanzhuan1; } if(IR0) { delay(10); if(IR0) { //while(!IR); befl1; ET21; fanzhuan1; con0; } } } if(dec0) { delay(10); if(dec0) { while(!dec); befl0; BEEP1; } } DSdatsecon; write_com(0x8014); write_sfm(); DSdatminit; write_com(0x8011); write_sfm(); DSdathour; write_com(0x800x08); write_sfm(); } } }硬件设计使用元器件单片机STC89C52注意单片机是通用的无论51还是52、无论stc还是at都一样引脚功能都一样。程序也是一样的。晶振12 MHZ电阻1K*4电容10UF *2电容30pf*240脚IC座蜂鸣器LCD160216P排针16P排母按键*6DC 电源插孔红LED 灯DHT11蓝色MQ-2导线若干(或粗线若干)USB电源线9*15万能板ADC0832芯片8脚IC座ULN2003步进电机驱动芯片16脚IC座步进电机10K 排阻光敏电阻遥控接收器遥控器红外感应探头8550三极管*2103可调电阻(1立2卧)共3个10K电阻5P排针*24P排针*2104瓷片电容电阻4.7欧继电器导线若干添加图片注释不超过 140 字可选流程图添加图片注释不超过 140 字可选设计资料01原理图本系统原理图采用Altium Designer19设计具体如图添加图片注释不超过 140 字可选02程序本设计使用软件keil5版本编程设计具体如图添加图片注释不超过 140 字可选03设计报告五千字设计报告具体如下添加图片注释不超过 140 字可选04设计资料资料获取请关注同名公众号全部资料包括程序含注释、AD原理图、设计报告、流程图、结构框图、实物图、元件清单、实物演示视频等。具体内容如下全网最全! 资料获取请观看前面演示视频点赞分享一起学习成长。