標(biāo)題:
51單片機(jī)簡單心率計(jì)源程序 紅外對(duì)管檢測(cè)脈搏跳變
[打印本頁]
作者:
曉的笙歌
時(shí)間:
2017-5-8 23:26
標(biāo)題:
51單片機(jī)簡單心率計(jì)源程序 紅外對(duì)管檢測(cè)脈搏跳變
51單片機(jī)測(cè)心率。紅外對(duì)管檢測(cè)脈搏跳變
#include "reg52.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
//-----------------------------------------------
/* define constants */
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000) //1ms timer calculation method in 12T mode
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
/* define SFR */
sbit LED = P1^0; //work LED, flash once per second
sbit LED2 = P1^1;
sbit heart = P3^2;
WORD Heart_num =0 ; //心率計(jì)時(shí)
bit UP_FLAG = 0;
float pp=0;
/*------------------------------------------------
函數(shù)聲明
------------------------------------------------*/
void SendByte(unsigned char dat);
void SendStr(unsigned char *s);
/*數(shù)碼管*/
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x7};
void delayms(uint);
void dis(uchar shi,uchar ge)
{
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delayms(5) ;
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*------------------------------------------------
串口初始化
------------------------------------------------*/
/*
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝
TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打開
EA = 1; //打開總中斷
}
*/
//-----------------------------------------------
/* main program */
void main()
{
uchar a,b;
unsigned int dum=0 ;
unsigned int sum = 0,num =0;
IT0 = 1; //set INT0 int type (1:Falling 0:Low level)
EX0 = 1; //enable INT0 interrupt
TMOD = 0x01; //set timer0 as mode1 (16-bit)
TL0 = T1MS; //initial timer0 low byte
TH0 = T1MS >> 8; //initial timer0 high byte
TR0 = 0; //timer0 start running
ET0 = 1; //enable timer0 interrupt
EA = 1; //open global interrupt switch
// InitUART();
while (1) //loop
{
if(Heart_num >= 500)//過濾高頻干擾 超過120HZ不開中斷
{
EX0 = 1; //enable INT0 interrupt
if(Heart_num >=1500)//超時(shí) 低于40HZ
{
TL0 = T1MS; //reload timer0 low byte
TH0 = T1MS >> 8; //reload timer0 high byte
TR0 = 0;
Heart_num=0;
UP_FLAG = 0;
num =0;
sum = 0;
}
}
if(UP_FLAG == 1)//監(jiān)測(cè)成功
{
num++;
sum+= Heart_num;
UP_FLAG = 0;
if(num == 8) //采樣8次
{ LED2= ~LED2;
sum = sum>>3;
pp=1000.0/sum ;
pp =pp*60;
sum = (unsigned int)pp;
dum=sum ;
num =0;
//SendByte (sum >>8);
//SendByte (sum);
sum = 0;
}
}
a=dum/10;
b=dum%10;
dis(a,b);
}
}
//External interrupt0 service routine
void exint0() interrupt 0 //(location at 0003H)
{
static bit UP =0 ;
if(UP==0)
{
TL0 = T1MS; //reload timer0 low byte
TH0 = T1MS >> 8; //reload timer0 high byte
Heart_num =0;
TR0 = 1;
EX0 = 0;//關(guān)閉中斷響應(yīng)
UP_FLAG = 0;
UP=1;
LED = 0;
}
else
{
TL0 = T1MS; //reload timer0 low byte
TH0 = T1MS >> 8; //reload timer0 high byte
TR0 = 0;
EX0 = 1;//中斷響應(yīng)
UP=0;
UP_FLAG = 1;
LED = 1;
}
}
// Timer0 interrupt routine 1ms
void tm0_isr() interrupt 1 using 1
{
TL0 = T1MS; //reload timer0 low byte
TH0 = T1MS >> 8; //reload timer0 high byte
Heart_num ++;
}
/*------------------------------------------------
發(fā)送一個(gè)字節(jié)
------------------------------------------------*/
/*void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}*/
/*------------------------------------------------
發(fā)送一個(gè)字符串
------------------------------------------------*/
/*void SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結(jié)束標(biāo)志,
//通過檢測(cè)是否字符串末尾
{
SendByte(*s);
s++;
}
}*/
復(fù)制代碼
作者:
優(yōu)化
時(shí)間:
2017-5-10 21:02
有脈搏傳感器部分電路資料嗎?求分享
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1