完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1.功能原理
脉搏传感器采样脉搏信号,采用STC89C51单片机作为控制器,脉搏传感器输出方波传入单片机,触发单片机进去外部中断函数,每接收一个脉冲波形,显示屏就计数一次。如果脉搏次数超过设定值是,用蜂鸣器报警提示。 2.硬件设计 (1)总体硬件框图 (2)心率检测电路原理 心率检测电路是以红外反射式传感器ST188为检测原件,并利用单片机系统内部定时器来计算时间。 心率检测处理电路 此电路采用两级运算放大电路,一级放大倍数为可调,二级放大倍数固定为2。当红外反射式传感器ST188感应到一个完整的脉搏,便产生一个脉冲,单片机通过对脉冲累加得到脉搏心率跳动次数,并使用定时器计数脉搏的频率。系统运行中能显示脉搏心率次数和时间,系统停止运行时,能够显示总的脉搏心率次数和时间。 (3)其他硬件电路 除了主要的心率检测电路外,还包括单片机最小系统、LCD1602显示屏电路、蜂鸣器报警电路。因为这几个电路比较常用,就省略不介绍了。 3.程序设计 (1)LCD1602驱动程序 ***it RS = P2^5;//Pin4 ***it RW = P2^6; //Pin5 ***it E = P2^7;//Pin6 #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar data TimeNum[]=" "; uchar data Test1[]=" "; void DelayUs(unsigned char us)//delay us { unsigned char uscnt; uscnt=us>>1;/* Crystal frequency in 12MHz*/ while(--uscnt); } /******************************************************************/ void DelayMs(unsigned char ms)//delay Ms { while(--ms) { DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); } } void WriteCommand(unsigned char c) { DelayMs(5);//short delay before operation E=0; RS=0; RW=0; _nop_(); E=1; P1=c; E=0; } /****************************************************************/ void WriteData(unsigned char c) { DelayMs(5); //short delay before operation E=0; RS=1; RW=0; _nop_(); E=1; P1=c; E=0; RS=0; } /*********************************************************************/ void ShowChar(unsigned char pos,unsigned char c) { unsigned char p; if (pos>=0x10) p=pos+0xb0; //是第二行则命令代码高4位为0xc else p=pos+0x80; //是第二行则命令代码高4位为0x8 WriteCommand (p);//write command WriteData (c); //write data } /*************************************************************************/ void ShowString (unsigned char line,char *ptr) { unsigned char l,i; l=line<<4; for (i=0;i<16;i++) ShowChar (l++,*(ptr+i));//循环显示16个字符 } /*********************************************************************/ void InitLcd() { DelayMs(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //显示光标移动位置 WriteCommand(0x0c); //显示开及光标设置 WriteCommand(0x01); //显示清屏 } (2)脉搏检测处理程序 unsigned int i,n,ci,dd[11],jj,j,k,tmp; bit w=0; uchar bh; ulong time; ***it spd = P2^0; external0() interrupt 0//外部中断服务程序 { w=~w; if(w==0) { EX0=0; ET0=1; TH0=0x0; TL0=0x0; n=0; } else { time=n*65536+TH0*256+TL0; dd[jj]=30000000/time; //计算脉搏时间 jj++; if(jj>10) { jj=0; for(j=0;j<11;j++) for(k=0;k<11-j;k++) { if(dd[k]>dd[k+1]) { tmp=dd[k]; dd[k]=dd[k+1]; dd[k+1]=tmp; } } if(dd[5]>50&&dd[5]<200)ci=((dd[4]+dd[5]+dd[6])/3)+11; } TH0=0x0; TL0=0x0; n=0; } } void timer0(void) interrupt 1 { n++; } (3)主函数 void main(void) { InitLcd();// DelayMs(15); IT0=1; //INT0下降沿中断 EX0=1; //允许INT1中断 TMOD=0x1; TH0=0x0; TL0=0x0; TR0=1; ET0=1; EA=1; while(1) { if(n>10) { n=0; jj=0; ci=0; TimeNum[0]='N'; TimeNum[1]='O' ; TimeNum[2]=' ' ; TimeNum[3]='I' ; TimeNum[4]='N' ; TimeNum[5]='P' ; TimeNum[6]='U' ; TimeNum[7]='T' ; TimeNum[8]=' ' ; ShowString(0,TimeNum); ShowString(1,Test1); } else { if(w==0&&EX0==0) { delay(); EX0=1; } TimeNum[0]=' '; TimeNum[1]=' ' ; TimeNum[2]=' ' ; TimeNum[3]=' ' ; TimeNum[4]=' ' ; TimeNum[5]=' ' ; if(ci/100>0)TimeNum[6]=ci/100+'0' ; else TimeNum[6]=' ' ; if(ci/100==0&&ci%100/10>0)TimeNum[7]=ci%100/10+'0' ; else TimeNum[7]=' ' ; TimeNum[8]=ci%10+'0' ; ShowString(0,TimeNum); ShowString(1,Test1); if(ci>100)spd=0;else spd=1; } } ; } |
|
|
|
只有小组成员才能发言,加入小组>>
2545 浏览 0 评论
1143浏览 2评论
743浏览 1评论
496浏览 0评论
257浏览 0评论
419浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 11:52 , Processed in 1.388913 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号