您的当前位置:首页正文

基于ARM的数字式人体脉搏仪的设计

来源:九壹网
嵌入式系统设计

题目:基于ARM的数字式人体脉搏仪的设计

专业:电气工程及其自动化

学号:K030941441 姓名:张雄

2011年11月14日

一 数字式人体脉搏器测量系统总体方案设计

1.1 系统硬件电路设计方案

数字式人体脉搏器是通过脉搏传感器采集脉搏信息输出电压信号,经信号放大电路对其进行放大。然后,将放大后的脉搏信号通过A/D转换模块转换为单片机易于处理的脉冲信号。通过对单片机进行编程来实现对脉搏波动频率的测量和计算,最终在显示电路中直观的显示出来。

硬件原理框图如图1.1所示:

脉搏传感器信号放大电路A/D转换电路 单片机处理电路显示电路

图1.1 数字式人体脉搏仪测量系统硬件原理框图

由图可知,本系统硬件部分主要由以下部分构成:脉搏传感器部分、信号放大电路部分、A/D转换电路部分、单片机处理电路部分及显示电路部分。其中各部分实现功能如下:

(1)脉搏传感器部分。选用合适的脉搏传感器,将脉搏信号转换成电信号输出。脉搏传感器的精度、灵敏度、抗干扰能力及安装方式决定了脉搏测量精度,因此其选型对整个设计具有决定性的作用。

(2)信号放大电路部分。脉搏传感器出来的电压信号较弱,一般在毫伏级,需要进行放大。所以,设计信号放大电路,将脉搏传感器出来的信号进行放大,使之成为一个幅值适当的信号,便于后续电路的处理。

(3)A/D转换电路部分。单片机是数字信号处理工具,输入单片机的信号必须是离散的数字信号或者是脉冲信号,经A/D转化,便于单片机处理。

(4)单片机处理电路部分。本设计作为一个简单脉搏测量仪,最后需给出脉搏波动频率,以单片机作为信息处理中心,通过对单片机进行编程,完成信号输入检测、信息分析处理及信息显示。

(5)显示电路部分。单片机处理得到的脉搏波动频率信息,最后在显示电路中直观地显示出来。所以,需要选用合适的显示设备及显示电路,来实现对脉搏波动频率信息的显示。

1.1.1 脉搏传感器的选择

传感器又称为换能器、变换器等。脉搏传感器是脉搏检测系统中重要的组成部分,其基本功能是将切脉压力和桡动脉搏动压力这样一些物理量(非电量)转换成为便于测量的电量。脉搏传感器的精度、灵敏度、抗干扰能力及安装方式决定了脉搏测量精度,因此其选型对整个设计具有决定性的作用。

目前,脉搏信号的测量方式主要有:

(1)光电脉搏波传感器。血管不受压力时,血流均匀,反射光也比较均匀,故传感器无脉搏信号输出;当血管受压血液不流动时,传感器也无输出信号;只有当血管受到挤压,血管中的血液断续流动时,反射光也随之变化,这时传感器输出脉搏信号,达到了测量脉搏的作用。这种传感器的特点是结构简单、可靠性高、抗干扰能力强,主要用于测量脉搏的跳动次数。人体不同部位的脉搏波波形存在差异,光电脉搏波传感器不适合用于提取不同部位的脉搏波信号。

(2)压力传感器测量。压电传感器主要使用在加速度、压力和力等的测量中。压电式加速度传感器是一种常用的加速度计。它具有结构简单、体积小、重量轻、使用寿命长等优异的特点。压电式加速度传感器在飞机、汽车、船舶、桥梁和建筑的振动和冲击测量中已经得到了广泛的使用,特别是航空和宇航领域中更有它的特殊地位。压电式传感器也可以用来测量发动机内部燃烧压力的测量和真空度的测量。也可以用于军事工业,例如用它来测量枪炮子弹在膛中击发的一瞬间的膛压的变化和炮口的冲击波压力。它既可以用来测量大的压力,也可以用来测量微小的压力。

图1.2 信号发生部分

其测量原理是,将测力传感器的受力端压在人体桡动脉处,模仿人的指头。这种方式通常采用压阻式传感器,它具有抗干扰能力强的特点,但由于动脉血管产生的力很小,故量程小,抗冲击力不强。

脉搏信号还表现为皮肤振动,因此可以用加速度传感器进行检测,其特点是结构简单、体积小、波形测量精度较高。

