找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3842|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机简单心率计源程序 红外对管检测脉搏跳变

[复制链接]
跳转到指定楼层
楼主
ID:198134 发表于 2017-5-8 23:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
51单片机测心率。红外对管检测脉搏跳变
  1. #include "reg52.h"

  2. typedef unsigned char BYTE;
  3. typedef unsigned int WORD;

  4. //-----------------------------------------------

  5. /* define constants */
  6. #define FOSC  11059200L
  7.                         
  8. #define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode

  9. #define uchar unsigned char
  10. #define uint  unsigned int
  11. sbit dula=P2^6;
  12. sbit wela=P2^7;
  13. /* define SFR */
  14. sbit LED = P1^0;               //work LED, flash once per second
  15. sbit LED2 = P1^1;   
  16. sbit heart = P3^2;  
  17. WORD Heart_num =0 ; //心率计时
  18. bit UP_FLAG = 0;
  19. float pp=0;
  20. /*------------------------------------------------
  21.                    函数声明
  22. ------------------------------------------------*/
  23. void SendByte(unsigned char dat);
  24. void SendStr(unsigned char *s);


  25. /*数码管*/
  26. uchar code table[]={
  27. 0x3f,0x06,0x5b,0x4f,
  28. 0x66,0x6d,0x7d,0x07,
  29. 0x7f,0x6f,0x77,0x7c,
  30. 0x39,0x5e,0x79,0x7};
  31. void delayms(uint);
  32. void dis(uchar shi,uchar ge)
  33. {
  34.       dula=1;
  35.           P0=table[shi];
  36.           dula=0;
  37.           P0=0xff;
  38.           wela=1;
  39.           P0=0xef;
  40.           wela=0;
  41.           delayms(5);
  42.           dula=1;
  43.           P0=table[ge];
  44.           dula=0;
  45.           P0=0xff;
  46.           wela=1;
  47.           P0=0xdf;
  48.           wela=0;
  49.           delayms(5) ;
  50.           }
  51.             void delayms(uint xms)
  52.           {
  53.             uint i,j;
  54.                 for(i=xms;i>0;i--)
  55.                 for(j=110;j>0;j--);
  56.                 }
  57. /*------------------------------------------------
  58.                     串口初始化
  59. ------------------------------------------------*/
  60. /*
  61. void InitUART  (void)
  62. {
  63.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  64.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  65.     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
  66.     TR1   = 1;                  // TR1:  timer 1 打开                        
  67.     EA    = 1;                  //打开总中断
  68. }
  69. */
  70. //-----------------------------------------------

  71. /* main program */
  72. void main()
  73. {
  74.          uchar a,b;
  75.         unsigned int dum=0 ;
  76. unsigned int sum = 0,num =0;
  77.     IT0 = 1;                        //set INT0 int type (1:Falling 0:Low level)
  78.     EX0 = 1;                        //enable INT0 interrupt

  79.     TMOD = 0x01;                    //set timer0 as mode1 (16-bit)
  80.     TL0 = T1MS;                     //initial timer0 low byte
  81.     TH0 = T1MS >> 8;                //initial timer0 high byte
  82.     TR0 = 0;                        //timer0 start running
  83.     ET0 = 1;                        //enable timer0 interrupt
  84.     EA = 1;                         //open global interrupt switch

  85. //        InitUART();
  86.     while (1)                       //loop
  87.            {
  88.                 if(Heart_num >= 500)//过滤高频干扰        超过120HZ不开中断
  89.                 {
  90.                         EX0 = 1;                     //enable INT0 interrupt
  91.                     if(Heart_num >=1500)//超时          低于40HZ
  92.                         {
  93.                                 TL0 = T1MS;                     //reload timer0 low byte
  94.                                 TH0 = T1MS >> 8;                //reload timer0 high byte
  95.                                 TR0 = 0;
  96.                                 Heart_num=0;
  97.                                 UP_FLAG = 0;         
  98.                                 num =0;        
  99.                                 sum = 0;
  100.                         }           
  101.                 }
  102.                 if(UP_FLAG == 1)//监测成功
  103.                 {
  104.                     num++;
  105.                     sum+= Heart_num;
  106.                         UP_FLAG = 0;
  107.                         if(num == 8) //采样8次
  108.                         {        LED2= ~LED2;      
  109.                                 sum = sum>>3;
  110.                                 pp=1000.0/sum        ;
  111.                                 pp =pp*60;
  112.                                 sum = (unsigned int)pp;
  113.                                 dum=sum        ;
  114.                                 num =0;
  115.                                 
  116.                                 //SendByte (sum >>8);
  117.                             //SendByte (sum);
  118.                                 sum = 0;                 
  119.                         }
  120.                         
  121.                 }
  122.                             a=dum/10;
  123.                     b=dum%10;
  124.                     dis(a,b);

  125.         }
  126. }
  127. //External interrupt0 service routine
  128. void exint0() interrupt 0           //(location at 0003H)
  129. {
  130. static bit UP =0 ;
  131.     if(UP==0)
  132.     {
  133.                 TL0 = T1MS;                     //reload timer0 low byte
  134.                 TH0 = T1MS >> 8;                //reload timer0 high byte
  135.                 Heart_num =0;
  136.             TR0 = 1;
  137.                 EX0 = 0;//关闭中断响应
  138.                 UP_FLAG = 0;
  139.                 UP=1;
  140.                 LED = 0;
  141.         }
  142.         else
  143.         {
  144.                 TL0 = T1MS;                     //reload timer0 low byte
  145.                 TH0 = T1MS >> 8;                //reload timer0 high byte
  146.             TR0 = 0;
  147.                 EX0 = 1;//中断响应
  148.                 UP=0;
  149.                 UP_FLAG = 1;         
  150.                 LED = 1;        
  151.         }

  152. }
  153. // Timer0 interrupt routine  1ms
  154. void tm0_isr() interrupt 1 using 1
  155. {
  156.         TL0 = T1MS;                     //reload timer0 low byte
  157.         TH0 = T1MS >> 8;                //reload timer0 high byte
  158.     Heart_num ++;
  159. }
  160. /*------------------------------------------------
  161.                     发送一个字节
  162. ------------------------------------------------*/
  163. /*void SendByte(unsigned char dat)
  164. {
  165. SBUF = dat;
  166. while(!TI);
  167.       TI = 0;
  168. }*/
  169. /*------------------------------------------------
  170.                     发送一个字符串
  171. ------------------------------------------------*/
  172. /*void SendStr(unsigned char *s)
  173. {
  174. while(*s!='\0')// \0 表示字符串结束标志,
  175.                 //通过检测是否字符串末尾
  176.   {
  177.   SendByte(*s);
  178.   s++;
  179.   }
  180. }*/


复制代码











分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:194705 发表于 2017-5-10 21:02 | 只看该作者
有脉搏传感器部分电路资料吗?求分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表