可以用上位机控制。
使用pulsesensor传感器。
具体算法是:在AD里面检测波峰,记录一分钟有多少个波峰,从而计算出心率。
单片机源程序如下:
- #include <reg52.h>
- #include<intrins.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit dula=P2^6;
- sbit wela=P2^7;
- sbit adwr=P3^6;
- sbit adrd=P3^7;
- uchar flag,a;
- unsigned char flag_uart,flag_time,flag_on,a,i,t0_num,ad_val,rate,rate1;
- uchar x,y,z;
- float ad_vo;
- uchar code table1[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- uchar code table2[]={
- 0xbf,0x86,0xdb,0xcf,
- 0xe6,0xed,0xfd,0x87,
- 0xff,0xef,0xf7,0xfc,
- 0xb9,0xde,0xf9,0xf1};
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void init()
- {
- TMOD=0x21;
- SCON=0x50;
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- TH1=0xfd;
- TL1=0xfd;
- TR1=1;
- ET0=1;
- SM0=0;
- SM1=1;
- REN=1;
- EA=1;
- ES=1;
- }
- void display(uchar value)
- {
- uchar bai,shi,ge;
- bai=value/100;
- shi=value%100/10;
- ge=value%10;
- dula=1;
- P0=table2[bai];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0x7e;
- wela=0;
- delayms(5);
- dula=1;
- P0=table1[shi];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0x7d;
- wela=0;
- delayms(5);
- dula=1;
- P0=table1[ge];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0x7b;
- wela=0;
- delayms(5);
- }
- void display1(uchar value1)
- {
- uchar bai1,shi1,ge1;
- bai1=value1/100;
- shi1=value1%100/10;
- ge1=value1%10;
- dula=1;
- P0=table1[bai1];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0x77;
- wela=0;
- delayms(5);
- dula=1;
- P0=table1[shi1];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0x6f;
- wela=0;
- delayms(5);
- dula=1;
- P0=table1[ge1];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0x5f;
- wela=0;
- delayms(5);
- }
- uchar get_ad()
- {
- uchar adval;
- adwr=1;
- _nop_();
- adwr=0;
- _nop_();
- adwr=1;
- P1=0xff;
- adrd=1;
- _nop_();
- adrd=0;
- _nop_();
- adval=P1;
- adrd=1;
- return adval;
- }
- void main()
- {
- init();
- x=0;
-
- wela=1;
- P0=0x7f;
- wela=0;
- while(1)
- {
- if(flag_uart==1)
- {
- flag_uart=0;
- ES=0;
- TI=1;
- switch(flag_on)
- {
- case 0:
- TR0=1;
- break;
- case 1:
- TR0=0;
- break;
- case 2: puts( "Error!\n");
- break;
- }
- while(!TI);
- TI=0;
- ES=1;
- }
- if(flag_time==1)
- {
- flag_time=0;
- ad_val=get_ad()*500/256;
-
- ad_vo=(float)ad_val/100;
- if(ad_val>=250)
- {z=y;y=x;
- rate=600/(y-z);}
- if(rate>0&&rate>=60&&rate<=100)
- {rate1=rate;}
-
-
-
-
-
-
- ES=0;
- TI=1;
-
- printf("%.2f\n",ad_vo);
- while(!TI);
- TI=0;
- ES=1;
-
- }
- display(ad_val);
- if(rate>=60&&rate<=100)
- display1(rate);
-
- else
- display1(rate1);
-
- }
- }
- void timer0()interrupt 1
- {
-
- TH0=(65536-45872)/256;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
心率脉搏计 文件夹.rar
(40.31 KB, 下载次数: 81)
|