这个基于STC8H8K64U单片机的工控系统是一个典型的嵌入式控制应用,主要用于自动化产线中的气缸和电机控制。系统通过I/O端口检测各类输入信号,控制气缸的前进/后退动作和电机的正转/反转运行,同时通过OLED显示屏实时显示设备状态。整个系统实现了自动循环控制功能,包含完整的气缸动作序列、电机运行逻辑及状态检测流程,并支持手动操作模式。
系统设计上有几个关键特点值得注意:
本系统选用STC8H8K64U作为主控制器,这是STC最新一代的8051内核单片机,具有以下优势:
提示:STC8H系列单片机内置的EEPROM实际上是利用Flash模拟实现的,擦写寿命约10万次,适合工控场景的参数存储需求。
系统硬件设计上主要包含以下几个关键部分:
电机驱动电路:
气缸控制电路:
人机交互接口:
信号检测电路:
STC8H系列单片机内置的EEPROM具有以下特点:
系统实现了完整的EEPROM读写驱动,包含以下核心功能:
c复制void IapErase(int addr) {
IAP_CONTR = 0x80; // 使能IAP
IAP_TPS = 12; // 设置等待参数(12MHz)
IAP_CMD = 3; // 设置擦除命令
IAP_ADDRL = addr; // 设置低地址
IAP_ADDRH = addr >> 8; // 设置高地址
IAP_TRIG = 0x5a; // 触发命令1
IAP_TRIG = 0xa5; // 触发命令2
_nop_();
IapIdle(); // 关闭IAP功能
}
c复制void IapProgram(int addr, char dat) {
IAP_CONTR = 0x80; // 使能IAP
IAP_TPS = 12; // 设置等待参数
IAP_CMD = 2; // 设置写命令
IAP_ADDRL = addr; // 设置低地址
IAP_ADDRH = addr >> 8; // 设置高地址
IAP_DATA = dat; // 写入数据
IAP_TRIG = 0x5a; // 触发命令1
IAP_TRIG = 0xa5; // 触发命令2
_nop_();
IapIdle(); // 关闭IAP功能
}
c复制char IapRead(int addr) {
char dat;
IAP_CONTR = 0x80; // 使能IAP
IAP_TPS = 12; // 设置等待参数
IAP_CMD = 1; // 设置读命令
IAP_ADDRL = addr; // 设置低地址
IAP_ADDRH = addr >> 8; // 设置高地址
IAP_TRIG = 0x5a; // 触发命令1
IAP_TRIG = 0xa5; // 触发命令2
_nop_();
dat = IAP_DATA; // 读取数据
IapIdle(); // 关闭IAP功能
return dat;
}
系统采用以下数据结构存储运行参数:
| 参数名称 | 地址范围 | 数据类型 | 说明 |
|---|---|---|---|
| 运行时间A | 0x0000-0x0001 | uint16 | 气缸运行时间 |
| 运行时间B | 0x0200-0x0201 | uint16 | 电机运行时间 |
参数读写封装为高层接口:
c复制// 读取EEPROM参数
void red_eeprom(void) {
u16 s1,s2;
s1 = IapRead(IAP_ADDRES_S);
s2 = IapRead(IAP_ADDRES_S+1);
RunTime_A = s1 + (s2 << 8);
s1 = IapRead(IAP_ADDRES_M);
s2 = IapRead(IAP_ADDRES_M+1);
RunTime_B = s1 + (s2 << 8);
}
// 写入EEPROM参数
void write_ee_S(u16 IAPADDRES_S, dat) {
u16 s1,s2;
IapErase(IAPADDRES_S); // 先擦除扇区
s1 = dat;
s2 = dat >> 8;
IapProgram(IAPADDRES_S, s1);
IapProgram(IAPADDRES_S+1, s2);
}
系统主程序采用状态机架构,主要流程如下:
关键代码段:
c复制void main(void) {
bit Run_Flag = 0; // 自动运行标志
IO_int(); // 初始化I/O口
Initial_LY096BG30(); // 初始化OLED
cleardisp(); // 清屏
Diswait(); // 显示待机状态
red_eeprom(); // 读取EEPROM参数
dis_Val1(RunTime_A); // 显示参数A
dis_Val2(RunTime_B); // 显示参数B
while(1) {
// 检测自动启动信号
key_reset();
for(;kcounter<10;) {
if(!INT_1) Key_ValAdd();
else if(~!INT_1) Key_Clear();
if(kstatus>=8) {
dis_Val(1);
Auto_Run();
}
}
// 检测手动操作信号
// ...
}
}
自动运行模式采用严格的顺序控制,确保动作的可靠性和安全性:
关键控制函数:
c复制void Auto_Run() {
DiStart(); // 显示启动
Cylinder_Forword(); // 气缸前进
// ...完整控制流程
do {
// 各步骤控制逻辑
} while(Auto_Flag);
}
手动模式提供以下功能:
手动控制关键代码:
c复制// 气缸前进手动控制
if(!INT_12) {
OUT_1 = 0; // 前气缸进
OUT_3 = 0; // 后气缸进
Cylinder_Forword();
TwoCylinderForword();
}
// 电机正转手动控制
if(!INT_14) {
Motora_In1 = 1;
Motora_In2 = 0;
Motorb_In1 = 1;
Motorb_In2 = 0;
Motor_Forword();
}
在实际调试过程中,我们遇到了以下几个典型问题:
EEPROM数据丢失问题
电机干扰问题
信号抖动问题
根据实际运行经验,建议关注以下参数的优化:
消抖时间参数:
EEPROM擦写策略:
运动控制时序:
为提高工业环境下的可靠性,建议:
基于现有系统,可以考虑以下扩展方向:
通信接口扩展:
高级控制功能:
人机交互增强:
数据记录功能:
这个STC8H8K工控板EEPROM读写系统展示了如何利用单片机内置存储实现可靠的参数保存功能,其设计思路和实现方法可以广泛应用于各种工业控制场景。在实际项目中,建议根据具体需求调整硬件设计和软件架构,特别注意工业环境下的可靠性和稳定性要求。