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

+57
View File
@@ -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
+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; // 确保停止时输出低电平
}
}
}