|
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++;
- }
- }*/
復制代碼
|
|