目录
一、主要功能
基于51单片机,L298N电机驱动连接电机,采用调节PWM占空比来控制电机速度转动。
仿真图:
编辑
二、硬件资源
基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。
1、51单片机
2、L298N驱动电机模块
3、按键模块
三、程序编程
cpp
/*全部代码在页尾资源*/
/**********************************
按下KEY1低速前进,
按下KEY2高速前进,
按下KEY4电机停止。
Motor1-Motor4对应四个电机;
**********************************/
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
sbit KEY3 = P3^6;
sbit Motor1_IN1 = P1^0;
sbit Motor1_IN2 = P1^1;
sbit Motor2_IN1 = P1^2;
sbit Motor2_IN2 = P1^3;
sbit Motor3_IN1 = P1^4;
sbit Motor3_IN2 = P1^5;
sbit Motor4_IN1 = P1^6;
sbit Motor4_IN2 = P1^7;
sbit Motor1_EN = P0^0;
sbit Motor2_EN = P0^1;
sbit Motor3_EN = P0^2;
sbit Motor4_EN = P0^3;
uchar count = 0; //定时中断次数
uchar a = 0;
void Timer0_Init(void) //200微秒@11.0592MHz
{
//AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x48; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 0;
EA = 0;
}
void delay(int i) //延时函数
{
int j,k;
for(j = i;j>0;j--)
for(k = 125;k>0;k--);
}
void Car_Move(uchar speed) //电机转动
{
uchar Car_Speed = speed;
count++;
if(count <= Car_Speed)
{
Motor1_IN1 = 1;
Motor2_IN1 = 1;
Motor3_IN1 = 1;
Motor4_IN1 = 1;
}
else
{
Motor1_IN1 = 0;
Motor2_IN1 = 0;
Motor3_IN1 = 0;
Motor4_IN1 = 0;
}
if(count >= 100)
{
count = 0;
}
}
void Car_StopMove() //电机停止
{
P = 0x00;
Motor1_IN1 = 0;
Motor2_IN1 = 0;
Motor3_IN1 = 0;
Motor4_IN1 = 0;
}
void Timer0_isr(void) interrupt 1
{
TL0 = 0x48; //设置定时初值
TH0 = 0xFF; //设置定时初值
switch(a)
{
case 1:Car_Move(30);break; //电机低速前进
case 2:Car_Move(60);break; //电机高速前进
default:break;
}
}
四、实现现象
具体动态效果看B站演示视频:
基于51单片机的电机转速PWM调节_哔哩哔哩_bilibili
全部资料(源程序、仿真文件、安装包、演示视频):
链接:https://pan.baidu.com/s/1qOAv4OtM_VBKo60N898_PA
提取码:gopk
--来自百度网盘超级会员V4的分享