可以用上位機控制。
使用pulsesensor傳感器。
具體算法是:在AD里面檢測波峰,記錄一分鐘有多少個波峰,從而計算出心率。
0.png (4.92 KB, 下載次數: 38)
下載附件
2019-3-14 20:28 上傳
單片機源程序如下:
- #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)
2019-3-13 09:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|