本设计中的脉搏传感器用MPX4115压力传感器,如图2.2所示。表2.1表明了引脚连接,脚1接运算放大电路输入端,脚2接地,脚3接+5V电源等。表2.2,2.3分别为传感器的一些参数。

表1.1 MPX4115 引脚功能 3 4 5 Vs N/C N/C [3]

1 Vout 2 地 6 N/C 表1.2 最大额定值(Tc=25℃)

参 数 符 号 数 值 最大压力(P1>P2) Pmax 存贮温度 Tstg 操作温度 TA 400 -40~+125 -40~+125 单 位 KPa ℃ ℃ 表1.3 传感器工作特性参数 (VS=5.1Vdc,TA=25℃) 参 数 符 号 最 小 典 型 最 大 压力范围 Pop 15 - 115 供电电压 Vs 4.85 5.1 5.35 供电电流 Lo - 7.0 10 最大压力偏置 (0℃~85℃) Vpss 0.135 0.204 0.273 @Vs=5.0V 满量程输出 (0℃~85℃) @Vs=5.0V Voff 4.725 4.794 4.863 单 位 KPa Vdc mAdc Vdc Vdc 满量程比例 (0℃~85℃) VFSS @Vs=5.0V 精度 (0℃~85℃) - 灵敏度 V/P 响应时间(10%~90%) tR 上升报警时间 - 偏置稳定性 - 1.1.2 信号放大电路的选择

4.521 4.590 4.695 Vdc - - ±1.5 %VPSS - - - - 45.9 1.0 20 ±0.5 - - - - mV/KPa ms ms %VFSS 脉搏传感器出来的电压信号较弱,一般在毫伏级,需要对其进行放大。所以,设计信号

放大电路,将脉搏传感器出来的信号进行放大,使之成为一个幅值适当的信号,便于后续电路的处理。

MPX4115型压电式脉搏传感器输出电压大约为-10mv~40mv,在后续电路中需要将其通过差动式放大电路,将信号放大,然后通过A/D转换电路转换为数字脉冲信号。

差动放大电路广泛地使用于模拟集成电路中,它具有很高的共模抑制比。诸如由电源波动、温度变化等外界干扰都会引起工作点不稳定,它们都可以看作是一种共模信号。差动放大电路能抑制共模信号的放大,对上述变化有良好的适应性,使放大器有较高的稳定度。所以本设计选择了差动放大电路。 1.1.3 单片机的选择

本设计作为一个简单脉搏测量仪,最后需给出脉搏波动频率。以单片机作为信息处理中心,通过对单片机进行编程,完成信号输入检测、信息分析处理及信息显示。

(1)AVR单片机

AVR单片机是ATMEL公司生产的单片机。1997年,由ATMEL公司挪威设计中心的A先生和V先生利用ATMEL公司的Flash新技术, 共同研发出RISC精简指令集的高速8位单片机,简称AVR。相对于出现较早也较为成熟的51系列单片机,AVR系列单片机片内资源更为丰富,接口也更为强大,同时由于其价格低等优势,在很多场合可以替代51系列单片机。其特点是高速度(50ns)、低功耗,硬件使用Harward结构,具有预取指令功能,使得指令可以在一个时钟周期内执行,而MSC-51要12个时钟周期执行一条指令。AVR单片机如LPC2131等。

(2)凌阳单片机

凌阳是台湾凌阳公司推出的单片机,具有高速度、低价、可靠、实用、体积小、功耗低和简单易学等特点,它的CPU内核采用凌阳推出的Microcontroller and Signal Processor 16位微机处理器芯片,以下简称µ’nSP 。围绕micro;’nSP 所形成的16位u’nSP 系列单片机,以下简称µ’nSP 家族。采用的是模块式集成结构,它以µ’nSP 内核为中心集成不同规模的ROM PAM和功能丰富的各种外设部件。µ’nSP 内核是一个通用的和结构。除此之外的其它功能模块均为可选结构。以及这种结构可大可小可有可无,借助这种通用结构附加可选结构的积木式的构成,便可成为各种系列的派生产品,以适合不同场合,这样做无疑会使每种派生产品具有更强的功能和更低的成本。

µ’nSP 家族有有以下特点:体积小 ,集成度高,可靠性好易于扩展。µ’

[4]

