[便携式脉搏测试仪]脉搏测试仪
第三届电子技术基本技能大赛题目:便携式脉搏测试仪
参赛学院: 信息科学与工程学院 参赛学生: gui
专业班级: 测控技术与仪器1004班
时间: 2012年11月1日
便携式脉搏测试仪设计制作
摘要
课题任务是设计制作了一个能够测试人体脉搏跳动的便携式脉搏测试仪。本设计是通过反射式光电传感器采集人体手指脉搏信号,然后通过两级低通放大电路进行放大,再经过电压比较器整形得到要求的方波信号,然后把方波信号输入到AT89s51单片机中,通过使用单片机来实现系统最核心的计算脉搏功能并在液晶屏12864上显示出一分钟的脉搏次数。
关键词:脉搏测试、单片机、液晶屏、传感器
一、系统方案
1.整体方案
系统由红外发射管驱动电路、红外接收电路、信号放大滤波电路、模拟—数字信号转换电路、显示电路完成对人体脉搏频率的测试。红外二极管发射出来的红外光照到人体手指反射后,红外接收管将接收到的反射光信号转化为微弱的电信号,经过两级低通放大,滤掉高频干扰,用1uF电容滤掉直流分量。这样得到的电信号并不是规则的波形,然后用电压比较器整形得到方波信号,接入单片机进行处理。然后通过keil软件编程仿真,使单片机计算出一分钟脉搏的次数并在12864上显示出脉搏次数。 系统框图
2.脉搏信号采集电路传感器的选择
赛题要求设计制作光电脉搏探头,发射红外光或红光作为探测信号,照射到指尖等人体组织后,接收其透射或反射信号。
方案一;选择投射式光电传感器; 方案二;选择反射式光电传感器;
比较与选择;因为条件的原因选择方案二。 3.放大滤波电路滤波器的选择
赛题要求设计制作脉搏信号调理电路与信息处理电路,测量并显示被测人每分钟脉搏次数,以医学仪器产品同时测量值为对照,测量误差不大于±3次。并且测试仪能在白天室内日常亮度环境下正常工作。
方案一:传统分立元件RC组成无源滤波器。通过模拟开关选择不同的RC来控制不同的截止频率、品质因数等特性参数,但是它存在带内不平坦、频带范围窄且恒定、结构复杂等缺点。
方案二:运算放大器构成有源滤波器。通过集成运算放大器与不同的R、C组成滤波器,能够过选择不同的RC网络来实现截止频率和品质因数可变的高通、低通滤波器的设计。
方案比较:与无源滤波器相比,有源滤波器优势明显,因此选择方案二。 4.显示模块选择
方案一:采用LCD1602作为系统显示器件,5V供电,操作简单,但显示的内容较少,无法显示曲线,不能达到题目要求。
方案二:采用LCD12864液晶显示,可视面积大,画面效果好,抗干扰能力强,调用方便简单,而且可以节省了软件中断资源。其缺点在于显示内容需要存储字模信息,需要一定存储空间。由于作为控制器的单片机有足够的存储空间,存储字模数据绰绰有余。
方案比较:一方案不能满足题目要求,方案二显示内容全面,因此选择方案
二、电子元件
三、理论分析与计算
1.光电发射接收参数分析与计算
红外发射管通过的最大电流为50mA;接收管的VCE=2V; 2.脉搏信号参数分析
脉搏的范围是40~200下/s,频率为0.66~3.33Hz。 3.信息采样与处理参数分析与计算
经过测量和计算,光电接受电路接受到的信号幅值为1mV。
两级低通滤波放大电路的放大倍数为1000倍,通频带为0Hz到4.82Hz;通过1uF电容滤掉直流分量;
通过电压比较器将模拟信号转化为数字信号;
四、电路与程序设计
1.电路部分
(1)红外发射管驱动电路
(2)红外接收管电路
(3)低通滤波电路
4)A/D转换电路
(
2.程序部分
(1)用定时器中断精确计时;
(2)脉搏趋于稳定时,自动启动计时;
(3)可预置脉搏次数上下告警门限,当脉搏次数测量值超出告警限时,测试仪告警。
五、测试方案与测试结果
1.测试仪器与设备
3.6V直流电源、数字万用表、数字示波器。 2 .测试环境
整机系统测试在室内进行,使用环氧树脂底板作为硬件载体,以Atmel89s51单片机作为主控制器,使用液晶显示测量数据,软件使用Keil3作为开发环境。 3.测试方法和过程
确保测试仪电路连接正确后上电,食指指尖接触反射型光电探测器 RPR220,红外接收电路采纳到信号,两级低通放大电路会将此信号转化为幅值为1V的电压信号,通过电压比较器转化为方波信号,经单片机处理,在12864液晶屏上显示脉搏数,仔细观察脉搏增长情况,若增长情况持续稳定,则无漏测和多侧情况。 4.结果分析
测试仪传感器采用反射式光电传感器,灵敏度高,通过接收手指间反射的光信号强弱间接测试出人体脉搏的跳动频率,但与医学测试仪对比,还是有一定的误差。误差来源有:(1)人的手指的透光度不同;(2)在测量时,手指会有一定的抖动;(2)外界光线干扰,噪声干扰,电磁波干扰。若排除偶然误差,就可以满足题目要求,还需要许多改进的地方。
程序
#include #include
#define uchar unsigned char #define uint unsigned int sbit rs=P2^4; sbit w=P1^0; sbit u=P3^0; sbit v=P3^1; sbit uu=P3^4; sbit vv=P3^5; sbit rw=P2^5; sbit E=P2^6; sbit psb=P2^7;
uchar table[]="脉搏:"; uint a[3]={0,0,0},t=0,g=0; uchar table2[]="时间:"; uchar tabl2[]="脉搏异常"; uchar tabll2[]="脉搏正常"; uint b[3]={0,0,0},m=0,s=0; uchar tabler[]="下限:";
uint aa[3]={0,0,0},tt=0,ttt=0; uchar tabler2[]="上限:"; uchar hou[]="调试中"; uchar hou1[]="工作中";
uint bb[3]={0,0,0},mm=160,mmm=80; void write_12864com(uchar com); void write_12864dat(uchar dat); void initinal(void); void display(void); void display1(void); void display3(void); void displayr(void); void displayr1(void); void f(void); void k(void); void ff(void); void kk(void);
void delay_50us (uint t) {
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--); }
void delay_50ms (uint t) {
uchar j;
for(;t>0;t--)
for(j=6245;j>0;j--); }
void main(void) {
int r=0,h=0,c=0,dd=0; int rr=0,hh=0; int rrr=0,hhh=0; TMOD=0X01;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1;
initinal(); ff(); kk();
display3(); while(1) {
k(); if(c!=s) {
display3(); c=s; }
if(uu==1) rr=1; else hh=1; if(rr*hh==1) {
tt++; rr=0; hh=0; ff();
display3(); } if(vv==1) rrr=1; else
hhh=1;
if(rrr*hhh==1) {
mm++; rrr=0; hhh=0; kk();
display3(); }
r=1; else h=1; if(r*h==1) {
t++; r=0; h=0; f();
display3(); }
if(s==5) {
if(g=10) {
s=0;m=0;g=0;t=0; } }
if(s==10) {
if(g=20) {
s=0;m=0;g=0;t=0; } }
if(s
displayr(); }
if(s>5&&dd==1) { dd=0;
displayr1();
if(w==1)
}
if(s==60) {
if(g=ttt) display1(); else
display(); while(1); } if(u==0)t=0; if(v==0)s=0; } }
void write_12864com(uchar com) {
rw=0; rs=0;
delay_50us (1); P0=com; E=1;
delay_50us (10); E=0;
delay_50us (2); }
void write_12864dat(uchar dat) {
rw=0; rs=1;
delay_50us (1); P0=dat; E=1;
delay_50us (10); E=0;
delay_50us (2); }
void initinal(void) {
delay_50ms(2);
write_12864com(0x30); delay_50us(4);
write_12864com(0x30); delay_50us(4);
write_12864com(0x0f); delay_50us(4);
write_12864com(0x01); delay_50us(240);
write_12864com(0x06); delay_50us(1);
}
void f(void)
{
uint x,y,z;
g=t/2;
x=g/100;
y=(g-x*100)/10;
z=g%10;
a[0]=x;
a[1]=y;
a[2]=z;
}
void ff(void)
{
uint x,y,z;
ttt=tt/2;
x=ttt/100;
y=(ttt-x*100)/10;
z=ttt%10;
aa[0]=x;
aa[1]=y;
aa[2]=z;
}
void kk(void)
{
uint x,y,z;
mmm=mm/2;
x=mmm/100;
y=(mmm-x*100)/10;
z=mmm%10;
bb[0]=x;
bb[1]=y;
bb[2]=z;
}
void k(void)
{
uint x,y,z;
if(m==20)
{
s++;
m=0;
}
x=s/100;
y=(s-x*100)/10;
z=s%10;
b[0]=x;
b[1]=y;
b[2]=z;
}
void timer0() interrupt 1 {
TH0=(65536-50000)/256; TL0=(65536-50000)%256; m++;
}
void display3(void)
{
char i;
char j=1;
write_12864com(0x80);
delay_50us(1); for(i=0;i
{
write_12864dat(table[i]); delay_50us(1);
}
for(i=0;i
{
write_12864dat(a[i]+0x30); delay_50us(1);
}
for(i=0;i
{
write_12864dat(table2[i]); delay_50us(1);
}
for(i=0;i
{
write_12864dat(b[i]+0x30); delay_50us(1);
}
write_12864com(0x90);
delay_50us(1); for(i=0;i
write_12864dat(tabler[i]); delay_50us(1);
}
for(i=0;i
{
write_12864dat(aa[i]+0x30); delay_50us(1);
}
for(i=0;i
{
write_12864dat(tabler2[i]); delay_50us(1);
}
for(i=0;i
{
write_12864dat(bb[i]+0x30); delay_50us(1);
}
}
void display(void)
{
char i;
char j=1;
write_12864com(0x80);
delay_50us(1); for(i=0;i
{
write_12864dat(table[i]); delay_50us(1);
}
for(i=0;i
{
write_12864dat(a[i]+0x30); delay_50us(1);
}
for(i=0;i
{
write_12864dat(tabl2[i]); delay_50us(1);
}
write_12864com(0x90);
delay_50us(1); for(i=0;i
write_12864dat(tabler[i]); delay_50us(1);
}
for(i=0;i
{
write_12864dat(aa[i]+0x30); delay_50us(1);
}
for(i=0;i
{
write_12864dat(tabler2[i]); delay_50us(1);
}
for(i=0;i
{
write_12864dat(bb[i]+0x30); delay_50us(1);
}
}
void display1(void)
{
char i;
char j=1;
write_12864com(0x80);
delay_50us(1); for(i=0;i
{
write_12864dat(table[i]); delay_50us(1);
}
for(i=0;i
{
write_12864dat(a[i]+0x30); delay_50us(1);
}
for(i=0;i
{
write_12864dat(tabll2[i]); delay_50us(1);
}
write_12864com(0x90);
delay_50us(1); for(i=0;i
write_12864dat(tabler[i]); delay_50us(1);
}
for(i=0;i
{
write_12864dat(aa[i]+0x30); delay_50us(1);
}
for(i=0;i
{
write_12864dat(tabler2[i]); delay_50us(1);
}
for(i=0;i
{
write_12864dat(bb[i]+0x30); delay_50us(1);
}
}
void displayr(void)
{
char i;
write_12864com(0x88);
delay_50us(1); for(i=0;i
{
write_12864dat(hou[i]); delay_50us(1);
}
}
void displayr1(void)
{
char i;
write_12864com(0x88);
delay_50us(1); for(i=0;i
{
write_12864dat(hou1[i]); delay_50us(1);
}
}