毕业设计 - 题目:基于 stm32 的病房呼叫系统


1 简介

Hi,大家好,这里是丹成学长,今天向大家介绍一个学长做的单片机项目

基于 stm32 的病房呼叫系统

大家可用于 课程设计 或 毕业设计

技术解答、毕设帮助、开题指导
print("Q 746876041") 

2 绪论

2.1 课题背景

随着全球老龄化进程的加快,全球生存环境的恶化,以及人类对健康关注的增加,医疗行业正快速膨胀。人们对医疗水平的要求不断提高,特别是突发情况下病人请求值班医生或护士进行及时诊断或护理这一环节,对提高医院的管理服务质量显得尤其重要。因此通过病房呼叫系统完成向医生的求助是一种极为方便有效的手段,相关的应用设计正逐步推出。目前病房呼叫系统主要有两种,一种是有线式,一种是无线式。而在我国,大多数医院都是采用的传统的有线式病房呼叫系统。这种设计很难做到隐蔽和美观,而且安装与维护都不方便,抗电气干扰能力也不强。因此学长采用无线wifi来设计病房呼叫系统。

病房呼叫系统是为了提高医院的服务质量而提出的, 它能使病人及时快捷的进行呼叫, 以方便医院能快速准确的了解病人情况, 并能及时施以救助。 系统是基于无线网络开发的、 以单片机stm32为核心的医院无线病房呼叫系统, 利用无线网传输信号和语音信息, 远程控制部分接收无线网发送来的信号, 由stm32对其进行解码, 解码后由数码管和灯屏显示, 语音信息由话筒传出。

3 系统设计

3.1 系统架构

在这里插入图片描述

病房呼叫系统的开发方案是参照国内外相关技术的发展状况,在前人的基础上稍加修改,并借鉴现在一些科研机构的最新研究成果,同时根据我国医院病房监护建设的实际情况,为满足患者的要求,并充分考虑其经济性和可靠性,能真正实现智能化呼叫的要求来确定的。根据系统拟达到的总体功能,将其划分为以下功能模块:显示电路(LED灯屏、数码管)、语音录放电路(手柄)、键盘电路、报警电路、呼叫分机、无线网卡等。系统组成框图如图2-1所示。本设计采用主机和从机相分离的模式。从机安装于各个病房,主机安装于护士站,多个从机处于等待外部呼叫信号的状态,主机则时刻处于等待接受从机呼叫信号的状态,并且从机和主机之间采用无线数据传输通信。

3.2 主程序设计

病房呼叫系统程序设计使用的是 STM32 本身的固件库。 系统开始运行后, 首先检测电源状态, 对 STM32、 数码管和 LED 灯屏等进行初始化, 一切正常后等待中断的发生, 主控制器开始检测是否有呼叫传入, 当呼叫出传入后, 运行子程序。

3.3 语音模块程序设计

语音模块采用的VS1053b,它是通过一个串行输入总线来接收它的输入比特流,数据流被解码后会通过数字音量控制器送到一个高精度DAC,其中的解码器是通过一个串行控制总线来控制的。它控制整个系统完成语音录入,存储,发送,接受,播放等功能。

在这里插入图片描述

开机的时候先检测字库,然后初始化VS1053,进行RAM测试和正弦测试,之后,检测SD卡根目录是否存在RECORDER文件夹,如果不存在则创建,如果创建失败,则报错。在找到SD卡的RECORDER文件夹后,即设置VS1053进入录音模式,开始录音,如果有TPAD按下,则开始播放录音。

3.4 显示模块程序设计

数码管动态显示程序包括数字的显示、 小数点的显示、 数码管的闪烁和数码管的消隐等。 显示的字符跟数据对应关系如下表所示: 根据人的视觉暂留现象,一个数码管每秒必须点亮 50 次以上, 才能达到稳定显示数据的目的。

在这里插入图片描述

3.5 键盘模块程序设计

键盘模块的程序首先需要进行初始化, 初始化延时函数, 初始化 LED 端口,初始化与按键连接的硬件接口。 然后软件对按键去抖, 写明每个按键的功能。

3.6 无线传输模块程序设计

当数据从 CPU 经过串行端口发送出去时, 字节数据转换为串行的位, 在接收数据时, 串行的位被转换为字节数据。 无线网卡与 stm32 直接就是使用的串口通信。

3.7 部分实现代码

