Submission: Code and schematic diagram
This commit is contained in:
1 parent
ad980c25ca
commit
6470b3bea9
2 files changed
+161
No files matched your search
@@ -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
@@ -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; // 确保停止时输出低电平
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user