nSP 家族把各功能把各功能部件模块化地集成在一个芯片里。内部采用总线结构,因为减少了各功能部件之间的连接,提高了其可靠性和抗干扰能力,另外,模块化的结构易于系列的扩展,以适应不同用户的需求。具有较强的中断处理能力。μ’nSPTM家族的中断系统支持10个中断向量及10余个中断源,适合实时使用领域。高性能价格比:μ’nSPTM家族片内带有高寻址能力的ROM,静态RAM和多功能的I/O口,另外μ’nSPTM的指令系统提供出具有较高运算速度的16位,16位的乘法运算指令和内积运算指令,为其使用添加了DSP功能,使得μ’nSPTM家族运用在复杂的数字信号处理方面既很便利又比专用的DSP芯片廉价。如SPCE061等。

(3)51单片机

51单片机是对目前所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为目前使用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛使用于工业测控系统之中。目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是使用最广泛的一种。

51单片机是INTEL公司生产的。它具有结构简单,价格便宜,易于开发的特点。通用型,有总线扩展,有较强的位处理功能,有全双工异步串行通信口。但是其功能相对较少,访问外部数据有瓶颈,作电压范围窄。

本设计中,单片机只需要对脉搏信号的波动频率进行测量、计算和显示,对单片机的要求不是很高。而对51单片机,本人比较熟悉,所以,本设计中选择51单片机作为信息处理中心。

在51系列单片机中,AT89系列单片机是美国ATMEL公司推出的一种新型高性能低价位、低电压低功耗的8位CMOS微型计算机。AT89S51就是其中一款,它可以完全满足本设计的设计要求,而且,AT89S51的价格较低。

1.2 系统软件方案选择

1.2.1 脉搏波动频率测量方案的选择

通过放大电路经A/D转换之后的信号为脉冲信号。脉冲信号的频率是指在单位时间内由信号所产生的交变次数或脉冲个数,即fxN/t。可以看出测量fx必须将N或t两个量之一作为闸门或基准,对另一个量进行测量。对于不同的频率范围,有三种不同的测量方法。

(1)周期测量法:适用于低频信号。采用单片机内的一个定时/计数器,以单片机内的

标准机器周期作为标准时基信号Ts。被测信号的周期作为信号闸门,由程序控制开关对时基进行计数得nx,因此被测信号周期为TxnxTs,每分钟脉搏跳动次数为N60/Tx。

(2)多周期同步法:适用于中频信号。其特点是标准频率信号不是用来填充待测信号的周期,而是和待测信号分别输入到两个计数器进行同步计数。

(3)频率测量法:适用于高频信号。充分利用单片机内的两个定时/计数器,一个作为定时器,给出标准闸门信号,另一个作为计数器。

人体脉搏波动频率一般为60~80次/min,其频率成分主要分布在0~20Hz之间,属于次声,最高频率不超过40Hz,一般情况下为1Hz左右,属于低频信号。所以,本设计中选择周期测量法。

1.2.2 单片机工作方式的选择

单片机数据传送方式一般有以下几种:

(1)查询方式:由于CPU和外设之间存在时序、速度等差异,在数据传送前必须检测接口状态,探查外设是否数据准备就绪。查询方式优点是结构简单,硬件开销小;缺点是CPU在整个传送过程中需要不断检测外设状态,由于CPU的速度远远高于外设,因此通常处于等待状态,工作效率很低。

(2)中断方式:CPU无需检测外设是否数据准备就绪,不占据CPU时间,因此CPU和外设并行工作,提高了CPU的工作效率,还满足了外设的实时要求。

本设计中,只对A/D转换后的脉冲信号进行频率计算,CPU工作不是很繁忙,可以选择查询方式。

1.2.3 显示电路方案的选择

脉搏信号经过单片机处理,得到脉搏波动频率之后,需要在显示电路中直观地显示出来。所以,需要选用合适的显示设备及显示电路,来实现对脉搏波动频率信息的显示。

人体脉搏信号从时域上看,是一个周期性较强的准周期信号。脉搏波动频率一般为60~80次/min。本设计中,显示位数较多。可以选择LCD字符液晶屏来对脉搏波动频率信息进行显示。它具有:

电参数(VDD=5.0V 10%,VSS=0V,Ta=25 ) 显示内容:16字符x 2 行

字符点阵:5 x 8点 驱动方式:1/16D

可供型号:TN STN(黄绿模灰模黑白模) 反射型带EL或LCD背光源

