【35】单片机编程核心技巧:Switch在工业控制中的应用

【35】单片机编程核心技巧:Switch在工业控制中的应用

七律 · 转型

架构更迭展新篇,STC8H显锋芒。
IO重配如流水,定时重构若行云。
代码迁移承旧智,功能延续启新程。
工业控制真王者,一脉相承见匠心。


摘要

本文以STC8H8K64U4单片机为平台,系统阐述Switch语句在工业自动化运动控制中的移植与实现方法。通过端口配置、定时器中断优化及状态机设计,重点解析GPIO模式设置、中断机制适配及多状态程序框架的重构,为开发者提供从基础到实践的完整解决方案,确保功能延续性与硬件适配性。


1. 硬件配置与移植分析

1.1 STC8H8K64U4特性

- **内核**:8051兼容,支持48MHz主频  
  • IO资源:32个可编程IO,支持PWM/ADC
  • GPIO模式控制:通过PxM0PxM1寄存器设置模式(推挽/开漏/输入等)
  • 定时器:3个16位定时器,支持自动重装

2. GPIO模式配置规范

2.1 模式寄存器说明

STC8系列通过PxM0PxM1寄存器控制每个引脚的模式:

模式值 PxM0位 PxM1位 功能描述
0 0 0 准双向输入输出
1 0 1 推挽输出
2 1 0 高阻输入
3 1 1 开漏输出

2.2 端口配置代码修正

2.2.1 输出模式配置(推挽输出)
// 设置P2.0和P2.1为推挽输出(模式1)  
P2M0 &= ~0x03; // 清除P2M0的低两位(00)  
P2M1 |= 0x03;  // 设置P2M1的低两位为1(01)  
2.2.2 输入模式配置(高阻抗输入)
// 设置P3.2-P3.5为高阻抗输入(模式2)  
P3M0 |= 0x3C; // 设置P3M0的第2-5位为1(10)  
P3M1 &= ~0x3C; // 清除P3M1的第2-5位  
2.2.3 上拉电阻启用
// 为P3.2-P3.5启用上拉(模式3)  
P3M0 |= 0x3C; // 设置P3M0的第2-5位为1(11)  
P3M1 |= 0x3C; // 设置P3M1的第2-5位为1  

2.3 完整IO初始化代码

#include "STC8.H"  

// 定义常量与IO  
#define const_delay_1s 1000 // 1秒延时基准值  
#define cnt_delay_cnt1 25   // 按键去抖计数器  

// IO引脚定义  
sbit left_right_dr = P2^0;  // 右侧电机方向  
sbit up_down_dr = P2^1;     // 上下电机方向  
sbit beep_dr = P1^0;        // 蜂鸣器  
sbit key_sr1 = P3^5;        // 启动按键  

sbit left_sr = P3^4;        // 左侧传感器  
sbit right_sr = P3^3;       // 右侧传感器  
sbit down_sr = P3^2;        // 下侧传感器  

// 状态变量与标志位  
unsigned char run_step = 0; // 运动状态变量  
unsigned char key_lock1 = 0; // 按键锁存标志  
unsigned int delay_cnt1 = 0; // 按键去抖计数器  
unsigned int voice_time_cnt = 0; // 蜂鸣器计时  
unsigned char key_sec = 0; // 按键编号  

// 函数声明  
void init_io();  
void init_timer();  
void run();  
void key_scan();  
void key_service();  

void main() {  
    init_io(); // 初始化IO  
    init_timer(); // 初始化定时器  

    while(1) {  
        key_service(); // 按键服务  
    }  
}  

// 初始化IO配置  
void init_io() {  
    // P2.0-P2.1设置为推挽输出(电机驱动)  
    P2M0 &= ~0x03; // 模式0位清零  
    P2M1 |= 0x03;  // 模式1位置1(模式1)  

    // P1.0设置为推挽输出(蜂鸣器)  
    P1M0 &= ~0x01;  
    P1M1 |= 0x01;  

    // P3.2-P3.5设置为高阻抗输入(传感器与按键)  
    P3M0 |= 0x3C; // 模式2(10)  
    P3M1 &= ~0x3C;  

    // 启用P3.2-P3.5的上拉电阻(模式3)  
    P3M0 |= 0x3C;  
    P3M1 |= 0x3C;  
}  

3. 定时器与中断配置

3.1 定时器初始化

void init_timer() {  
    TMOD |= 0x10; // 定时器1设为模式1(16位自动重装)  
    TH1 = 0xFC;   // 初值设为65536-1000Hz  
    TL1 = 0x18;  
    ET1 = 1;      // 使能定时器1中断  
    EA = 1;       // 全局中断使能  
    TR1 = 1;      // 启动定时器  
}  

// 定时器1中断服务程序  
void timer1() interrupt 3 {  
    TH1 = 0xFC; // 重装初值  
    TL1 = 0x18;  

    key_scan(); // 扫描按键状态  
    run();      // 运行状态机  

    // 控制蜂鸣器  
    if (voice_time_cnt > 0) {  
        beep_dr = 1;  
        voice_time_cnt--;  
    } else {  
        beep_dr = 0;  
    }  
}  

4. 运动控制核心代码

4.1 状态机设计

void run() {  
    switch(run_step) {  
        case 0: // 初始化  
            left_right_dr = 0; // 初始方向  
            up_down_dr = 0;  
            run_step = 1; // 进入运动状态1  
            break;  

        case 1: // 右移启动  
            left_right_dr = 1; // 右侧电机正转  
            run_step = 2;      // 进入传感器检测  
            break;  

        case 2: // 检测右侧传感器  
            if (!right_sr) { // 传感器触发  
                run_step = 3; // 进入下一步  
            }  
            break;  

        // 其他状态(如上下移动、延时返回等)...  
    }  
}  

5. 按键与蜂鸣器控制

5.1 按键去抖与触发

void key_scan() {  
    if (key_sr1) { // 未按下  
        key_lock1 = 0; // 释放标志  
    } else if (!key_lock1) { // 按下且未触发  
        delay_cnt1++;  
        if (delay_cnt1 > cnt_delay_cnt1) { // 延时去抖后触发  
            key_lock1 = 1;  
            key_sec = 1; // 记录按键编号  
        }  
    }  
}  

// 按键服务函数  
void key_service() {  
    if (key_sec == 1) { // 按键1触发启动  
        if (run_step == 0) { // 当前为初始状态  
            run_step = 1; // 进入运动状态  
            voice_time_cnt = 60; // 触发蜂鸣器提示  
        }  
        key_sec = 0; // 重置按键标志  
    }  
}  

6. 验证与调试建议

6.1 端口模式验证

功能模块 验证方法
电机驱动 用万用表测量P2.0/1电压,确认推挽输出(低0V,高VCC)
传感器输入 用示波器观察P3.2-4电平,确认高阻抗输入(上拉后为高电平)

6.2 中断稳定性测试

  • 定时器中断频率:使用逻辑分析仪验证定时器1中断周期为1ms
  • 蜂鸣器提示音:通过蜂鸣器输出波形验证60次中断(6秒)

7. 结论

通过STC8H8K64U4的GPIO模式寄存器PxM0PxM1的精准配置,成功实现了从PIC16F73到STC8H的代码迁移。本文通过清晰的代码注释、移植差异分析及调试建议,为开发者提供了完整的工业控制解决方案,确保功能延续性与硬件适配性。

你可能感兴趣的:(【编程技巧】,单片机,嵌入式硬件,#STM32,嵌入式,#STC8)