diff --git a/c51/Pin_Definition_Schematic.md b/c51/Pin_Definition_Schematic.md new file mode 100644 index 0000000..37a92e5 --- /dev/null +++ b/c51/Pin_Definition_Schematic.md @@ -0,0 +1,57 @@ + +5V (MCU 电源) + │ + │ +┌─────────┴─────────┐ +│ STC89C52RC │ +│ │ +│ P1.2 ────────┐ │ +│ P1.3 ────────┼───┼─────┐ +│ P1.4 ────────┼───┼───┐ │ +│ P1.5 ────────┘ │ │ │ +│ │ │ │ +│ P3.6 ────┬───┐ │ │ │ +│ P3.7 ────┘ │ │ │ │ +│ │ │ │ │ +│ XTAL1/2 ── 12M │ │ │ +│ RST ────── 复位 │ │ │ +└───────────────────┘ │ │ + │ │ + ┌───────────────┘ │ + │ │ + │ ┌─────────────┘ + │ │ + ▼ ▼ + ┌─────────────┐ + │ 驱动/隔离级 │ (如 TLP250 光耦) + │ │ + │ IN1 ◄──────┼── P1.2 + │ IN2 ◄──────┼── P1.3 + │ IN3 ◄──────┼── P1.4 + │ IN4 ◄──────┼── P1.5 + │ │ + │ VCC(12V) │ + │ GND(隔离) │ + │ OUT1 ──────┼──────┐ + │ OUT2 ──────┼────┐ │ + │ OUT3 ──────┼──┐ │ │ + │ OUT4 ──────┼┐ │ │ │ + └─────────────┘│ │ │ │ + │ │ │ │ + ▼ ▼ ▼ ▼ + ┌─────────┐ + │ MOS 管 │ (N沟道,高压侧) + │ Q1~Q4 │ + │ │ + │ G 极 │ + │ D 极 ───┼──────┬── 高压输出 (至负载/变压器) + │ S 极 ───┼──┐ │ + └─────────┘ │ │ + │ │ + GND │ + (高压)│ + │ + ┌─┴─┐ + │ R │ (负载/储能电容) + └─┬─┘ + │ + GND \ No newline at end of file diff --git a/c51/main.c b/c51/main.c new file mode 100644 index 0000000..6019bd8 --- /dev/null +++ b/c51/main.c @@ -0,0 +1,104 @@ +#include + +// --- 引脚定义 --- +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; // 确保停止时输出低电平 + } + } +}