1. 系统整体方案规划
银行医院柜台叫号排队系统是一个典型的嵌入式应用场景,需要兼顾稳定性、实时性和用户体验。我们选择STM32F103RCT6作为主控芯片,主要基于以下考量:这款Cortex-M3内核的MCU具有72MHz主频、256KB Flash和48KB RAM,完全能够满足排队系统的实时性要求;同时它具备丰富的外设接口(3个USART、2个I2C、51个GPIO等),可以轻松连接各类外设模块。
系统采用模块化设计思路,将复杂功能分解为五个核心模块:
- STM32控制模块:作为系统大脑,负责协调各模块工作
- 取号模块:实现用户自助取号功能
- 叫号操作模块:供柜台工作人员使用
- 语音播报模块:完成叫号信息的语音输出
- 显示模块:实时展示系统状态信息
实际开发中发现,模块间的通信协议定义至关重要。我们采用事件驱动架构,通过状态标志位和消息队列实现模块间解耦,这样既保证了实时性,又便于后期功能扩展。
2. 硬件电路设计详解
2.1 主控电路设计
STM32F103RCT6的最小系统电路包括:
- 8MHz晶振及匹配电容(22pF)
- 复位电路(10kΩ上拉电阻+0.1μF电容)
- 启动模式选择(BOOT0通过10kΩ电阻接地)
- 3.3V稳压电路(LM1117-3.3V)
电源设计特别注意:
- 数字电源与模拟电源分离
- 每个电源引脚就近放置0.1μF去耦电容
- 语音模块单独供电,避免音频干扰
2.2 取号模块电路
采用矩阵键盘设计,包含:
- 2个取号按键(普通/VIP)
- 1个取号成功指示灯
- 硬件防抖电路(0.1μF电容并联10kΩ电阻)
按键检测采用中断方式,响应时间<10ms。号码生成逻辑如下:
c复制if(普通业务按键按下){
current_num = last_normal_num + 1;
sprintf(queue_num, "A%03d", current_num);
last_normal_num = current_num;
}
else if(VIP业务按键按下){
// 类似逻辑,前缀为B
}
2.3 语音播报模块
SYN6288语音芯片关键配置:
- 波特率:9600bps
- 通信协议:UART异步串口
- 音频输出:经LM386放大电路驱动8Ω/1W扬声器
语音指令示例:
c复制void speak(char *text){
uint8_t head[3] = {0xAA, 0xBB, 0xCC};
HAL_UART_Transmit(&huart1, head, 3, 100);
HAL_UART_Transmit(&huart1, (uint8_t*)text, strlen(text), 100);
}
3. 软件系统实现
3.1 系统架构设计
采用分层架构:
- 硬件抽象层(HAL):STM32CubeMX生成
- 驱动层:各外设驱动程序
- 应用层:业务逻辑实现
关键数据结构:
c复制typedef struct {
char number[8]; // 如"A001"
uint8_t type; // 0-普通,1-VIP
time_t create_time;
} QueueItem;
QueueItem queue[100]; // 循环队列实现
uint8_t front = 0, rear = 0;
3.2 叫号管理算法
采用双队列策略:
- 普通业务队列
- VIP业务队列
叫号优先级规则:
- VIP队列优先
- 同类型按FIFO原则
- VIP等待超过15分钟自动升级优先级
实现代码片段:
c复制QueueItem* get_next_number(){
if(!is_vip_queue_empty()){
return &vip_queue[vip_front];
}
else if(!is_normal_queue_empty()){
return &normal_queue[normal_front];
}
return NULL;
}
3.3 显示模块实现
LCD12864显示分区:
- 顶部20%:当前叫号信息
- 中部40%:等待人数统计
- 底部40%:各柜台状态
刷新策略:
- 定时器触发,500ms刷新一次
- 局部刷新优先于全局刷新
- 重要信息闪烁提示(如紧急通知)
4. 系统调试与优化
4.1 硬件调试要点
-
电源测试:
- 空载/满载电压波动<5%
- 纹波<50mV
- 连续工作12小时温升<20℃
-
语音质量测试:
- 信噪比>60dB
- 1米处声压级≥70dB
- 语音清晰度测试(通过率>95%)
4.2 软件调试技巧
-
使用J-Link调试:
- 实时变量监控
- 调用栈分析
- 性能分析(CPU利用率)
-
典型问题解决:
- 队列溢出:增加队列长度检测
- 语音卡顿:优化UART发送缓冲
- 显示残影:调整刷新时序
4.3 系统压力测试
模拟极端场景:
- 连续取号1000次
- 5个柜台同时高频叫号
- 电源快速插拔测试
测试指标:
- 号码连续性
- 响应延迟(<1s)
- 内存泄漏检测
5. 实际应用建议
-
安装注意事项:
- 扬声器朝向客户等待区
- 取号机高度1.2-1.5米
- 避免阳光直射显示屏
-
维护要点:
- 定期清洁取号按键
- 每月检查扬声器状态
- 每季度备份排队记录
-
扩展建议:
- 增加微信取号功能
- 对接医院HIS系统
- 实现数据分析报表
在银行网点实际部署中,我们发现以下优化很有效:
- 不同业务类型使用不同提示音
- 等待人数显示增加预计等待时间
- VIP客户设置专属叫号音效
这个项目最关键的收获是:硬件设计要预留30%的余量,软件架构要足够灵活。我们最初没有考虑VIP优先功能,幸好队列设计采用了模块化方式,后期通过软件升级就实现了需求变更。
