一种基于嵌入式的心率测试仪的设计与实现
一种基于嵌入式的心率测试仪的设计与实现
作者:郑海鹏 王立友 冯川放
来源:《赤峰学院学报·自然科学版》2019年第03
        摘要:随着人们物质生活质量的不断提高,越来越多的人开始关注自身身心健康状况,在锻炼身体的过程中,希望可以借助一些便携式医学仪器来检测自身的身体状况,例如使用心率测试仪来测量心率,通过心律的测试,来确定适合于自己的运动强度,防止运动量不达标或运动过量,无论您是运动达人还是视运动为娱乐的人,心率测试仪都是一款必备的运动工具.它能让你能更好地掌握运动过程中运动强度.本文作者将利用单片机与红外传感器和精确定时/计数等技术融合嵌入式开发语言(C语言)为您设计一款能显示每分钟心跳次数的心率测试仪.
        关键词:嵌入式系统开发;IAP15F2K61S2微控制器;红外线传感器St188C语言
        中图分类号:TH72 文献标识码:A 文章编号:1673-260X201903-0068-03
        1 绪论
        随着现代医学技术的不断发展和进步,人们工作之余开始注重自身身心健康,许多便携式
医学仪器得到了广泛的应用,越来越多的人体医学信号测试仪被受众人使用,通过医学仪器对人体体内相关的生理信号的监测,来识别人体的生命健康状态和特征.
        该系统基于STCIAP15F2K61S2微控制器,外围由运算放大器,滤波电路、整形电路以及LCD12864液晶屏,反射红外传感器ST188等组成.电路设计部分主要采取仿真电路的设计形式,使用Keil C软件将对应C语言程序生成HEX文件,并使用stc-isp编程烧录软件将对应的HEX控制程序嵌入在IAP15F2K61S2微控制器系统中,以便于实现人体的心率测试.使用时,手指需要压迫在ST188红外传感器上,使其感知人体的生理信号.可以通过IAP15F2K61S2微控制器对改变的信号进行滤波,放大等处理来统计心跳次数,以便于计算一分钟内的心跳次数即心率.
        2 心率测试仪的仿真电路设计
        本系统设计使用STC公司的IAP15F2K61S2单片机作为核心部件,在Keil C调试环境下,完成软件调试与设计.使用Proteus仿真软件完成仿真电路的设计.电路仿真系统主要有:检测电路、放大滤波电路、单稳态电路和显示电路组成[1].其中系统检测部分主要由反射红外传感器ST188完成.电路设计如图1所示:
        2.1 检测电路
        2.1.1 使用数字万用表测量二极管
        首先,使用数字万用表的二极管齿轮测试控制端子发射(浅蓝)正极和负极,并将红和黑测试引线连接到发射管的两个引脚.对于每次测量,仪表一次显示“1.0 V”,一旦显示溢出“1”,表明1.0 V是正确的.红笔连接到正极,黑笔连接到负极.如果“1”显示两次,则表示发射管内部打开,如果显示两次均为“0”则表示发射管中短路.然后判断接收管的ce极,数字万用表的2M齿轮以及红和黑测试引线的短路.判断接收管的ce极,数字万用表电阻2M档,红和黑电表笔连接到e极;如果标题显示“1”,则黑笔连接到c极,红笔连接到e.
        2.1.2 检测电路工作原理
        首先,我们了解一下人体心跳的过程,心脏在机械收缩之前,先发生电激动而产生微小电流,这一电流可以经人体组织传到体表,窦房结产生的动作电位,经结内的过渡细胞传至心房内的结间束、房间束和心房肌[2].这时心房肌会跳动.然后动作电位下传至房室结(心房
心室交界区)短暂的时间差之后下传至结希区、房室束.心室肌接收兴奋,产生搏动,也就是人体的心跳.
        由于血容量本身是跟随心脏的跳动而显示其心率波形的变化的,而光电信号对于人体的其余组织的感应是不随时间的变化而变化的,所以反射式红外线传感器ST188接收到的波形信号可以用来表示心率的变化特征.
        心率本身的波动信号隶属于低频率的电信号,频率在0.510Hz之间[3],使用放大器、滤波器以便于提取有效信号,避免外围信号的干扰,提高低频率信号的上下限.反射红外传感器ST188通过电容耦合器将血液中的波分量分析到放大器的输入端.
        2.2 放大、整形、滤波电路
        该电路的主要功能是放大整形和滤波传感器检测到的微弱的信号,并且由光电耦合器检测血液浓度自身发生的变化,把微弱信号变化为电信号.经整形电路整形(优化液晶屏心率的显示效果),形成所需脉冲,经LM358芯片对信号进行放大,驱动发光管按照脉搏频率工作,以模拟心脏跳动的动作.最后输出反映心跳频率的电压.
        2.3 比较电路与单态稳电路
        比较电路使用LM358芯片,放大电路的输出信号通过比较输出方波.
        在单稳态电路中,比较器输出的矩形波输入到74HC123触发器的B引脚,因此不同频率(不同心率)的输入信号输出具有不同占空比的方波.通過滤波电路进行滤波后,输出电压不同.
        3 心率测试仪系统硬件组成
        3.1 红外反射式传感器ST188
        3.1.1 ST188红外反射式传感器简介
        由一个光敏三极管和一个发光二极管组成,其中发光二极管作为传感器的反射模块,光敏三极管作为传感器的接收模块[4](二者在电路中均正接,但需要串联相关阻值的定值电阻),ST188系列传感器有诸多优点:比如体积很小,价格便宜[5],使用起来非常划算,具有很高的性价比.ST188红外传感器位于AK之间是发光二极管,位于CE之间是光敏三极管.
        3.1.2 工作原理
        通过用手指按压红外反射传感器ST188,并显示在1602液晶屏上来测量心率.系统以IAP15 F2K61S2微控制器为核心,红外反射传感器ST188用作检测元件.时间的计算由IAP15F2K61S2系统的内部定时器完成.在系统操作期间可以显示心脏跳动次数和时间.
        3.1.3 信号采集
        红外反射传感器AK分别接入高电平和低电平,电位器连在R4旁边用于调节传感器灵敏度[5].信号采集过程中,红外反射传感器ST188与手指接触,被手指按压.脉冲信号由红外反射传感器ST188感知.IAP15F2K61S2微控制器系统负责统计心脏跳动次数和时间.
        3.1.4 信号放大
        本文采用LM358芯片用于放大电路的设计.由于人的心跳产生的信号非常弱,导致红外反射传感器ST188输出的信号同样很微弱,较易受到周边环境的影响,因此需要对当前得到的微弱信号进行放大处理,放大电路使用两级反向放大将信号放大到约2-5V的幅度值.输出波形相对于比较输入波形而言为同相并被放大的波形.放大后的波形是一个交流信号.在电源旁
