找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 45|回复: 0
打印 上一主题 下一主题
收起左侧

单片机控制电机转速,启动键按下时不自动加速怎么回事啊

[复制链接]
跳转到指定楼层
楼主
#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)

a.png

b.png (101.83 KB, 下载次数: 0)

b.png

c.png (84.44 KB, 下载次数: 0)

c.png

d.png (101.63 KB, 下载次数: 0)

d.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表