基于51单片机小型风扇设计—红外遥控

基于51单片机小型风扇设计

(仿真+程序+原理图)

功能介绍

具体功能:

1.单片机控制直流电机(风扇)转动,风速分为4个等级;

2.数码管会显示风速等级;

3.按键可以调整风速;

4.增加无线红外控制;

​演示视频:

基于51单片机小型风扇设计—红外遥控 

添加图片注释,不超过 140 字(可选)

硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

自锁开关;电解电容10uF;

电阻10K;瓷片电容30P;

晶振11.0592M;电解电容470uF;

瓷片电容104;电阻470(贴片);

LED(红发红);H1838红外接收;

按键;1位共阳数码管;

DIP40;DIP8;L9110;直流电机;

7*9CM 万能板;USB 公对公线;

M2螺丝配螺母;风扇叶;

扎带;铜柱配螺丝;

2P 排针;遥控器;

导线:若干;

程序

/********51单片机小型风扇设计(带遥控)***********
/***微信公众号:木子单片机****
**************风量:1,2,3,4个等级***************/


#include <REGX52.H>  	//头文件
#define uchar unsigned char 
#define uint unsigned int

/********定义IO端口********/
#define Key1 	P3_2	//调速按键(停止,1级风,2级风,3级风,4级风)
#define SMG_XS	P0		//数码管显示
#define IA		P2_5	//直流电机控制端口
#define IB		P2_4	//直流电机控制端口
#define IR1		P3_3	//红外接收端口
#define LED		P1_0	//定义接收指示灯

uchar AddData=0;	//定义自增变量
uchar HeardData=0;  //定义接收到数据的高位变量
bit ExeFlag=0;      //定义可执行位变量
uchar flag=0;		//风量等级标志位(0:停止、1:1级风、2:2级风、3:3级风、4:4级风)

uchar code Data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
		//数码管     0	  1    2	3	 4	  5    6    7    8    9 

void delay_anjian(uint time)	//延时去抖			
{
	uint x,y;
	for(x=time;x>0;x--)
	for(y=110;y>0;y--);		
}

void Init()			//系统初始化
{
/***定时器工作方式**/
	TMOD=0x11;	//T0和T1:工作方式1
	EA=1;		//打开总开关

/***定时器0初始化(红外)***/
	ET0=1;		//打开定时器0中断
 	TH0=0xff;   //时间大约为25uS 
 	TL0=0x19;     
 	TR0=1;      //同意开始定时器0
	PT0=1;		//T0高优先级

/*定时器1初始化(产生PWM控制电机转速)*/	
	ET1=1;		//使能T1中断
	TH1=0xf8;	//定时2ms
	TL1=0xcc;
	TR1=0;		//关闭定时器1

/****外部中断1初始化******/
	EX1=1;    	//同意开启外部中断1
 	IT1=1;     	//设定外部中断1为低边缘触发类型
	PX1=1;		//外部中断1 高优先级
}

void Key_cl()			//按键处理
{
	if(Key1==0)			//调速按键按下
	{
		delay_anjian(5);//延时去抖
		if(Key1==0)		//再判断按键是否按下
		{
			while(Key1==0);	//等待按键松开
			flag++;			//风量等级标志位加1	
			if(flag==5) {flag=0;}//让flag值控制在0到4之间
		}	
	}
}

void Out_cl()		//风量输出处理
{
	switch(flag) 
	{
		case 0: SMG_XS=Data[flag]; IA=0; IB=0; TR1=0; break;	//停止
		case 1: SMG_XS=Data[flag]; TR1=1;		      break;	//1级风
		case 2:	SMG_XS=Data[flag]; TR1=1;			  break;	//2级风
		case 3:	SMG_XS=Data[flag]; TR1=1;			  break;	//3级风
		case 4: SMG_XS=Data[flag]; IA=1; IB=0; TR1=0; break;	//4级风
		default: break;
	}
}

void IR1_cl()	//红外接收处理
{
	static uint i=3000;	//定义变量i=3000
	while(i--)			//i为0到3000之间的一段时间
	{ 
		if(IR1==0)		//判断延时期间是否有红外信号输入
		{
			ExeFlag=1;	//将可执行标志位置1
		}
	}
	i=3000;				//i设置3000
	if(ExeFlag==0)		//判断可执行标志位
	{
		EX1=1;          //开启外部中断1
	}
	ExeFlag=0;          //可执行标志位置0	
}