LCD常用显示方法有两种:静态显示和动态扫描显示。

(1)静态显示:所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能的 I/O接口用于笔划段字形显示。这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码,因此,使用这种方法单片机中CPU的开销小,较小的电流能得到较高的亮度且字符不闪烁。静态显示适用于显示器位数较少时。

(2)动态扫描显示:所谓动态显示,就是一位一位地轮流点亮显示器各个位(扫描),对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必需保证扫描速度足够快,字符才不闪烁。当显示位数较多时,用静态显示所需的I/O太多,一般采用动态显示的方法。

本设计中,显示的脉搏波动频率,同时显示脉搏次数和测试时间,选用动态显示。

[5]

二 数字式人体脉搏仪测量系统硬件电路设计

本设计中,脉搏波动频率测量的实现是通过脉搏传感器采集脉搏信息输出电压信号,经信号放大电路对其进行放大。然后,将放大后的脉搏信号通过A/D转换电路转换为单片机易于处理的脉冲信号。通过对单片机进行编程来实现对脉搏波动频率的测量和计算,并在显示电路中直观的显示出来。

为达到电路结构简单实用的设计目的,从设计要求出发,设计了信号放大电路、A/D转换电路,单片机处理电路及LCD显示电路等。本章对各部分电路的设计进行详细论述和分析。

2.1 信号放大电路的设计

脉搏传感器出来的电压信号较弱,在毫伏级,需要对其进行放大。所以,设计信号放大电路,将脉搏传感器出来的信号进行放大 ,使之成为一个幅值适当的信号,便于后续电路的处理。

本设计中采用的是差动式放大电路,如图2.1所示:

[6]

图2.1 差动式放大电路

基本差动放大电路由两个完全对称的共发射极单管放大电路组成,该电路的输入端是两个信号的输入,这两个信号的差值,为电路有效输入信号,电路的输出是对这两个输入信号之差的放大。设想这样一种情景,如果存在干扰信号,会对两个输入信号产生相同的干扰,通过二者之差,干扰信号的有效输入为零,这就达到了抗共模干扰的目的。

差动放大电路的基本形式对电路的要求是:两个电路的参数完全对称两个管子的温度特性也完全对称。

它的工作原理是:当输入信号Ui=0时,则两管的电流相等,两管的集点极电位也相等,所以输出电压Uo=UC1-UC2=0。温度上升时,两管电流均增加,则集电极电位均下降,由于它们处于同一温度环境,因此两管的电流和电压变化量均相等,其输出电压仍然为零。

共模信号的作用,对两管的作用是同向的,将引起两管电流同量的增加,集电极电位也同量减小,因此两管集电极输出共模电压Uoc为零。因此:于是差动电路对称时,对共模信号的抑制能力强

差模信号的作用,由于信号的极性相反,因此T1管集电极电压下降,T2管的集电极电压上升,且二者的变化量的绝对值相等,所以,由此我们可以看出差模电压放大倍数等于单管电压的放大倍数。

图2.2 A/D转换电路

2.2 A/D转换电路的设计

放大后的脉搏信号,幅值为-1V~4V,而在后续电路中,需要把放大后的脉搏信号转换为易于单片机处理得到脉搏波动频率信息的脉冲信号。单片机是数字信号处理工具,输入单片机的信号必须是离散的数字信号或者是脉冲信号,经A/D转化,便于单片机处理。其原理图如图3.2所示。只有当信号幅值在一定范围内时才会实现模数转换功能,以便记录脉搏次数。

2.3 单片机微处理系统的设计

本设计作为一个简单脉搏测量仪,最后需给出脉搏波动频率,以单片机作为信息处理中心,通过对单片机进行编程,完成信号输入检测、信息分析处理及信息显示。

从实用性、设计、货源及价格的角度出发,并且考虑到本设计对单片机没有特殊的要求,选用了常用的AT89S51单片机,其引脚如图2.3所示:

[7]

(T2)P1.0(T2EX)P1.1P1.2P1.3P1.4P1.5P1.6P1.7RST(RXD)P3.0(TXD)P3.1(INT0)P3.2(INT1)P3.3(T0)P3.4(T1)P3.5(WR)P3.6(RD)P3.7XTAL2XTAL1GND12345678910111213141516171819204039383736353433323130292827262524232221VCCP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7EA/VPPALE/PROGPSENP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0

图2.3 AT89S51单片机引脚图

