基于STM32的病床呼叫系统LCD显示仿真设计
本设计包含proteus仿真+程序代码+设计报告+讲解视频
一、开发环境
仿真图:proteus 8.17
程序编译器:keil 5
编程语言:C语言
设计编号:C0141
二、主要功能
设计一个基于STM32的病床呼叫系统,主要功能包括:
(1)从机6床位;
(2)主机LCD显示和应答;
(3)呼叫灯光报警提示,顺序排列处理。
详细功能:
(1)从机代码在slave代码目录
① 从机有6床位,病床1-3是重症病床,病床4-6普通病床
② 按一下发起呼叫,再按一下表示取消呼叫或者护士已到床处理。
(2)主机LCD显示和应答
① 第一行显示室内温度;
② 第二行显示当前待处理病床 ,按下处理按键后如果没有待处理病床则不处理,如果队列有则显示待处理的病床。
(3)呼叫灯光报警提示
① 顺序排列处理(重症优先处理,可以插队排在普通病床前,比如有4先按下还没处理,1号重症床按下先处理1号床,4号床排队);
② 重症呼叫蜂鸣器长鸣,普通呼叫嘟嘟嘟间歇响,对应指示灯点亮。
资料下载链接:
C0141 STM32病床呼叫系统LCD显示
链接: https://pan.baidu.com/s/1u5oDyE3w0YUV-Ilcydb1lg?pwd=v9pc
提取码: v9pc
以下为本设计资料展示:
三、仿真设计
打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。
四、程序代码
程序是用keil5 mdk版本打开的,如果打开有问题,核实下keil的版本。程序有注释可以结合讲解视频理解。
主机 main.c 关键代码:
int main(void){ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* GPIO初始化(PA0-8 LCD+蜂鸣器, PB3-7 LCD+LED, PA11 DS18B20, PA15 按键) */ MX_USART1_UART_Init(); /* USART1: 9600bps, PA9/PA10 */ MX_TIM2_Init(); /* TIM2: 1ms定时中断 */ /* USER CODE BEGIN 2 */ char lcd_line1[17]; /* LCD第一行缓冲区: 温度 */ char lcd_line2[17]; /* LCD第二行缓冲区: 待处理病床 */ float temp = 25.0, temp0; /* 当前温度和临时读数 */ uint32_t last_temp_read = 0; /* 上次温度读取时刻(ms) */ LCD_Init(); /* LCD1602初始化 */ HAL_TIM_Base_Start_IT(&htim2); /* 启动1ms定时器中断 */ /* 初始状态: 蜂鸣器关, LED灭 */ BEEP = BEEP_OFF; LED1 = LED_OFF; LED2 = LED_OFF; /* 队列初始化为空 */ queue_count = 0; queue_front = 0; DS18B20_Get_Temp(); /* 首次温度转换(丢弃上电默认值) */ HAL_UART_Receive_IT(&huart1, &rx_byte, 1); /* 启动UART单字节接收中断 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ /* ---------- 温度读取: 每200ms更新一次 ---------- */ if (HAL_GetTick() - last_temp_read >= 200) { last_temp_read = HAL_GetTick(); temp0 = DS18B20_Get_Temp(); /* 过滤异常值: >128无效, <=0无效(-0.0为传感器读取出错), 85.0为上电默认值 */ if (temp0 < 128.0 && temp0 > 0.0 && temp0 != 85.0) temp = temp0; } /* ---------- LCD第一行: 温度显示 ---------- */ sprintf(lcd_line1, "Temp:%0.1fC ", temp); LCD_ShowString(0, 0, lcd_line1); /* ---------- LCD第二行: 待处理病床显示 ---------- */ if (queue_count > 0) { uint8_t next_bed = call_queue[queue_front]; if (next_bed <= 3) sprintf(lcd_line2, "Bed:%d ICU ", next_bed); /* 重症 */ else sprintf(lcd_line2, "Bed:%d NORMAL ", next_bed); /* 普通 */ } else { sprintf(lcd_line2, "No Call "); /* 无呼叫 */ } LCD_ShowString(1, 0, lcd_line2); /* ---------- LED指示灯: 重症->LED1(PB6), 普通->LED2(PB7) ---------- */ { uint8_t i, has_crit = 0, has_norm = 0; for (i = 0; i < queue_count; i++) { uint8_t idx = (queue_front + i) % QUEUE_SIZE; if (call_queue[idx] <= 3) has_crit = 1; /* 有重症 */ else has_norm = 1; /* 有普通 */ } LED1 = has_crit ? LED_ON : LED_OFF; /* 重症亮LED1 */ LED2 = has_norm ? LED_ON : LED_OFF; /* 普通亮LED2 */ } /* ---------- 蜂鸣器: 重症长鸣, 普通间歇(在TIM2中断中实现), 无呼叫关 ---------- */ if (has_critical) { BEEP = BEEP_ON; /* 有重症: 持续响 */ } else if (queue_count == 0) { BEEP = BEEP_OFF; /* 无呼叫: 关闭 */ } /* 仅有普通呼叫时, 蜂鸣器在TIM2中断中做间歇控制(500ms响/500ms停) */ /* ---------- 护士按键处理(PA15中断置位) ---------- */ if (nurse_btn_flag) { nurse_btn_flag = 0; nurse_process(); /* 处理队首病床, 发送完成消息 */ } HAL_Delay(50); /* 主循环周期约50ms */ } /* USER CODE END 3 */}
从机 main.c 关键代码:
int main(void){ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* GPIO初始化(PA0-PA5上拉输入) */ MX_USART1_UART_Init(); /* USART1: 9600bps, PA9/PA10 */ MX_TIM2_Init(); /* TIM2: 1ms定时中断 */ /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim2); /* 启动1ms定时器 */ HAL_UART_Receive_IT(&huart1, &rx_byte, 1); /* 启动UART单字节接收中断 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ /* 主循环空闲, 所有逻辑在中断中处理: - TIM2中断: 1ms定时 -> 20ms按键扫描 - UART中断: 接收护士处理完成消息 */ } /* USER CODE END 3 */}
程序流程图:
五、设计说明书
11013字,内容包括硬件设计、软件设计、结论等。
摘要:
本设计报告阐述了一种基于STM32F103C6微控制器的病床呼叫系统。该系统采用主从双MCU架构,通过USART串行通信实现病床端与护士站之间的实时信息交互。从机端配置6个病床呼叫按键,支持重症病床(1-3床)和普通病床(4-6床)的分类管理;主机端配备LCD1602液晶显示屏、DS18B20温度传感器、蜂鸣器及LED指示灯,实现呼叫信息的可视化展示、优先级队列调度与声光报警功能。系统采用优先级队列调度算法,确保重症病床呼叫可优先插队处理,同时通过独立的状态机驱动UART通信协议和按键消抖机制保证系统的实时性和可靠性。本系统适用于医院病房环境,可有效提升护理响应效率。
关键词:STM32F103C6;病床呼叫;优先级队列;UART通信;LCD1602;DS18B20
六、资料清单&下载链接
资料下载链接:
链接: https://pan.baidu.com/s/1u5oDyE3w0YUV-Ilcydb1lg?pwd=v9pc
提取码: v9pc
20