void main()			//主函数入口
{
	Init();			//系统初始化	
	while(1)		//主循环
	{
		IR1_cl();	//红外接收处理
		Key_cl();	//按键处理
		Out_cl();	//风量输出处理
	}
}

void Time1() interrupt 3	//调速定时器1中断服务函数
{
	static uchar a=1;		//定义变量a=1
	TH1=0xf8;				//定时2ms
	TL1=0xcc;
	switch (flag)
	{
		case 1: if(a==1) {IA=1; IB=0;} 
				else	 {IA=0; IB=0;} break;	//25%转(1级风)
		case 2: if(a<=2) {IA=1; IB=0;}
				else 	 {IA=0; IB=0;} break;	//50%转(2级风)
		case 3: if(a<=3) {IA=1; IB=0;} 
				else     {IA=0; IB=0;} break;	//75%转(3级风)
		default:break;
	}
	a++;  	//a加1
	while(a==5) {a=1;}	//a保持在1到4之间
}

void Timer0_IR1() interrupt 1 	//红外定时器0中断服务函数
{ 
	TH0=0xff;	//时间大约为25uS       
 	TL0=0x19;                         
	AddData++;	//自增变量加1
}

void Int1_IR1() interrupt 2		//红外接收外部中断1服务函数
{
	static uint RecvData=0;		//定义接收红外数据变量
	static uchar CountData=0; 	//定义红外个数计数变量
	LED=1;                      //接收指示灯置1(熄灭)	
 	if(4==AddData)//0         	//判断接收到的数据是0
	{
  		RecvData=RecvData | 0;  //判断到0就将当前位写0
  		RecvData=RecvData << 1; //将当前位向左移动1位
 	}
 	else if(8==AddData)//1      //判断接收到的数据是1
 	{
  		RecvData=RecvData | 1; 	//将当前位写1
  		RecvData=RecvData << 1; //将当前位向左移动1位
 	}
 	CountData++;                //将红外接收位计数器加1
 	if(CountData==8)            //判断是否接收到8位数据
 	{
  		HeardData=RecvData;     //是8位数据时,则将数据暂存到高位变量中
 	}
 	else if(CountData==16)      //判断是否接收到16位数据
 	{
  		ET0=0;                  //关闭红外定时器0
  		EX1=0;                  //关闭红外外部中断1
  		AddData=0;              //定时时间间隔变量清零
  		if(HeardData==226 || HeardData==112)//判断用户码是否正确
  		{ 
			LED=0;             	//用户码正确,接收指示灯置0(点亮)
			HeardData=RecvData; //取出接收到的低八位数据
    		switch(HeardData)  	//判断低八位数据的值下列那一位
    		{
      			case 32: //电源 	//说明按下了电源键
	   			{
					flag=0;			//风量等级标志位为0 (停止)		
	     			break;         	//返回
	   			}
	  			case 0: //1       	//说明按下数字1键
	   			{
					flag=1;			//风量等级标志位为1 (1级风)
	    			break;          //返回
	   			}
	  			case 8: //2         //说明按下了数字2键
	   			{
					flag=2;			//风量等级标志位为2 (2级风)
	    			break;          //返回
	   			}
      			case 4: //3         //说明按下了数字3键
	   			{
					flag=3;			//风量等级标志位为3 (3级风)
	   				break;          //返回
	   			}
	  			case 12: //4        //说明按下了数字4键
	   			{
					flag=4;			//风量等级标志位为4 (4级风)
	    			break;         	//返回
	   			}
     		}
   		}
**//完整资料
***//***微信公众号:木子单片机****
		RecvData=0;		//将接收到的数据清零
   		CountData=0;    //将接收计数器清零
   		HeardData=0;    //将接收高低数据变量清零
   		return;         //返回
  	}
	AddData=0;          //将定时器计数器清零
	ET0=1;              //打开定时器0中断
}

添加图片注释,不超过 140 字(可选)

设计资料

01仿真图

本设计使用Proteus7.8和Proteus8.9两个版本设计!具体如图!

添加图片注释,不超过 140 字(可选)

02原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

03程序

本设计使用Keil5版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

04设计资料

        资料获取请看前面演示视频,全部资料包括仿真源文件 、AD原理图、程序(含注释)、元件清单、实物图等。具体内容如下,全网最全! !

操作演示请观看前面演示视频!

点赞分享一起学习成长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值