51单片机红外遥控控制直流电机转速时,由于一档转速太小 转不动 需要用手转一下就可以运行,其余档都可以正常运行,应该怎样修改 在一档的时候怎样加一个启动动作 。请用代码表示,红外遥控分别在1/4,1/2,3/4,1速度下直流电机的运行并将当前档位显示在数码管上。
时间: 2024-04-21 13:22:08 浏览: 20
对于这个问题,你可以在代码中添加一个启动动作,以确保在一档时电机能够正常启动。可以使用一个变量来记录当前档位,并在接收到红外遥控信号时更新该变量。以下是一个示例代码,假设使用的是51单片机的C语言编程:
```c
#include <reg51.h> // 引入51单片机头文件
sbit IR = P1^0; // 假设红外遥控输入信号接在P1.0引脚上
sbit M1 = P2^0; // 假设电机控制引脚接在P2.0引脚上
sbit M2 = P2^1; // 假设电机控制引脚接在P2.1引脚上
sbit M3 = P2^2; // 假设电机控制引脚接在P2.2引脚上
sbit M4 = P2^3; // 假设电机控制引脚接在P2.3引脚上
sbit D1 = P3^0; // 假设数码管第一位显示引脚接在P3.0引脚上
sbit D2 = P3^1; // 假设数码管第二位显示引脚接在P3.1引脚上
unsigned char speed = 0; // 当前档位,初值为0
void delay_ms(unsigned int ms) // 延时函数
{
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display(unsigned char num) // 数码管显示函数
{
D1 = num / 10; // 十位数
D2 = num % 10; // 个位数
}
void main()
{
while (1)
{
if (IR == 0) // 接收到红外遥控信号
{
delay_ms(10); // 延时消抖
if (IR == 0)
{
// 根据红外遥控信号更新档位
if (speed == 0) speed = 4;
else speed--;
}
}
switch (speed) // 根据当前档位控制电机转速
{
case 1:
M1 = 1;
M2 = 0;
M3 = 0;
M4 = 0;
break;
case 2:
M1 = 1;
M2 = 1;
M3 = 0;
M4 = 0;
break;
case 3:
M1 = 1;
M2 = 1;
M3 = 1;
M4 = 0;
break;
case 4:
M1 = 1;
M2 = 1;
M3 = 1;
M4 = 1;
break;
default:
M1 = 0;
M2 = 0;
M3 = 0;
M4 = 0;
break;
}
display(speed); // 显示当前档位
}
}
```
以上代码中,通过判断红外遥控信号的输入(假设接在P1.0引脚上),更新当前档位变量speed,并根据档位控制电机的转速。在一档时,电机会先停止一段时间再启动,以确保能够正常运行。
同时,代码中使用了数码管进行当前档位的显示(假设数码管的显示引脚接在P3.0和P3.1引脚上),通过display函数来实现显示功能。
请根据你的硬件连接情况和具体需求进行适当修改。希望对你有所帮助!