在AT89S51单片机引脚图中,P3口是一个带内部上拉电阻的8位双向I/O口。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如表3.1所示。

本设计正是利用T0口的定时功能实现对脉搏波动频率的测量。

AT89S51单片机不仅完全可以实现对脉搏波动频率测量的控制要求,而且可以在线编程调试,符合设计的要求。

表2.1 P3口第二功能

端口引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7

第二功能

RXD(串行输入口) TXD(串行输出口) INTO(外中断0) INT1(外中断1)

T0(定时/计数0外部输入) T1(定时/计数1外部输入) WR(外部数据存储器写选通) RD(外部数据存储器读选通)

本设计中对脉搏频率的测量,采用周期测量法。将单片机内定时/计数器T0定为16位定时器,对内部机器周期计数。将A/D转换出来的脉冲信号接到单片机的P2.5口上,则定时器的开关由程序根据P2.5口上的状态进行控制。检测到上升沿时开T0计数,当紧接着的另一个

上升沿被检测到时关T0计数。单片机微处理系统硬件电路如图3.4所示。

图2.4 单片机微处理系统硬件电路

P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出; P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制); P1.5 MOSI(在系统编程用); P1.6 MISO(在系统编程用); P1.7 SCK(在系统编程用)。

图2.5 LCD1602液晶显示 表2.2 1602液晶时序参数

时序参数 符号 最大值 典型

最小值

单位 测试条件

E信号周期 E脉冲宽度 E上升/下降时间 地址建立时间 地址保持时间 数据建立时间(读操

tC tRW tR tF

tSP1 tHD1 tD

400 150 - 30 10 -

- - - - - -

- ns - ns 25 ns - ns - ns 10

ns 0

引脚E 引脚E 引脚E 引脚E RS RW 引脚E RS RW 引脚DB-DB7

作) 数据保持时间(读操

tHD2

作) 数据建立时间(写操

tSP2

作) 数据保持时间(写操

tHD3

作)

10

-

40

-

20

-

引脚DB-DB7

- ns

引脚DB-DB7

- ns

引脚DB-DB7

- ns

2.4 LCD显示硬件电路的设计

脉搏信号经过单片机处理,得到脉搏波动频率之后,需要在显示电路中直观地显示出来。所以,需要选用合适的显示设备及显示电路,来实现对脉搏波动频率信息的显示。本设计中,采用1602字符液晶屏动态显示方式来显示脉搏波动频率信息。显示电路如图2.5所示,1602字符液晶屏时序参数如表2.2所示,硬件端口定义及软件资源分配如表2.3所示。

表2.3 液晶驱动程序硬件端口资源分配表

硬件端口

RS RW E LCD POS_FLAG

分配资源

P0.0 P0.1 P0.2 P2 20H

示在第二行

说 明 寄存器选择控制线 LCD读写控制线 启用控制线,高电平动作

双向数据总线

字符串显示位置标志,为0时显示在第一行,为1时显

[8]

BLANK LCD初始化

30H 清行时填入的空格个数控制变量

液晶显示模块1602的控制指令:1602的控制指令共11条,其中9条针对命令寄存器IR的,另外2条是针对数据寄存器DR的,具体指令如表3.4所示。

表2.4 1602指令表(注:×表示可以为0或1)

D7

指 令

1 2 3

清屏显示 光标返回 置输入模式

0

4 5

显示开/关控制 0 光标或字符移

0

位 6 7

置功能 置字符发生存

0

储器地址 8

置数据存储器

0

地址 9

读忙标志或地

0

址 10

写数到CGRAM

1

或DDRAM 11

CGRAM

1

DDRAM读数

表2.4的相关命令设置如表2.5所示:

表2.5 1602指令相关设置

1

读出的数据 0

要写的数据 1

BF 计数器地址(AC) 0

1

显示数据存储器地址(ADD)

0

0

1 (AGG)

0

0

0

0

1 DL

0

0

0

0

1 C N L

F × ×

0 0

0 0

0 0

0 0

0 0

0 1 S/

R/

× × 1 D D C

B

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 0

0 1 I/

S 1 ×

RS RW

D6 D5 D4 D3 D2 D1 D0

字符发生存储器地址

命 令 I/D S D C B BF

收命令

设置

1—增量方式,0—减量方式 1—不移动,0—移动 1—显示,0—不显示 1—显示光标,0—不显示光标 1—光标闪烁,0—光标不闪烁 1—正在执行内部操作,0—可接

