Submission: Code and schematic diagram

This commit is contained in:
database-mysql committed 2026-11-14 23:27:21 +08:00
1 parent ad980c25ca
commit 6470b3bea9
2 files changed
+161

No files matched your search

+104
View File
@@ -0,0 +1,104 @@
#include <reg52.h>
// --- 引脚定义 ---
sbit MOS1 = P1^2;
sbit MOS2 = P1^3;
sbit MOS3 = P1^4;
sbit MOS4 = P1^5;
sbit KEY_START = P3^6; // 启动/停止
sbit KEY_ADJ = P3^7; // 参数调节/复位
// --- 全局变量 ---
unsigned int pulse_width = 100; // 脉宽计数值 (单位: 100us)
unsigned int period = 1000; // 周期计数值 (单位: 100us)
unsigned char run_flag = 0; // 运行标志
unsigned char tick_1ms = 0; // 1ms 标志
// --- 定时器0初始化 (1ms @ 12MHz) ---
void Timer0_Init() {
TMOD &= 0xF0;
TMOD |= 0x01; // 模式1,16位定时器
TH0 = 0xFC; // 1ms 初值 (12MHz)
TL0 = 0x18;
ET0 = 1;
EA = 1;
TR0 = 1;
}
// --- 毫秒级延时 (用于消抖) ---
void DelayMs(unsigned int ms) {
unsigned int i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
// --- 定时器0中断服务 ---
void Timer0_ISR() interrupt 1 {
TH0 = 0xFC;
TL0 = 0x18;
tick_1ms = 1;
}
// --- 按键扫描 (带消抖) ---
void Key_Scan() {
static unsigned char key_lock = 0;
if (!key_lock && (KEY_START == 0)) {
DelayMs(10);
if (KEY_START == 0) {
run_flag = !run_flag;
key_lock = 1;
// 停止时立即关闭所有 MOS
if (!run_flag) { P1 &= 0xC3; } // 清零 P1.2~P1.5
}
} else if (KEY_START == 1) {
key_lock = 0;
}
// 简易参数调节:切换预设脉宽/频率 (可扩展)
if (!key_lock && (KEY_ADJ == 0)) {
DelayMs(10);
if (KEY_ADJ == 0) {
// 示例:切换脉宽
pulse_width = (pulse_width == 100) ? 500 : 100;
while(KEY_ADJ == 0); // 等待释放
}
}
}
// --- 产生脉冲 (阻塞式,适用于低频/中频) ---
void Generate_Pulse() {
unsigned int cnt;
// 1. 输出高电平 (开启 MOS)
P1 |= 0x3C; // 置位 P1.2~P1.5 (0x3C = 0011 1100)
// 2. 维持脉宽
for(cnt = 0; cnt < pulse_width; cnt++) {
DelayMs(1); // 简单延时,实际可改用定时器精确控制
}
// 3. 输出低电平 (关闭 MOS)
P1 &= 0xC3; // 清零 P1.2~P1.5
// 4. 维持周期剩余时间
for(cnt = pulse_width; cnt < period; cnt++) {
DelayMs(1);
}
}
// --- 主函数 ---
void main() {
P1 = 0xC3; // 初始化 P1.2~P1.5 为低电平 (确保上电 MOS 关断)
Timer0_Init();
while(1) {
Key_Scan();
if (run_flag) {
Generate_Pulse();
} else {
P1 &= 0xC3; // 确保停止时输出低电平
}
}
}