• 方案介绍
  • 相关推荐
申请入驻 产业图谱

基于STM32的病床呼叫系统LCD显示Proteus仿真+程序代码+设计报告+讲解

1小时前
20
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

基于STM32的病床呼叫系统LCD显示仿真设计

本设计包含proteus仿真+程序代码+设计报告+讲解视频

一、开发环境

仿真图:proteus 8.17

程序编译器:keil 5

编程语言:C语言

设计编号:C0141

二、主要功能

设计一个基于STM32的病床呼叫系统,主要功能包括:

(1)从机6床位;

(2)主机LCD显示和应答;

(3)呼叫灯光报警提示,顺序排列处理。

详细功能:

从机和主机是串口通信,波特率9600

(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

相关推荐