51单片机红外遥控控制直流电机转速时,由于一档转速太小 转不动 需要用手转一下就可以运行,启动动作应该添加到哪里,请用具体代码表示
时间: 2024-04-18 22:32:27 浏览: 41
51单片机的红外遥控电动机转速控制.doc
对于这个问题,你可以将启动动作添加到红外遥控信号接收的部分。具体来说,在接收到红外遥控信号后,先执行一段时间的启动动作,然后再根据档位控制电机的转速。以下是修改后的示例代码:
```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)
{
// 添加启动动作
M1 = 1;
M2 = 0;
M3 = 0;
M4 = 0;
delay_ms(1000); // 启动动作持续1秒
// 根据红外遥控信号更新档位
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); // 显示当前档位
}
}
```
在这段代码中,我将启动动作添加到了接收到红外遥控信号后的逻辑中。当接收到红外遥控信号后,先设置电机的控制引脚,执行启动动作,持续一秒钟。然后根据红外遥控信号更新档位,并根据档位控制电机的转速。
请根据你的硬件连接情况和具体需求进行适当修改。希望对你有所帮助!
阅读全文