381 基于51单片机的智能安防窗帘系统方案设计【毕设课设】

完整版 电路图和程序代码 下载地址

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;}
			}
	
	 	}
	 //**************************以下 关窗时  小时 分钟设 定 秒钟设定 和上面小时一样
	 //只是就量不一样 不作注释*******************************************
	 //************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值