命 令 S/C R/L DL N F

设置

1—显示器移位,0—光标移位 1—右移,0—左移 1—8BIT,0—6BIT 1—2 行,0—1 行 1—5*10 字型,0—5*7 字型

控制信号(RS、RW、E)和对应功能的真值表如表3.6所示:

表2.6 控制使能端真值表

RS 0 0

RW 0 1

E 下降沿 上升沿

功能 写指令代码 读忙标志和AC码

RS 1 1

R/W 0 0

E

功能

下降沿 写数据 上升沿 读数据

三 数字式人体脉搏仪测量系统软件设计

从脉搏传感器出来的脉搏信号,经过放大电路、电压基准变化电路、过零比较器,转换为脉冲信号之后,需要对单片机进行编程,实现对脉搏波动频率的测量、计算和显示。

本设计中,软件设计采用模块化结构。根据脉搏波动频率测量系统的设定功能,将软件划分为若干个功能相对独立的模块,主要有系统主程序和脉搏波动频率测量模块。本章给出主要模块的程序设计思想和流程图。

3.1 脉搏频率测量原理

脉冲信号的频率是指在单位时间内由信号所产生的交变次数或脉冲个数,即fx=N/t可以看出测量fx必须将N或t两个量之一作为闸门或基准,对另一个量进行测量。

周期测量法:适用于低频信号。采用单片机内的一个定时/计数器,以单片机内的标准机器周期作为标准时基信号Ts,如图3.1所示。被测信号的周期作为信号闸门,由程序控制开关对时基进行计数得nx,因此被测信号周期为TxnxTs。

图3.1 周期测量法原理

多周期同步法:适用于中频信号。其特点是标准频率信号不是用来填充待测信号的周期,而是和待测信号分别输入到两个计数器进行同步计数。首先,由单片机给出闸门开启信号,此时,计数器并不开始计数,而是等到被测信号的上升沿到来时,才真正开始计数。然后,两级计数器分别对被测信号和标准信号计数。当单片机给出闸门关闭信号后,计数器并不立即停止计数而是等到被测信号上升沿来到的时刻才真正结束计数,完成一次测量过程。如图3.2所示,可以看出,实际闸门和参考闸门并不严格相等,但最大差值不超过被测信号的一个周期。设对被测信号的计数值为Nx,对时基信号的计数值为N0,时基信号的频率为f0,则被测信号的频率为: Fx(Nxf0)/N0。

图3.2 多周期测量法原理

频率测量法:适用于高频信号。充分利用单片机内的两个定时/计数器。一个作为定时器,给出标准闸门信号Tz,另一个作为计数器,对fx的变化次数直接进行计数得Nx,

FxNx/Tz,如图3.3所示。

图3.3 脉搏波动频率测量法原理

人体脉搏信号从时域上看,是一个周期性较强的准周期信号。脉搏波动频率为60~80次/min,其频率一般情况下为1Hz左右,属于低频信号。所以,本设计中采用周期测量法。

3.2 系统主程序的设计

系统主程序控制单片机系统按预定的操作方式运行,是单片机系统程序的框架。系统主程序流程图如图4.4所示。

开始系统初始化 按键否?YN脉搏测量子程序LCD显示Y是否报警?N报警结束

图3.4 系统主程序流程图

上电后,首先进行整机初始化处理。主程序的初始化模块主要完成仪器硬件、软件的初态设置,单片机内专用寄存器的设定,单片机工作方式及各端口的工作状态的规定。整机初始化结束后,检测P3.2口的状态,如果检测到上升沿,则进入脉搏波动频率测量子程序,测得脉搏波动频率之后,送到LCD显示单元进行显示。

3.3 数字式人体脉搏仪测量子程序的设计

本设计中对脉搏频率的测量采用周期测量法。可将单片机内定时/计数器T0定为16位定时器,对内部机器周期计数,即方式控制字为#01H。脉搏波动频率测量子程序流程图如图3.5所示。定时器的开关由程序根据P3.2口上的状态进行控制,检测到上升沿时开T0计数,当紧接着的另一个上升沿被检测到时关T0计数。T0中的计数值为nx,则被测脉搏信号周期

TxnxTs(对于12MHz晶振,Ts=1μs),每分钟跳动次数Fx60/Tx。

