基于光电式简易心率测量仪.docx
《基于光电式简易心率测量仪.docx》由会员分享,可在线阅读,更多相关《基于光电式简易心率测量仪.docx(14页珍藏版)》请在冰豆网上搜索。
基于光电式简易心率测量仪
《单片机原理与应用及C51程序设计》
课程设计
题目电子时钟设计
学院机电与汽车工程学院
班级13级汽服一班
姓名王守瑞
学号20137040119
摘要
单片机作为微型计算机的一个分支,产生于20世纪70年代,经过二三十年的发展,在各行各业中已经广泛应用。
心率是指单位时间内心脏跳动的次数,一般指每分钟的心跳次数,是临床常规检查的生理指标。
心率测量仪在我们的日常生活中已经得到了非常广泛的应用。
在医学上,通过测量人的心率,便可初步判断人的健康状况。
当心脏泵血时,血液的粘稠度会改变,使得皮肤的透光性发生改变,因此可以通过测量皮肤的透光性变化来间接测量心率。
而对于皮肤的透光性,可使用光电系统来测量,然后将测量得到的信号经过放大,滤波,AD转换后送入AT89C52单片机系统进行信号处理,信号显示与记录。
该系统具有方便、显示直观、功耗低等优点。
关键词:
AT89C52发光二极管放大器滤波器AD
1.设计任务
心率是身体体征的重要参数之一,心率的测量由以前的把脉到现在的科学仪器测量,发生了重大变化,古时把脉只有医生才能做到,而现在的测量仪器一般只有医疗机构才有。
本设计主要是开发一款便携、简易的心率测量仪,实现普通群众在足不出户的情况下测量心率的目的。
1.1功能要求
心率测量仪用LCD液晶显示器显示出实时的心率,并用按键来控制实现1分钟和3分钟的测试。
1.2工作原理
本设计采用单片机AT89C52为控制核心,实现心率测量仪的基本测量功能。
当手指放在红外发射二极管和接收三极管中间,随着心脏的跳动,血管中血液的流量将发生变换,红外接收三极管的电流也跟着改变,这就使红外接收三极管输出信号。
该信号经放大、滤波、整形后输出,输出的信号作为单片机外部中断信号。
单片机电路对输入的信号进行计算处理之后把结果送到LCD液晶显示器显示。
1.3整体设计框图
2.系统硬件设计
2.1AT89C52简介
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
AT89C52除了有AT89C51所有的定时/计数器0和定时/计数器1外,还增加了一个定时/计数器2。
AT89C52单片机引脚图
AT89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xC52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0-P3为可编程通用I/O脚,其功能用途由软件定义。
P0口:
是双向8位三态I/O口,也即地址/数据总线复用口。
在访问外部数据存储器或程序存储器时,可分时用作低8位地址线和8位数据线;在FlashROM编程时,P0口接收(输入)指令字节;而在验证程序时,P0口输出指令字节。
P1口:
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
P2口:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
在访问外部程序存储器或16位地址的外部数据存储器时,P2送出高8位地址数据。
在访问8位地址的外部数据存储器时,P2口输出P2锁存器的内容。
P3口:
P3口是一个带有内部上拉电阻的8位双向I/O口。
P3口能驱动4个LSTTL门电路。
在单片机中这8个引脚都有各自的第二功能,而在实际工作中,大多情况下都使用P3口的第二功能。
RST:
复位信号输入端。
要保持RST脚两个机器周期以上的高电平时间,才能使单片机复位。
ALE/PROG:
地址锁存允许信号。
PSEN:
外部程序存储器的读选通信号。
EA/VPP:
当EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。
当EA端保持高电平时,此间CPU访问并执行内部程序存储器的指令。
2.1光源与传感器电路
将手指放在红外发射二极管和接收三极管中间,随着心脏的跳动,血管中血液的流量发生变换来采集信号。
P20与单片机P2.0引脚连接,控制LED的亮度。
2.2放大电路
放大器将LED采集来的信号进行放大、整形,传送到滤波器,由滤波器消除干扰,传送至单片机。
可通过查看示波器波形图检查电路是否出现问题。
2.3显示电路
显示电路是LCD和上拉电阻连接,由电源供电,D0-D7接单片机P0口,所以用上拉电阻拉至高电平。
2.4按键与指示灯电路
P21和P22分别与单片机P2.1和P2.2引脚连接,当开关S1按下时,指示灯D3点亮,进行1分钟测量。
当开关S2按下时,指示灯D2点亮,进行3分钟测量。
2.5硬件原理图
3.系统软件设计
3.1软件设计
系统软件采用模块化设计方法,每个功能由一个或多个函数实现,方便软件的调试,其中初始化主要完成1602的设置以及在1602屏幕上显示测试提示信息。
按键连接至单片机P2口,并且按键在常开状态时通过上拉电阻拉为高电平,所以在按下时,该引脚变为低电平。
3.2系统软件流程图
3.3C程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//这三个引脚参考资料
sbitE=P2^7;//1602使能引脚
sbitRW=P2^6;//1602读写引脚
sbitRS=P2^5;//1602数据/命令选择引脚
sbitCS=P1^0;//ADC0831
sbitCLK=P1^1;
sbitDO=P1^2;
uintTimeOver=0;
voiddelay()
{
inti,j;
for(i=0;i<=100;i++)
for(j=0;j<=20;j++);
}
voidenable(uchardel)
{
P0=del;
RS=0;
RW=0;
E=0;
delay();
E=1;
delay();
}
voidwrite(uchardel)
{
P0=del;
RS=1;
RW=0;
E=0;
delay();
E=1;
delay();
}
voidL1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
voidL1602_char(ucharhang,ucharlie,charsign)
{
uchara;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
enable(a);
write(sign);
}
voidL1602_uint(ucharhang,ucharlie,uintn)
{
L1602_char(hang,lie++,(n/1000)+'0');
L1602_char(hang,lie++,(n/100)%10+'0');
L1602_char(hang,lie++,(n/10)%10+'0');
L1602_char(hang,lie++,n%10+'0');
}
voidL1602_string(ucharhang,ucharlie,uchar*p)
{
uchara;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
enable(a);
while
(1)
{
if(*p=='\0')break;
write(*p);
p++;
}
}
ucharRead_ADC0831()//根据时序图写出的模拟数据输出
{
uchari,temp;
DO=1;
_nop_();
_nop_();
CS=0;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
for(i=0;i<8;i++)
{
CLK=1;
_nop_();
_nop_();
temp<<=1;
if(DO)
{
temp++;
}
CLK=0;
_nop_();
_nop_();
}
CS=1;
_nop_();
_nop_();
return(temp);
}
voidSet_Timer(ucharn)//50ms
{
TimeOver=n;
TMOD=0x01;
IE=0x82;
TH0=0x15;
TL0=0xA0;
TR0=1;
}
voidTime0_Int()interrupt1
{
TH0=0x15;
TL0=0xA0;
TimeOver--;//长度加1
}
voidTest_1min()
{
uintd1=0;
uintd2=0;
uintt;
ucharflag=0;
P2|=0X01;
Set_Timer(1200);
for(t=0;t<20;t++)
d1+=Read_ADC0831();
d1=d1/20;
t=0;
d2=Read_ADC0831();
if(d2>d1)
flag=1;
else
flag=0;
while(TimeOver)
{
d2=Read_ADC0831();
if(d2flag=0;
else
{
if(flag==0)
t++;
flag=1;
}
}
TR0=0;
L1602_uint(2,8,t);
}
voidTest_3min()
{
uintd1=0;
uintd2=0;
uintt;
ucharflag=0;
P2|=0X01;
Set_Timer(3600);
for(t=0;t<20;t++)
d1+=Read_ADC0831();
d1=d1/20;
t=0;
d2=Read_ADC0831();
if(d2>d1)
flag=1;
else
flag=0;
while(TimeOver)
{
d2=Read_ADC0831();
if(d2flag=0;
else
{
if(flag==0)
t++;
flag=1;
}
}
TR0=0;
L1602_uint(2,8,t);
}
voidTest_over()
{
P2=P2&0xfe;
L1602_string(1,1,"Testover");
}
voidTest()
{
if(!
(P2&0x02))
{
P2=P2|0x08;
L1602_string(1,1,"Mode:
1min");
Test_1min();
Test_over();
}
if(!
(P2&0x04))
{
P2=P2|0x10;
L1602_string(1,1,"Mode:
3min");
Test_3min();
Test_over();
}
}
voidMain()
{
P2=P2&0xfe;
L1602_init();
L1602_string(1,1,"BeginTest");
L1602_string(2,1,"Result:
");
while
(1)
{
Test();
P2=P2&(~0x18);
};
}
4.总结
本次所设计的测量系统实现简单、功能稳定、使用方便,应用广泛,具有实际意义。
由于时间比较短,同时掌握的知识有限,本次设计还存在很多不足,如程序不够简练,LCD显示部分不够完美等,同时此次设计的测量仪功能比较单一,没有如语音系统实现自动读出心跳次数等人性化功能,且在设计过程中使用的运放数量也较多,加大了电源管理的复杂度。
但我相信科技的进步势必会使测量仪的功能日益强大和完善,应用领域会不断扩大,会给我们的生活带来更多的方便和精彩。
为了更好的进行心率测量仪的设计,认真收集有关资料,并做相关的整理和阅读,为这次的设计做好充分的准备。
经过此次设计,我受益良多:
1.无论做什么事都应该事先做好充分的准备;2.了解了心率测量仪在国内外发展之迅速、应用领域之广、市场前景之大;3.对硬件设计和各模块的功能有了更深的了解,同时提高了动手能力;4.体会到坚持不懈的毅力对完成一件事情起着巨大的作用;5.体会到团队合作精神的重要性及相互讨论过程中的乐趣。
5.参考文献
[1]谢龙汉莫衍编著.Proteus电子电路设计及仿真.北京:
电子工业出版社,2012.1
[2]赵佩华眭碧霞主编.单片机原理及接口技术.北京:
机械工业出版社,2012.6
[3]谢维成杨加国主编.单片机原理与应用及C51程序设计.第二版.北京:
清华大学出版社,2012.10
[4]张元良王建军编著.单片机开发技术实例教程.北京:
机械工业出版社,2011.1
[5]张靖武周灵彬编著.单片机原理,应用与PROTEUS仿真.北京:
电子工业出版社,2010.1