基于单片机的简易模拟风扇控制(C语言)

发布于 2022-04-20  623 次阅读


设计思路:

①:按下按钮1,实现正反转切换。

②:按下按钮2,按下的前三次,实现1/2/3档切换,第四次按下,风扇停止。

仿真元器件清单:

AT89C51

BUTTON

CAP

CRYSTAL

RES

CAP-ELEC

1N4007

TIP31

TIP32

2SC2547

MOTOR-DC


 

实现程序:

//功能:风扇控制程序(实现三档风速、正转/反转)
#include<reg51.h> 
#include <stdio.h> 
sbit DJA=P1^0;   //电机控制A端
sbit DJB=P1^1;   //电机控制B端
sbit K1=P3^2;      //转向按键连接P3.2引脚
sbit K2=P3^3;      //风速按键连接P3.3引脚
bit  flag;	      //转向标志位,flag=0表示正转,flag=1表示反转
unsigned char number;	//按下风速按键的次数,即风速档位

//函数名:delay
//函数功能:实现软件延时
void  delay (unsigned int i)
	{
           unsigned int k;
	   for(k=0;k<i;k++);
	}
	
//函数名:pwm1
//函数功能:输出占空比为30%的脉宽调制信号(正转、弱风)
void pwm1()
{
	DJB=1;
	DJA=0;               //电机转动
        delay(720);          //延时,调整电机转动时长
	DJA=0;              //电机停转
        delay(1680);          //延时,调整电机停转的时长
}

//函数名:pwm2
//函数功能:输出占空比为50%的脉宽调制信号(正转、正常风)
void pwm2()
{
        DJB=1;
        DJA=0;               //电机转动
        delay(1200);         //延时,调整电机转动时长
        DJA=1;               //电机停转
        delay(1200);         //延时,调整电机停转的时长
}

//函数名:pwm3 
//函数功能:输出占空比为70%的脉宽调制信号(正转、强风)
void pwm3()    
{
       DJB=1;
       DJA=0;              
       delay(1680);          
       DJA=1;            
       delay(720);   
}

//函数名:pwm4 
//函数功能:输出占空比为30%的脉宽调制信号(反转、弱风)
void pwm4()
{ 
       DJB=0;
       DJA=1;               //电机转动
       delay(720);          //延时,调整电机转动时长
       DJB=1;              //电机停转
       delay(1680);          //延时,调整电机停转的时长	
}

//函数名:pwm5 
//函数功能:输出占空比为50%的脉宽调制信号(反转、正常风)
void pwm5()
{   
       DJB=0;
       DJA=1;               //电机转动
       delay(1200);          //延时,调整电机转动时长
       DJB=1;              //电机停转
       delay(1200);          //延时,调整电机停转的时长	
}

//函数名:pwm6 
//函数功能:输出占空比为70%的脉宽调制信号(反转、强风)
void pwm6()
{   
       DJB=0;
       DJA=1;              
       delay(1680);          
       DJB=1;            
       delay(720);   
}

void main()                //主函数
{
       flag=0;               //设置正转标志位
       number= 0;          //风速档置0,无风
       DJA=1;              //电机停转
       DJB=1;
       while(1)
       {
	 if(K1==0)                  //第一次检测到转向开关K1按下
         {   
            delay(1200);           //延时10ms左右去抖动
            if(K1==0)               //再次检测到K1按下
	    {
	       while(!K1);       //等待K1键释放      
               flag=~flag;        //改变转向标志位,反转
             }
	  }                 
         if(K2==0)                    //第一次检测到风速开关K2按下
	 {   
	    delay(1200);             //延时10ms左右去抖动
            if(K2==0)                //再次检测到K2按下
            {	 
	       while(!K2);         //等待K2键释放
               if (number<=3)      //判断风速档位是否强风档
               {
                  number++;       //没到强风档位则风速加速 1 2 3
                }                      
               else
               {
                  number=0x01;    //已经是强风档位则风速回到弱风档位
                }                            
             }
          }
	if(!flag)	   //正转
	{
	   switch(number)
	   {
	      case 0x01: pwm1();break;  //风速1档,弱风
	      case 0x02: pwm2();break;  //风速2档,舒适风
	      case 0x03: pwm3();break;  //风速3档,强风
	      default: ; 
	    }
	  }
	else 
	{
           switch(number)
           {
	      case 0x01: pwm4();break;  //风速1档,弱风
	      case 0x02: pwm5();break;  //风速2档,舒适风
	      case 0x03: pwm6();break;  //风速3档,强风
	      default: ;
	    }
         }
      }
}

:上面代码复制,可能会有额外乱码,需要自行审查

实现仿真图:

 

实现效果视频: