完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1oRQPdWFsOFm-zWr-8DO4Ng?pwd=8888
部分代码展示
#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[]="ONtime 12: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);
}
void keyscn()//按键扫描函数
{
uchar num; //局部变量
if(keysw==1)
{
if(opensw==1)
{
if(open==0) // 手动开窗
{
write_com(0x80);
for(num=0;num<16;num++)//显示提示语
{
write_date(logo5[num]);
delay(2);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)//显示提示语
{
write_date(logo10[num]);
delay(2);
}
closesw=1; // 已打开标记
delay(10);
if(open==0)
{
while(!open);
zhenzhuan=1;// 正转 开启
fanzhuan=0; // 返转关闭
second=0;// 秒清零 步进电机 会停
keysw=0;
menusw=0;
}
}
}
if(closesw==1)//如果窗户是打开的
{
if(close==0)//按下手动开
{
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);
}
delay(10);
if(close==0)
{
while(!close);
zhenzhuan=0; //正转关
fanzhuan=1; // 反转 开启
second=0; // 定时清零
keysw=0; // 标记请零
menusw=0;
}
}
}
}
if(menusw==1)//如果窗户运行完毕
{
if(menu==0)// 如果主功能键按下
{
lofl=1; //字幕载入
delay(10); //延时消抖动
if(menu==0)
{
while(!menu);//松手检测
dsflj=0;// 关主页显示
kval++; // 按键变量++
keysw=0;//不允许手动 开窗 和关窗
}
}
//*************************************************************************8
if(kval==1) // 如果变量==1 进入时间设定
{
if(lofl==1)
{
write_com(0x80);
for(num=0;num<16;num++)
{
write_date(logo12[num]);//显示提示语
delay(2);
}
write_com(0x80+0x40);
for(num=0;num<16;num++) //显示提示语
{
write_date(logo9[num]);
delay(2);
lofl=0;
}
DSdat=hour;
write_com(0x80+8); // 刷新 设定时间
write_sfm();
DSdat=minit;
write_com(0x80+11);// 刷新 设定时间
write_sfm();
DSdat=secon;
write_com(0x80+14); // 刷新 设定时间
write_sfm();
}
}
if(kval==2)//如果变量=2 进入小时设定
{
DSdat=hour; // 刷新显示小时
write_com(0x40+0x40+8);// 显示坐标
write_com(0x0e); // 开关标
if(add==0)// 如果加键按下
{
while(!add); // 松手检测
hour++; //小时++
DSdat=hour; //送显示
write_sfm(); // 拆分
if(hour==24) //
{hour=0;}
}
if( dec==0) // 如果减键按下
{
while(! dec);// 松手检测
hour--; //小时--
DSdat=hour;
write_sfm(); //拆分限位
if(hour==0)//限位
{hour=23;}
}
}
//**************************以下时 分钟设 定 秒钟设定 和上面小时一样
//只是就量不一样 不作注释*******************************************
//********************************************************************
if(kval==3)
{
DSdat=minit;
write_com(0x40+0x40+11);
write_com(0x0e);
if(add==0)
{
while(!add);
minit++;
DSdat=minit;
write_sfm();
if(minit==60)
{minit=0;}
}
if(dec==0)
{
while(! dec);
minit--;
DSdat=minit;
write_sfm();
if(minit==0)
{minit=59;}
}
}
if(kval==4)
{
DSdat=secon;
write_com(0x40+0x40+14);
write_com(0x0e);
if(add==0)
{
while(!add);
secon++;
DSdat=secon;
write_sfm();
if(secon==60)
{secon=0;}
}
if( dec==0)
{
while(! dec);
secon--;
DSdat=secon;
write_sfm();
if(secon==0)
{secon=59;}
}
}
//**************************以下 开窗时 小时 分钟设 定 秒钟设定 和上面小时一样
//只是就量不一样 不作注释*******************************************
//**************
//*************************************设定开时****************************************
if(kval==5)
{
if(lofl==1)
{
write_com(0x80);
for(num=0;num<16;num++)
{
write_date(logo13[num]);
delay(2);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_date(logo9[num]);
delay(2);
}
DSdat=ONhour;
write_com(0x80+8);
write_sfm();
DSdat=ONminit;
write_com(0x80+11);
write_sfm();
DSdat=ONsecon;
write_com(0x80+14);
write_sfm();
lofl=0;
}
}
if(kval==6)
{
write_com(0x80+0x08);
write_com(0x0e);
if(add==0)
{
while(!add);
ONhour++;
DSdat=ONhour;
write_sfm();
if(ONhour==24)
{ONhour=0;}
}
if( dec==0)
{
while(! dec);
ONhour--;
DSdat=ONhour;
write_sfm();
if(ONhour==0)
{ONhour=23;}
}
}
if(kval==7)
{
write_com(0x40+0x40+11);
write_com(0x0e);
if(add==0)
{
while(!add);
ONminit++;
DSdat=ONminit;
write_sfm();
if(ONminit==60)
{ONminit=0;}
}
if( dec==0)
{
while(! dec);
ONminit--;
DSdat=ONminit;
write_sfm();
if(ONminit==0)
{ONminit=59;}
}
}
if(kval==8)
{
write_com(0x40+0x40+14);
write_com(0x0e);
if(add==0)
{
while(!add);
ONsecon++;
DSdat=ONsecon;
write_sfm();
if(ONsecon==60)
{ONsecon=0;}
}
if( dec==0)
{
while(! dec);
ONsecon--;
DSdat=ONsecon;
write_sfm();
if(ONsecon==0)
{ONsecon=59;}
}
}
//**************************以下 关窗时 小时 分钟设 定 秒钟设定 和上面小时一样
//只是就量不一样 不作注释*******************************************
//************