当前位置: 首页 > news >正文

基于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:工作方式1EA=1;		//打开总开关/***定时器0初始化(红外)***/ET0=1;		//打开定时器0中断TH0=0xff;   //时间大约为25uS TL0=0x19;     TR0=1;      //同意开始定时器0PT0=1;		//T0高优先级/*定时器1初始化(产生PWM控制电机转速)*/	ET1=1;		//使能T1中断TH1=0xf8;	//定时2msTL1=0xcc;TR1=0;		//关闭定时器1/****外部中断1初始化******/EX1=1;    	//同意开启外部中断1IT1=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=3000while(i--)			//i为0到3000之间的一段时间{ if(IR1==0)		//判断延时期间是否有红外信号输入{ExeFlag=1;	//将可执行标志位置1}}i=3000;				//i设置3000if(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=1TH1=0xf8;				//定时2msTL1=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加1while(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就将当前位写0RecvData=RecvData << 1; //将当前位向左移动1位}else if(8==AddData)//1      //判断接收到的数据是1{RecvData=RecvData | 1; 	//将当前位写1RecvData=RecvData << 1; //将当前位向左移动1位}CountData++;                //将红外接收位计数器加1if(CountData==8)            //判断是否接收到8位数据{HeardData=RecvData;     //是8位数据时,则将数据暂存到高位变量中}else if(CountData==16)      //判断是否接收到16位数据{ET0=0;                  //关闭红外定时器0EX1=0;                  //关闭红外外部中断1AddData=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原理图、程序(含注释)、元件清单、实物图等。具体内容如下,全网最全! !

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

点赞分享一起学习成长。

相关文章:

  • MySQL基础关键_006_DQL(五)
  • Vue3学习笔记2——路由守卫
  • 如何用CSS实现HTML元素的旋转效果:从基础到高阶应用
  • c++26新功能——gcc15.1的支持
  • Java大师成长计划之第11天:Java Memory Model与Volatile关键字
  • NVMe控制器之完成信息解析模块
  • 单片机嵌入式字符流数据解析库
  • c++ 二级指针 vs 指针引用
  • AI生成视频检测方法及其相关研究
  • 【电路笔记】-自耦变压器
  • java学习之数据结构:三、八大排序
  • 生成式 AI 的重要性
  • 在MySQL中建索引时需要注意哪些事项?
  • 【Linux知识】find命令行使用详解
  • 《ATPL地面培训教材13:飞行原理》——第5章:升力
  • 生物化学笔记:神经生物学概论08 运动系统 人类逐渐建立运动技能 不同层次的运动发起
  • 【AutoDL】云服务器配置指南
  • 架构师-金丝雀与蓝绿发布
  • vue3+ts vite打包结构控制通过rollup进行配置
  • Java学习手册:Spring 生态其他组件介绍
  • 媒体:不能让追求升学率,成为高中不双休的借口
  • 国防部新闻发言人就日本民用飞机侵闯中国钓鱼岛领空答问
  • 浙江医生举报3岁男童疑遭生父虐待,妇联:已跟爷爷奶奶回家
  • 经济日报头版评论:矢志奋斗筑梦青春中国
  • 重庆渝中警方:男子点燃摩托车欲寻衅滋事,被民警和群众合力制服
  • “国宝探索记”增强亲子连接,国宝成了生活想象的一部分