边连接一个电容器,以滤除干扰信号和抗电磁干扰.整流后的电压波形(D2二极管)是正弦半波.放大电路的输出信号由比较器输出为方波(2个引脚的比较电压根据3个引脚的实际输出电压设定,通常大致是0.8V.
        3.2 IAP15F2K61S2单片机
        IAP15F2K61S2单片机是STC公司推出的新一代支持在应用编程的单片机.具有2KB RAM空间,61K Flash空间,IO具备4种工作模式,8ADC通道.带仿真接口,可以在Keil C51中调试程序,适合于嵌入式开发.
        3.3 LCD12864液晶屏
        一种点阵图形液晶显示模块,具有2线或3线串行,4/8位并行接口模式,以及简化的汉字库; 它可以形成一个完整的中文人机交互图形界面.它可以显示8×416×16点阵汉字.
        4 心率测试仪系统软件的实现
        4.1 系统软件介绍
        4.1.1 keil C51软件简介
        Keil C51软件系统的特点是兼容单芯片C语言软件开发.鉴于C语言拥有出的移植性,可以在各种体系结构的软硬件平台上运行;语法机制灵活,可直接访问硬件;运行效率高,运行速度较快.在可读性,功能,结构等方面优势明显.Keil提供完整的开发解决方案,包括C编译器,宏汇编,链接器,库管理以及强大的仿真器调试.通过集成开发环境将它们统一组合起来.因此,运行C语言编程, Keil C51几乎是不二之选.
        本文中Keil C51软件的主要功能是负责将C语言编译成可重定位的目标HEX文件,实现C语言程序对单片机的控制.
        4.1.2 Proteus电路仿真软件
        Proteus是由英国Labcenter Electronics开发的多功能EDA软件.是一款可以提供电路仿真、PCB设计和虚拟模型仿真的设计平台.本文中PROTEUS软件的主要功能是提供心率测试仪的仿真电路.
        4.2 心率测试仪C语言程序实现
        4.2.1 心率测试仪计数代码
        #include ”stc15.h”万用表测交流电流
        #include [intrins.h]
        #define uchar unsigned char
        #define uint unsigned
        sbit LCD_RS = P3^5 //寄存器选择输入
        sbit LCD_RW = P3^6 //液晶读/写控制
        sbit LCD_EN = P3^7 //液晶使能控制
        sbit LCD_PSB = P0^2 ///并方式控制
        sbit LCD_RST = P0^0 //液晶复位端口
        unsigned char i=0timecount=0displayOK=0rate=0aa=0
        unsignedint time[6]={0}
        #define delayNOP(); {_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。