基于51单片机的PWM控制直流电机设计( proteus仿真+程序+报告+讲解视频)

仿真图proteus 7.8及以上

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:S0031

主要功能:

1.设计要求

采用51单片机作为核心控制器,控制直流电机的正转,反转,制动,停止。

2.功能要求

1)数码管显示当前的转速(单位为转/分(RPM))和当前的PWM占空比0~100%。

2)电机(L298n)转速可以通过按键调整,也可以开始暂停,正转和反转。

3)按键可实现加速、减速、正转、反转、停止等功能。

1键:加速键,短按,占空比加1;

2键:减速键,短按,占空比减1;

3键:正反转切换键,按下后电机正反转;

4键:按一下停止,PWM脉宽清零。

资料下载链接(可点击):

【腾讯文档】S0031 网盘链接

https://docs.qq.com/doc/DS1RGSmxKQUZOa0dT

以下为本设计资料展示图:

仿真

开始仿真后,用数码管第一位显示0表示正转后面三位标志PWM脉宽(0-100), 示波器实时检测显示脉宽黄线是正转脉宽,蓝线是反转脉宽。

img

反转脉宽如下所示

img

程序:

img

部分代码:

#include<reg52.h>    
#include<intrins.h>                        
#define uchar unsigned char	
#define uint unsigned int  
		
/**********************************************************************
							L298n接口定义
**********************************************************************/  
sbit MOTOR_A_1=P3^6;
sbit MOTOR_A_2=P3^7;																   
sbit k1=P1^0;		//定义k1为p1.0口
sbit k2=P1^1;   //定义k2为p1.1口
sbit k3=P1^2;   //定义k3为p1.2口
sbit k4=P1^3;   //定义k4为p1.3口
uchar T=0;	   //定时标记
uchar W=0;	   //脉宽值	 0~100
uchar A=0;	   //方向标记 0,1
uchar k=0;	   //按键标记
uchar i=0;    	 //计数变量

uchar code table1[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

uchar code table2[]={0xfe,0xfb,0xfd,0xf7};
		 
void delayms(uint t);					 			 
/**********************************************************************
						数码管显示
**********************************************************************/ 
void disp(void)
{
	P2=table2[3];					
	P0=table1[W%10];			//显示占空比个位
	delayms(1); 					//延时1ms
	P2=0xff;							//P0清1

	P2=table2[2];
	P0=table1[W/100]; 		//显示占空比百位
	delayms(1); 					//延时1ms
	P2=0xff;							//P0清1
  
	P2=table2[1];
	P0=table1[W/10%10];  //显示占空比十位
	delayms(1); 				 //延时1ms
	P2=0xff;   					 //P0清1

	P2=table2[0];
	P0=table1[A];  			//显示方向
	delayms(1); 				//延时1ms
	P2=0xff;						//P0清1
}

/**********************************************************************
							定时器变量定义
**********************************************************************/ 


void init(void)
{
	//启动中断
	TMOD=0x01;	
	EA=1;						
	ET0=1;
	TR0=1;
	//设置定时时间
	TH0=0xff;
	TL0=0xf6;
}

		
/**********************************************************************
							延时1ms
**********************************************************************/ 
void delayms(uint t)
{
	uchar j;
	while(t--)
	{
		for(j=0;j<250;j++)			//循环250次
		{
		   _nop_();             //系统延时          
	       _nop_();							//系统延时
	       _nop_();							//系统延时
	       _nop_();							//系统延时
		}
	}
}
/**********************************************************************
							独立按键检测
**********************************************************************/ 
void key(void)           //按键判断程序
{
	if(k1==0)							//按键1按下
	{
		while(k1==0);				//按键1抬起
		if(W==100)					//如果脉宽为100
			W=0;							//脉宽置0
		else
			W+=1;							//否则加1
	}
	else if(k2==0)				//按键2按下
	{				 
		while(k2==0);				//按键2抬起
		if(W==0)						//如果脉宽为0
			W=100;						//脉宽设置成100
		else
			W-=1;							//否则减1
	}
	else if(k3==0)				//按键3按下
	{			   
		while(k3==0);				//按键3抬起
		A=!A;								//方向标记取反
		k=!k;								//按键标记取反
	} 
	else if(k4==0)				//按键4按下
	{			   
		while(k4==0);				//按键4抬起
		W=0;								//脉宽清0									
	}
}

void main(void)
{

	init();			/////////系统初始化 
	while(1)	 
	{
	if(k==0)
	    MOTOR_A_2=0;
	else
		MOTOR_A_1=0;	 		
		key();			////////查询按键
	}
}

设计报告

img

资料清单:

img

资料下载链接(可点击):

https://docs.qq.com/doc/DS1RGSmxKQUZOa0dT

更多资源 点击下方链接:

https://docs.qq.com/sheet/DS0xIa0llTmtNakRW

微信公众号:嘉盛单片机

img