|
|
#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)
下載附件
2026-2-25 21:02 上傳
-
b.png
(101.83 KB, 下載次數: 0)
下載附件
2026-2-25 21:02 上傳
-
c.png
(84.44 KB, 下載次數: 0)
下載附件
2026-2-25 21:02 上傳
-
d.png
(101.63 KB, 下載次數: 0)
下載附件
2026-2-25 21:02 上傳
|