欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機控制電機轉速,啟動鍵按下時不自動加速怎么回事啊 [打印本頁]

作者: wsgy    時間: 2026-2-25 21:03
標題: 單片機控制電機轉速,啟動鍵按下時不自動加速怎么回事啊
#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

作者: a185980800    時間: 2026-2-26 09:47
看看AI給的提示。1. 核心原因:邏輯矛盾(Bug所在)  在你的 key_scan() 函數中,當按下啟動鍵(START)時,代碼邏輯存在沖突:  自動加速的條件:auto_speed_control() 函數中規定,只有當 start_flag == 1 且 auto_speed_up == 0 時,才會執行自動加速。  啟動鍵的副作用:在 key_scan() 的啟動按鍵處理部分,你雖然注釋寫著“允許自動加速”,但實際代碼卻將 auto_speed_up 設置為了 1。
作者: man1234567    時間: 2026-3-5 15:11
完整修正后的代碼片段
c

// 新增:自動增速控制函數(每100ms速度+1,直到9級)
void auto_speed_control(void)
{
    if(start_flag == 1 && auto_speed_up == 1)  // 修改這里
    {
        auto_speed_delay++;
        // 11.0592MHz晶振,此延時約100ms(可根據需求調整)
        if(auto_speed_delay >= 1000)
        {
            auto_speed_delay = 0;
            if(speed_level < 9)  // 最高9級
            {
                speed_level++;
            }
        }
    }
}
果然AI能給出提示




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1