-
基于51单片机的医院银行排队叫号系统设计与实现
点击链接下载设计资料:https://download.csdn.net/download/m0_51061483/92081464 -
系统功能简介
医院与银行等场所的业务大厅在高峰时段往往出现排队拥挤、秩序混乱的情况,传统的人工排队方式效率低下,容易出现顾客插队、漏叫等问题。为了提升服务水平,提高业务处理效率与现场秩序,基于51单片机的排队叫号系统应运而生。该系统由主机与从机两部分构成,通过单片机的逻辑处理、按键输入、串口通信、数码管显示以及蜂鸣器提醒等功能模块,实现排队取号、队列统计、按顺序叫号等功能。
主机负责核心叫号与广播功能,工作人员通过按键操作即可实现叫号操作,当前被叫号码通过数码管实时显示,同时蜂鸣器发出提示,使等待中的顾客能够及时响应。系统中的从机负责顾客取号功能,通过串行通信方式从主机获取信号,实时更新取号信息,并在自己的数码管显示模块上显示队列中的剩余排队人数。
整个系统采用主从结构设计,主机和从机之间采用标准串口协议进行数据交互,以保证数据传输准确可靠。该设计不仅结构合理,而且具有高可扩展性,可以根据业务场景进行功能扩充,例如增加语音模块实现语音叫号、增加更多从机实现多个窗口取号等。
-
系统功能详细介绍
3.1 主机叫号功能
主机为工作人员操作端,通过按键实现叫号操作。在工作人员按下"叫号"按键后,主机内部计数器将当前号码递增,并将该号码显示在数码管上,同时驱动蜂鸣器发声,提醒顾客前往相应窗口办理业务。在此过程中,主机通过串口模块将当前叫号信息广播给从机,确保整个系统状态一致。
3.2 从机排队取号功能
排队顾客通过从机进行取号。每当顾客按下取号按键,从机通过串口与主机通讯,获取最新排队号码,并自动为该顾客分配排队号。系统内部保存一个队列计数变量,用于记录当前排队人数,从机会自动将排队人数显示在自己的数码管上,以便顾客判断排队时长与人数情况。
3.3 队列显示功能
从机不仅能够为顾客提供取号服务,还能够实时显示队列中排队人数。该功能依赖从机内部的计数逻辑以及与主机之间的数据同步机制。每当主机叫号,从机会收到相关信息并自动将队列人数减一,从而完成实时同步刷新。
-
电路设计
本系统硬件由主机与从机两大部分组成,两者都基于51单片机实现。为了便于系统运行稳定与扩展,电路采用模块化设计思想。
4.1 单片机最小系统模块
无论是主机还是从机,均使用标准 51 单片机最小系统,包括:
- 复位电路:上电后系统自动复位,确保程序从头正常运行。
- 晶振电路:使用 11.0592 MHz 晶振,以保证串口通信波特率准确。
- 电源电路:为整个系统提供稳定的 5V 电压供应。
单片机的 I/O 引脚用于按键输入、数码管驱动、蜂鸣器驱动以及串口通信等功能。
4.2 按键输入模块
主机端安装叫号按键,从机端安装取号按键。
- 按键采用独立式按键结构,通过上拉电阻连接到单片机 I/O 口。
- 程序通过按键扫描函数检测按键按下,消抖后确认有效动作。
按键是整个系统的人机交互核心,是实现叫号与取号功能的输入信号来源。
4.3 数码管显示模块
主机端使用数码管显示当前叫号号码,从机端使用数码管显示排队队列人数。
- 可采用 4 位或 2 位共阳极或共阴极数码管,根据项目规模而定。
- 显示采用动态扫描方式节省 I/O 资源。
程序通过段码控制与位选控制刷新数码管,实现实时数字显示。
4.4 蜂鸣器提醒模块
主机端配置蜂鸣器,用于叫号提示。
- 常用有源蜂鸣器,驱动方式简单,只需输出高电平即可响。
- 蜂鸣器可通过 NPN 三极管驱动,保护单片机 I/O 口电流安全。
蜂鸣器用于提醒顾客,被叫号码已更新。
4.5 串口通信模块
主机和从机之间通过串口进行通信:
- 主机为发送端:定时发送叫号信息和队列更新信息。
- 从机为接收端:接收数据并更新队列人数及取号逻辑。
串口采用标准 UART 方式:
- 波特率:9600 bps
- 数据位:8 位
- 停止位:1 位
- 无校验
串口模块确保系统多机之间可靠通信。
4.6 队列计数逻辑模块
从机内部包含队列计数模块:
- 顾客取号时队列数 +1
- 主机叫号时队列数 --1
队列计数器通过单片机 RAM 中的变量实现,可用于多场景扩展。
-
程序设计
系统软件采用模块化结构设计,流程清晰,逻辑严谨。以下从主机程序和从机程序分别进行详细说明。
5.1 主机程序整体结构
主机作为叫号控制核心,其主程序结构如下:
cvoid main() { System_Init(); while(1) { Key_Scan(); // 按键扫描 Call_Number(); // 叫号逻辑 UART_SendData(); // 串口广播数据 Display_Update(); // 数码管刷新 } }主机的程序循环结构简单明了,围绕叫号逻辑展开,同时负责显示刷新和通信发送。
5.2 叫号按键扫描模块
主机检测按键输入,当按键按下后对叫号变量进行递增,并同步更新显示内容:
cvoid Key_Scan() { if(Call_Key_Pressed()) { current_num++; call_flag = 1; } }按键扫描程序包含消抖功能,确保按键触发准确。
5.3 叫号执行模块
当叫号按键被按下后:
cvoid Call_Number() { if(call_flag) { Beep_On(); // 蜂鸣器响 DelayMs(200); Beep_Off(); call_flag = 0; } }蜂鸣器提示顾客,提醒新号已被叫出。
5.4 串口数据发送模块
主机通过串口向从机发送当前叫号号码:
cvoid UART_SendData() { UART_SendByte(current_num); }从机通过接收该号码执行队列更新。
5.5 主机数码管显示模块
数码管动态扫描实现显示当前叫号号码:
cvoid Display_Update() { Display_Number(current_num); }
-
从机程序设计
从机作为取号端,需要处理按键、串口接收、显示队列数量等功能。
6.1 从机主程序结构
从机程序结构如下:
cvoid main() { System_Init(); while(1) { UART_Receive(); // 接收主机数据 Key_Get_Number(); // 顾客取号 Queue_Update(); // 队列逻辑处理 Display_Update(); // 显示队列人数 } }从机主要围绕队列人数变化进行管理。
6.2 取号按键处理模块
cvoid Key_Get_Number() { if(Get_Key_Pressed()) { queue_count++; // 队列人数加一 } }顾客按键获得新的排队编号。
6.3 串口接收模块
从机接收主机发送的最新叫号号码:
cvoid UART_Receive() { if(RI == 1) { unsigned char num = SBUF; queue_count--; // 有顾客被叫号,队列人数减少 RI = 0; } }通过该机制同步队列人数。
6.4 队列处理逻辑模块
从机负责确保队列人数不出现负数等异常情况:
cvoid Queue_Update() { if(queue_count < 0) queue_count = 0; }保证数据安全可靠。
6.5 从机显示模块
从机的数码管用于显示当前排队人数:
cvoid Display_Update() { Display_Number(queue_count); }
-
总结
本设计构建了一套基于51单片机的医院银行排队叫号系统,采用主从结构实现叫号、排队、队列显示等核心功能。主机负责叫号广播,从机负责客户取号与队列人数显示,两者通过串口通讯保持数据同步。系统利用按键输入、蜂鸣器提示、数码管显示等模块,实现了良好的人机交互体验。整体结构合理、扩展性强,可广泛应用于医院、银行、政务大厅等公共服务场景,为排队秩序管理提供一种可靠、高效、可扩展的自动化解决方案。