开始等待N开始键按下否Y等待N有无脉冲Y计数并计时送LCD显示结束键按下否YN是否超出范围YN报警结束

图3.5 脉搏波动频率测量子程序流程图

考虑到脉搏的频率很低,大约为1Hz左右,而16 位定时/计数器的最高计数值为65535,这样定时/计数器将发生溢出,且最后脉搏波动频率的计算涉及到双字节除法,编程较复杂。为此,采用定时器中断方式,即在一个脉搏周期内,隔一段时间T1,T1即为中断周期。

设N为每分钟脉搏跳动次数,T为脉搏跳动周期,则

N60/T

本设计中,设定显示的每分钟脉搏跳动次数误差不超过1次,则

dN60dT 2T若T=2,

dN则定时器周期T不超过1/15秒。 若T=1,

60dT15dT 4dN60dT

则定时器周期T不超过1/60秒。 取T=1,即定时器周期T不超过1/60秒。 设中断周期为T1,中断次数为n,则:

N60

T1n为方便计算,取: 12m。由于定时器周期T不超过1/60秒,即T11/60,

T111160,故取m=7。即中断周期为7s7812us。每分钟脉搏跳动次数

2128T160273028,为方便计算,取N。 Nnn系统程序见下。

数字式脉搏器的设计程序

#include

#include #include #include

#define uchar unsigned char #define uint unsigned int

#define BUSY 0x80 // LCD #define DATAPORT P0 // 参 sbit LCM_RS=P2^0; // 数 sbit LCM_RW=P2^1; // 配 sbit LCM_EN=P2^2; // 置 sbit reset=P3^7; sbit bj=P3^0;

sbit time_start=P3^2; sbit time_over=P3^3;

sbit EOC=P2^3; //OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。 sbit START=P2^4; //START为转换启动信号。当START上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。

sbit OE =P2^5; //EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。

sbit AD_ALE=P2^6; //ad 转换 sbit CLK=P2^7;

unsigned long int getdata; void ADC0809();

uchar code str0[]={\"Throb: \uchar code str1[]={\"Time:\" };

void delay(uint k); //延时

void lcd_wait(); //LCM忙检测 void WriteCommandLCM(uchar WCLCM,uchar BusyC); //写指令到LCM子函数

void WriteDataLCM(uchar WDLCM); //写数据到LCM子函数

void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示指定坐标的一个字符子函数

void DisplayListChar(uchar X,uchar Y,uchar code *DData); 标的一串字符子函数

void initLCM( void); //LCD初始化子程序 uchar m=0;

uint counter=0,counter_0=0; uchar second_0=0; uint totle_1; float totle_0; void main() {

uint i,j,k;

TMOD=0x02; TL0=0xfe;

TH0=0xfe; //AD频率 TR0=1; ET0=1; TH1=0x60;

TL1=0x78; //定时5ms ET1=1; PX1=1; EX0=1; IT0=1; EX1=1; IT1=1; EA=1;

delay(100); //系统延时500ms启动 initLCM( );

WriteCommandLCM(0x01,1); //清显示屏 DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); AD_ALE=0; START=0; OE=0; while(1) {

ADC0808(); //v=getdata;

if(getdata>=300&&getdata<400) {

delay(60);

if(getdata>=300&&getdata<400) {

counter++; if(m==1)

//显示指定坐

// // // {

PT1=1; TR1=1; m=0; } } }

DisplayOneChar(7,0,0x30+getdata/100); DisplayOneChar(8,0,0x30+getdata%10); DisplayOneChar(9,0,0x30+getdata/10%10); if(counter<100) {

DisplayOneChar(8,0,0x30+counter/10); DisplayOneChar(9,0,0x30+counter%10); }

if(counter>=100) {

DisplayOneChar(7,0,0x30+counter/100); DisplayOneChar(8,0,0x30+counter/10%10); DisplayOneChar(9,0,0x30+counter%10); }

if(second_0>59) { second_0=0;}

DisplayOneChar(7,1,0x30+second_0%10); DisplayOneChar(6,1,0x30+second_0/10); if(reset==0) {

counter=0; counter_0=0; second_0=0; totle_0=0; totle_1=0; bj=0; }

totle_1=(int)totle_0;

DisplayOneChar(9,1,0x30+totle_1/100); DisplayOneChar(10,1,0x30+totle_1/10%10); DisplayOneChar(11,1,0x30+totle_1%10); DisplayOneChar(12,1,'/'); DisplayOneChar(13,1,'m'); DisplayOneChar(14,1,'i'); DisplayOneChar(15,1,'n'); if(totle_1>120) {

for(k=0;k<100;k++) {

for(i=0;i<25;i++) bj=0;

for(j=0;j<25;j++) bj=1; if(reset==0) {

counter=0; counter_0=0; second_0=0; totle_0=0; totle_1=0; bj=0; } } }

if(totle_1<40&&totle_1>0) {

for(k=0;k<100;k++) {

for(i=0;i<25;i++) bj=0;

for(j=0;j<25;j++) bj=1; if(reset==0) {

counter=0; counter_0=0; second_0=0; totle_0=0; totle_1=0; bj=0; } } } } }