#include "led. h"
#include "delay. h"
#include "key. h"
#include "tpad. h"
#include "sys. h"
#include "lcd. h"
#include "usart. h"
#include "flash. h"
#include "sram. h"
#include "malloc. h"
#include "string. h"
#include "mmc_sd. h"
#include "ff. h"
#include "exfuns. h"
#include "fontupd. h"
#include "text. h"
#include "piclib. h"
#include "string. h"
#include "usmart. h"
#include "fattester. h"
#include "piclib. h"
#include "vs10xx. h"
#include "mp3player. h"
#include "audiosel. h"
#include "recorder. h"
int main(void)
{
    
    
delay_init() ; //延时函数初始化
NVIC_Configuration() ; //设置NVIC中断分组2: 2位抢占优先级, 2位响应优先级
uart_init(9600) ; //串口初始化为9600
LED_Init() ; //LED端口初始化
TPAD_Init() ; //初始化触摸按键
LCD_Init() ; //LCD初始化
KEY_Init() ; //按键初始化
Audiosel_Init() ; //初始化音源选择
usmart_dev. init(72) ; //usmart初始化
mem_init(SRAMIN) ; //初始化内部内存池
VS_Init() ;
录音程序
#include "recorder. h"
#include "delay. h"
#include "usart. h"
#include "key. h"
#include "led. h"
#include "lcd. h"
#include "vs10xx. h"
#include "malloc. h"
#include "ff. h"
#include "exfuns. h"
#include "text. h"
#include "tpad. h"
//VS1053的WAV录音有bug, 这个plugin可以修正这个问题
const u16 wav_plugin[40] =/* Compressed plugin */
{
    
    
0x0007, 0x0001, 0x8010, 0x0006, 0x001c, 0x3e12, 0xb817, 0x3e14, /* 0 */
0xf812, 0x3e01, 0xb811, 0x0007, 0x9717, 0x0020, 0xffd2, 0x0030, /* 8 */
0x11d1, 0x3111, 0x8024, 0x3704, 0xc024, 0x3b81, 0x8024, 0x3101, /* 10 */
0x8024, 0x3b81, 0x8024, 0x3f04, 0xc024, 0x2808, 0x4800, 0x36f1, /* 18 */
0x9811, 0x0007, 0x0001, 0x8028, 0x0006, 0x0002, 0x2a00, 0x040e,
} ;
//激活PCM 录音模式
//agc:0, 自动增益. 1024相当于1倍, 512相当于0. 5倍, 最大值65535=64倍
void recoder_enter_rec_mode(u16 agc)
{
    
    
//如果是IMA ADPCM, 采样率计算公式如下:
//采样率=CLKI/256*d; 
//假设d=0, 并2倍频, 外部晶振为12. 288M. 那么Fc=(2*12288000) /256*6=16Khz
//如果是线性PCM, 采样率直接就写采样值
VS_WR_Cmd(SPI_BASS, 0x0000) ;
VS_WR_Cmd(SPI_AICTRL0, 8000) ; //设置采样率, 设置为8Khz
VS_WR_Cmd(SPI_AICTRL1, agc) ; //设置增益, 0, 自动增益. 1024相当于1倍, 512相当于
0. 5, 最大值65535=64VS_WR_Cmd(SPI_AICTRL2, 0) ; //设置增益最大值, 0, 代表最大值65536=64X
VS_WR_Cmd(SPI_AICTRL3, 6) ; //左通道(MIC单声道输入)
VS_WR_Cmd(SPI_CLOCKF, 0X2000) ; //设置VS10XX的时钟, MULT:2倍频; ADD: 不允; CLK: 12. 288Mhz

VS_WR_Cmd(SPI_MODE, 0x1804) ; //MIC, 录音激活
delay_ms(5) ; //等待至少1. 35ms
VS_Load_Patch((u16*) wav_plugin, 40) ;//VS1053的WAV录音需要patch
}
//初始化WAV头.
void recoder_wav_init(__WaveHeader* wavhead) //初始化WAV头
{
    
    
wavhead->riff. ChunkID=0X46464952; //"RIFF"
wavhead->riff. ChunkSize=0; //还未确定, 最后需要计算
wavhead->riff. Format=0X45564157; //"WAVE"
wavhead->fmt. ChunkID=0X20746D66; //"fmt"
wavhead->fmt. ChunkSize=16; //大小为16个字节
wavhead->fmt. AudioFormat=0X01; //0X01, 表示PCM; 0X01, 表示IMA ADPCM
wavhead->fmt. NumOfChannels=1; //单声道
wavhead->fmt. SampleRate=8000; //8Khz采样率 采样速率
wavhead->fmt. ByteRate=wavhead->fmt. SampleRate*2; //16位, 即2个字节
wavhead->fmt. BlockAlign=2; //块大小, 2个字节为一个块
wavhead->fmt. BitsPerSample=16; //16位PCM
wavhead->data. ChunkID=0X61746164; //"data"
wavhead->data. ChunkSize=0; //数据大小, 还需要计算
}


作品展示,实现效果:

在这里插入图片描述

4 最后

技术解答、毕设帮助、开题指导
print("Q 746876041") 

请添加图片描述

单片机毕设项目大全:
https://blog.csdn.net/huawei123444/article/details/119822845

猜你喜欢

转载自blog.csdn.net/huawei123444/article/details/120624158