标题:
51单片机简单心率计源程序 红外对管检测脉搏跳变
[打印本页]
作者:
晓的笙歌
时间:
2017-5-8 23:26
标题:
51单片机简单心率计源程序 红外对管检测脉搏跳变
51单片机测心率。红外对管检测脉搏跳变
#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 ; //心率计时
bit UP_FLAG = 0;
float pp=0;
/*------------------------------------------------
函数声明
------------------------------------------------*/
void SendByte(unsigned char dat);
void SendStr(unsigned char *s);
/*数码管*/
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)//超时 低于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)//监测成功
{
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;//关闭中断响应
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;//中断响应
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 ++;
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
/*void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}*/
/*------------------------------------------------
发送一个字符串
------------------------------------------------*/
/*void SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串结束标志,
//通过检测是否字符串末尾
{
SendByte(*s);
s++;
}
}*/
复制代码
作者:
优化
时间:
2017-5-10 21:02
有脉搏传感器部分电路资料吗?求分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1