/****************外部中断0*******************/ void intr0_int() interrupt 0 using 3 {

m=1; }

/****************外部中断1*******************/

void intr1_int() interrupt 2 using 3 {

PT1=0; TR1=0;

totle_0=(float)counter/second_0*60; }

/****************定时中断0*******************/ void timer0_int() interrupt 1 using 1 {

CLK=~CLK; }

/****************定时中断1*******************/ void timer1_int() interrupt 3 using 2 {

TH1=0x60; TL1=0x78;

counter_0++; if(counter_0==190) {

counter_0=0; second_0++; } }

/*********延时K*1ms,12.000mhz**********/ void delay(uint k) {

uint i,j;

for(i=0;i/***********lcm内部等待函数*************/ //从这里到AD前面都是 LCD的驱动程序

void lcd_wait(void) {

DATAPORT=0xff; //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色 LCM_EN=1;

LCM_RS=0; LCM_RW=0; LCM_RW=1; _nop_(); _nop_(); _nop_(); _nop_();

_nop_(); _nop_(); _nop_();

while(DATAPORT&BUSY) { LCM_EN=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LCM_EN=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } LCM_EN=0; }

/**********写指令到LCM子函数************/ void WriteCommandLCM(uchar WCLCM,uchar BusyC) {

if(BusyC) lcd_wait(); DATAPORT=WCLCM;

LCM_RS=0; // 选中指令寄存器 LCM_RW=0;

LCM_RW=0; // 写模式 LCM_EN=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LCM_EN=0; }

/**********写数据到LCM子函数************/

void WriteDataLCM(uchar WDLCM) {

lcd_wait( ); //检测忙信号 DATAPORT=WDLCM;

LCM_RS=1; // 选中数据寄存器 LCM_RW=0; // 写模式 LCM_EN=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LCM_EN=0; }

/****显示指定坐标的一个字符子函数****/

void DisplayOneChar(uchar X,uchar Y,uchar DData) {

Y&=0x01; X&=0x0f; if(Y)

X|=0x40; //若y为1(显示第二行),地址码+0X40 X|=0x80; //指令码为地址码+0X80 WriteCommandLCM(X,1); WriteDataLCM(DData); }

/*******显示指定坐标的一串字符子函数*****/

void DisplayListChar(uchar X,uchar Y,uchar code *DData) {

uchar ListLength=0; Y&=0x01; X&=0x0f; while(X<16) {

DisplayOneChar(X,Y,DData[ListLength]); ListLength++; X++; } }

/**********LCM初始化子函数***********/ void initLCM( ) {

LCM_EN=0; DATAPORT=0; delay(15);

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 delay(5);

WriteCommandLCM(0x38,0); delay(5);

WriteCommandLCM(0x38,0); delay(5);

WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号 WriteCommandLCM(0x08,1); //关闭显示,检测忙信号 WriteCommandLCM(0x01,1); //清屏,检测忙信号

WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号

WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号 }

/*****************读电压**********************/ //AD转换的驱动程序,就这一部分 void ADC0809() {

AD_ALE=1; //锁存输入通道 _nop_();_nop_();

START=0; //驱动AD转换 START=1; AD_ALE=0;

_nop_();_nop_();

START=0; //保持低电平

while(EOC==0); //等待AD转换结束

// TR0=0; //AD转换结束时先停止T0 P1=0xff;

OE=1; //转换结束,允许AD值输出 getdata=P1; //读出AD值. OE=0; //禁止输出

getdata=(unsigned long int)((unsigned long int)(getdata*500)/255);//转换成电压

// TR0=1; //重新启动T0 }

因篇幅问题不能全部显示,请点此查看更多更全内容

Top