|
|
#include <reg52.h>
sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit ENA = P3^5; //PWM输出口
sbit LED = P1^7; //led巡航启动led亮
sbit START = P1^2; //启动按键
sbit set = P1^3; //巡航键
sbit add = P1^4; //加速键
sbit subb = P1^5; //减速键
unsigned char speed_level=0;
bit speed_hold_flag = 0; // 速度保持标志:1=保持,0=取消(速度归零)
unsigned int pwm_count = 0;
bit start_flag = 0; // 新增:启动标志:1=已启动,0=未启动
bit auto_speed_up = 0; // 新增:自动增速标志:1=自动加速,0=停止自动加速
unsigned int auto_speed_delay = 0;// 新增:自动加速延时计数器
// 函数声明
void delay_ms(unsigned int ms); // 毫秒延时(消抖用)
void key_scan(void); // 按键扫描函数
void pwm_init(void); // PWM初始化(定时器T1)
void auto_speed_control(void); // 新增:自动增速控制函数
void main(void)
{
// 初始化
IN1 = 1; // 电机正转
IN2 = 0;
pwm_init(); // 初始化PWM
EA = 1; // 开启总中断
LED=0;
while(1)
{
key_scan(); // 循环扫描按键
auto_speed_control(); // 新增:自动增速逻辑
}
}
void pwm_init(void)
{
TMOD |= 0x20; // T1模式2
TH1 = 0x9C; // 初值:11.0592MHz晶振,100us定时
TL1 = 0x9C;
ET1 = 1; // 开启T1中断
TR1 = 1; // 启动T1
}
// 定时器T1中断服务函数:生成PWM
void timer1_isr(void) interrupt 3
{
pwm_count++;
if(pwm_count >= 10) // 周期10*100us=1ms(1000Hz)
{
pwm_count = 0;
}
// 速度控制逻辑:仅保持状态下输出对应占空比,取消则归零
if(start_flag == 1 && speed_hold_flag == 1)
{
// 速度等级n → 占空比n*10%(如等级5→50%)
if(pwm_count < speed_level)
{
ENA = 1; // 高电平有效
}
else
{
ENA = 0;
}
}
else
{
ENA = 0; // 取消保持,电机停转
}
}
// 新增:自动增速控制函数(每100ms速度+1,直到9级)
void auto_speed_control(void)
{
if(start_flag == 1 && auto_speed_up == 0)
{
// 仅启动后、未进入保持状态时,才自动加速
auto_speed_delay++;
// 11.0592MHz晶振,此延时约100ms(可根据需求调整)
if(auto_speed_delay >= 1000)
{
auto_speed_delay = 0;
if(speed_level < 9) // 最高9级
{
speed_level++;
}
}
}
}
// 按键扫描函数(含消抖)
void key_scan(void)
{
// 1. 启动按键:仅未启动时生效
if(start_flag == 0 && START == 0)
{
delay_ms(20); // 消抖延时20ms
if(start_flag == 0 && START == 0)
{
start_flag = 1; // 置启动标志
speed_hold_flag = 0; // 启动后默认未保持(允许自动加速)
auto_speed_up = 1; // 允许自动加速
speed_level = 0; // 启动速度从0开始
while(START == 0); // 等待按键释放
}
}
// 2. 保持/取消保持按键
if(start_flag == 1 && set == 0)
{
delay_ms(20);
if(start_flag == 1 && set == 0)
{
LED=!LED;
speed_hold_flag = !speed_hold_flag; // 切换保持状态
auto_speed_up = 0; // 按下保持键,立即停止自动加速
// 仅取消保持时,速度归零;保持时不修改speed_level(冻结当前值)
if(speed_hold_flag == 0)
{
speed_level = 0;
}
while(set == 0);
}
}
// 3. 加速按键:仅在保持状态下生效
if(start_flag == 1 && speed_hold_flag == 1 && add == 0)
{
delay_ms(20);
if(add == 0)
{
if(speed_level < 9) // 最高9级
{
speed_level++;
}
while(add== 0);
}
}
// 4. 减速按键:仅在保持状态下生效
if(start_flag == 1 && speed_hold_flag == 1 && subb == 0)
{
delay_ms(20);
if(subb == 0)
{
if(speed_level > 0) // 最低0级
{
speed_level--;
}
while(subb == 0);
}
}
}
// 毫秒延时函数(11.0592MHz晶振)
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = ms; i > 0; i--)
{
for(j = 110; j > 0; j--);
}
}
|
-
a.png
(63.99 KB, 下载次数: 0)
-
b.png
(101.83 KB, 下载次数: 0)
-
c.png
(84.44 KB, 下载次数: 0)
-
d.png
(101.63 KB, 下载次数: 0)
|