(完整版)基于单片机的脉搏心率测量仪的开发与设计毕业设计

第4章 软件设计

4.1 系统总体软件流程

本次设计的主体部分主要由硬件实现,软件部分的主要作用在于开机初始化单片机,一分钟方波个数的客观计算,数码管动态扫面显示等。程序流程图如图4-1所示。

图4-1 主程序流程图

4.2 整体程序设计

整个程序是用C语言编写的,主要由主程序、定时器T0中断服务程序、外部中断程序,延时子程序四个模块组成。主程序主要实现程序的初始化,定时中断程序主要由计时、动态显示扫描、无测试信号判断等部分组成,外部中断服务程序主要由测量、计算、读数等部分组成。程序中用变量m对脉搏信号个数计数,用n变量对时间计数。

从P3.2口输入的与脉搏信号所对应的脉冲信号来作为外部中断0的中断请求信号,外部中断采用边沿触发的方式。由于脉冲信号的频率很低,所以不适合用计数的方法进行测量,所以采用测量脉冲周期的方法进行测量,就是用脉冲来控制计时的信号,通过计时数计算脉冲的周期,再由脉冲的周期计算出脉冲的频率,从P3.2口每输入一次脉冲信号就能显示一次一分钟的脉搏数。

定时器T0的中断时间为5ms,每中断一次计时变量n就加1,因此计时的单位是5ms,例如一个脉搏脉冲周期对应的n值为240,则对应的时间为1.2s,由此可以得到每分钟的脉搏数为50,如果变量n值达到2000,即10秒钟仍然没有发生外部中断,则表示没有脉冲信号进入单片机,于是就把变量n的值清0,数码管显示为0.

读数采用三位显示。定时器T0每中断一次就显示一位,因此3次中断就能刷新一次数据,即15ms刷新一次数据。

本系统硬件平台的核心是AT89C2051芯片,其芯片内微控制器是一个优化的单指令周期8051 闪存MCU,它的指令系统保持与8051指令系统兼容。单片机内程序主要功能为:

(1)系统初始化;

(2)改变电平状态,驱动红外光二极管; (3)管理ADC进行数据采集; (4)数字滤波处理;

(5)与中央监测系统或计算机进行实时数据传输。

本文选用ATMEL公司的单片机AT89C2051,其内部集成了速度可达400k的12位逐次逼近型ADC,模拟输入范围是0~2.5v,则分辨率为0.6mv/LSB。从软件需求和单片机速度出发,将ADC采样率fs设定为102.4kHz,为便于计算,将过采样倍数k设定为64,则下抽取后采样率为f为:fs/k=1600Hz,是频率为400Hz载波的四倍,满足奈奎斯特采样定理。由于过采样倍数k为64,按每提高4倍采样率就能提高一位分辨率来计算,获得的ADC有效分辨率能提高3位,最后能达到约15位精度,其分辨率可达到0.0763mv/LSB。

过采样和数字滤波的实现都是在AD中断服务程序中实现的。集成于单片机上的ADC由定时器产生用于A/D转换的重复触发信号,因此需要通过设置T2寄存器重新装载的值来获得102.4kHz的采样率,参考信号取自片上自带的2.5V基准电压,设置ADCCON1=#0B2H,ADCCON2=#00H。定时器2是一个具有16位自动重装载功能的定时器,作定时器用时,TH2和TL2计的是机器周期数,TH2和TL2内容的自动重装载通过寄存器RCAP2H和RCAP2L来实现。对这四个寄存器都进行初始化,自动装载值为#0FFCAH。

在数据采集中, 为了保证采集数据的不失真和适当的精确度, 必须选择合适的采样频率。人体脉搏正常跳动约为60次/分左右,即跳动频率在1Hz 左右,本系统为了更好的消除50Hz工频干扰,系统以50Hz的数据输出率对数据进行下抽取,抽样比为2048。中断程序中的数字处理包括如下步骤:

(1) 将脉冲载波的高电平时段内的数据累加2048/(2*64)=16次; (2) 将脉冲载波低电平时段内的数据累加2048/(2*64)=16次; (3) 用步骤(1)中的数据减去步骤(2)中的数据,便得到了解调后以50Hz的数据输出率输出的一个数据点。经过上述对信号的解调,有效去除背景光、杂散光的干扰。程序同时实现了过采样算法中的滤波和下抽取。

脉率计算程序包括如下步骤:将得到的数据以双字节存入单片机AT89C2051的数据存储器RAM中。从0000H 开始,在60个样本数据中寻找最大值,并确定其位置即波峰位置,之后寻找紧挨着它的第二个波峰,采用软件计数器计算两者间的距离即其点数,然后按照脉率计算公式:脉率=采样频率/相邻两波峰×60 =50×60/相邻两波峰,计算出脉率,并将

其存储。

当脉搏检测系统与中央监测系统或计算机进行实时数据传输时,通过设置定时器T3的控制寄存器T3CON为#86H,T3FD为08H,得到9600的串口串列传输速率。ADuC841发送握手信号与系统机建立通信,当握手成功后,系统开中断并将转换处理后的数据送交系统应用程序进行处理

[24]

联系客服:779662525#qq.com(#替换为@)