点击拨码开关,直流电机反向转动,LED 灯点亮,同时电机运行转动速度 -500±0.5; 再次点击拨码开关,直流电机停止转动,LED 灯熄灭, 同时电机运行转动速度为 0 ; 再次拨动拨码开关,直流电机正向转动,LED 灯点亮, 同时电机运行转动速度+500±0.5 语 (注意:电机转动次数为偶数次是正转,为奇数次时反转);51实现
时间: 2024-01-06 17:05:33 浏览: 143
流水灯8个模式_流水灯反转_流水强开_energyr4l_themzva_直流电机的仿真_
这个功能可以通过以下代码实现:
```
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit motor_dir = P2^2; // 直流电机方向控制引脚
sbit motor_pwm = P2^1; // 直流电机PWM控制引脚
sbit led = P2^0; // LED控制引脚
sbit switch_button = P3^2; // 拨码开关控制引脚
uint motor_speed = 0; // 直流电机转动速度(pwm占空比)
uint motor_count = 0; // 直流电机转动次数
bit motor_running = 0; // 直流电机是否运行
void delay_ms(uint); // 延时函数
void main()
{
motor_dir = 0; // 初始方向为反向
motor_pwm = 0; // 初始PWM占空比为0
led = 0; // LED初始状态为熄灭
while(1)
{
if(switch_button == 0) // 拨码开关被按下
{
delay_ms(20); // 延时去抖动
if(switch_button == 0) // 确认按下
{
if(!motor_running) // 直流电机未运行
{
motor_running = 1; // 置标志位
motor_pwm = 1; // 启动PWM输出
motor_speed = 500; // 初始转速为500
motor_count = 1; // 初始转动次数为1
motor_dir = 1; // 初始方向为正向
led = 1; // 点亮LED灯
}
else // 直流电机已经运行
{
motor_speed += 500; // 转速增加500
motor_count++; // 转动次数加1
if(motor_count % 2 == 0) // 转动次数为偶数
{
motor_dir = 1; // 正向转动
}
else // 转动次数为奇数
{
motor_dir = 0; // 反向转动
}
led = 1; // 点亮LED灯
}
}
while(!switch_button); // 等待按键松开
delay_ms(20); // 延时去抖动
}
else // 拨码开关未被按下
{
if(motor_running) // 直流电机正在运行
{
motor_running = 0; // 清除标志位
motor_pwm = 0; // 停止PWM输出
motor_speed = 0; // 转速设为0
led = 0; // 熄灭LED灯
}
}
}
}
void delay_ms(uint ms) // 延时函数
{
uint i, j;
for(i = 0; i < ms; i++)
{
for(j = 0; j < 110; j++);
}
}
```
注:以上代码仅供参考,具体实现要根据硬件电路和实际需求进行修改。
阅读全文