找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3585|回复: 5
收起左侧

基于51单片机+LabVIEW的脉搏心率计程序设计

[复制链接]
ID:488552 发表于 2019-3-13 09:34 | 显示全部楼层 |阅读模式
可以用上位机控制。
使用pulsesensor传感器。
具体算法是:在AD里面检测波峰,记录一分钟有多少个波峰,从而计算出心率。

0.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #include <stdio.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit dula=P2^6;
  7. sbit wela=P2^7;
  8. sbit adwr=P3^6;
  9. sbit adrd=P3^7;
  10. uchar flag,a;
  11. unsigned char flag_uart,flag_time,flag_on,a,i,t0_num,ad_val,rate,rate1;
  12. uchar x,y,z;
  13. float ad_vo;
  14. uchar code table1[]={
  15. 0x3f,0x06,0x5b,0x4f,
  16. 0x66,0x6d,0x7d,0x07,
  17. 0x7f,0x6f,0x77,0x7c,
  18. 0x39,0x5e,0x79,0x71};
  19. uchar code table2[]={
  20. 0xbf,0x86,0xdb,0xcf,
  21. 0xe6,0xed,0xfd,0x87,
  22. 0xff,0xef,0xf7,0xfc,
  23. 0xb9,0xde,0xf9,0xf1};
  24. void delayms(uint xms)
  25. {
  26.         uint i,j;
  27.         for(i=xms;i>0;i--)
  28.                 for(j=110;j>0;j--);
  29. }
  30. void init()
  31. {
  32. TMOD=0x21;
  33. SCON=0x50;
  34. TH0=(65536-45872)/256;
  35. TL0=(65536-45872)%256;
  36. TH1=0xfd;
  37. TL1=0xfd;
  38. TR1=1;
  39. ET0=1;
  40. SM0=0;
  41. SM1=1;
  42. REN=1;
  43. EA=1;
  44. ES=1;
  45. }
  46. void display(uchar value)
  47. {
  48. uchar bai,shi,ge;
  49. bai=value/100;
  50. shi=value%100/10;
  51. ge=value%10;
  52. dula=1;
  53. P0=table2[bai];
  54. dula=0;
  55. P0=0xff;
  56. wela=1;
  57. P0=0x7e;
  58. wela=0;
  59. delayms(5);
  60. dula=1;
  61. P0=table1[shi];
  62. dula=0;
  63. P0=0xff;
  64. wela=1;
  65. P0=0x7d;
  66. wela=0;
  67. delayms(5);
  68. dula=1;
  69. P0=table1[ge];
  70. dula=0;
  71. P0=0xff;
  72. wela=1;
  73. P0=0x7b;
  74. wela=0;
  75. delayms(5);
  76. }
  77. void display1(uchar value1)
  78. {
  79. uchar bai1,shi1,ge1;
  80. bai1=value1/100;
  81. shi1=value1%100/10;
  82. ge1=value1%10;
  83. dula=1;
  84. P0=table1[bai1];
  85. dula=0;
  86. P0=0xff;
  87. wela=1;
  88. P0=0x77;
  89. wela=0;
  90. delayms(5);
  91. dula=1;
  92. P0=table1[shi1];
  93. dula=0;
  94. P0=0xff;
  95. wela=1;
  96. P0=0x6f;
  97. wela=0;
  98. delayms(5);
  99. dula=1;
  100. P0=table1[ge1];
  101. dula=0;
  102. P0=0xff;
  103. wela=1;
  104. P0=0x5f;
  105. wela=0;
  106. delayms(5);
  107. }
  108. uchar get_ad()
  109. {
  110.      uchar adval;
  111.          adwr=1;
  112.          _nop_();
  113.          adwr=0;
  114.          _nop_();
  115.          adwr=1;
  116.          P1=0xff;
  117.          adrd=1;
  118.          _nop_();
  119.          adrd=0;
  120.          _nop_();
  121.          adval=P1;
  122.          adrd=1;
  123.      return adval;
  124. }
  125. void main()
  126. {
  127.      init();
  128.            x=0;

  129.           
  130.      wela=1;
  131.      P0=0x7f;
  132.      wela=0;
  133.      while(1)
  134.          {
  135.            if(flag_uart==1)
  136.                    {
  137.               flag_uart=0;
  138.                           ES=0;
  139.                           TI=1;
  140.               switch(flag_on)
  141.                           {
  142.                   case 0:
  143.                           TR0=1;
  144.                                                   break;
  145.                   case 1:
  146.                           TR0=0;
  147.                                                   break;
  148.                   case 2: puts( "Error!\n");
  149.                           break;
  150.               }
  151.               while(!TI);
  152.                           TI=0;
  153.                           ES=1;
  154.           }
  155.           if(flag_time==1)
  156.                   {   
  157.                       flag_time=0;
  158.           ad_val=get_ad()*500/256;
  159.                                   
  160.                                   ad_vo=(float)ad_val/100;
  161.                                   if(ad_val>=250)
  162.                                         {z=y;y=x;
  163.                                         rate=600/(y-z);}
  164.                                         if(rate>0&&rate>=60&&rate<=100)
  165.                                         {rate1=rate;}
  166.                                        
  167.                                                                                                                        
  168.                                        
  169.                                   
  170.                                        
  171.          
  172.                   ES=0;
  173.                   TI=1;
  174.                                
  175.           printf("%.2f\n",ad_vo);
  176.                   while(!TI);
  177.                   TI=0;
  178.                   ES=1;
  179.                
  180.                   }
  181.                         display(ad_val);
  182.                         if(rate>=60&&rate<=100)
  183.       display1(rate);       
  184.                              
  185.       else
  186.                         display1(rate1);
  187.                                                
  188.                   }
  189.                 }
  190. void timer0()interrupt 1
  191. {  
  192.        
  193.    TH0=(65536-45872)/256;
  194. ……………………

  195. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
心率脉搏计 文件夹.rar (40.31 KB, 下载次数: 81)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:544871 发表于 2019-5-22 18:40 | 显示全部楼层
所以LabVIEW的部分在哪里呢
回复

使用道具 举报

ID:210588 发表于 2019-6-21 08:11 | 显示全部楼层
有电路原理图吗
回复

使用道具 举报

ID:568556 发表于 2019-6-21 08:59 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:706441 发表于 2020-3-11 16:28 | 显示全部楼层

有电路图吗
回复

使用道具 举报

ID:410291 发表于 2020-4-12 11:08 | 显示全部楼层
你好,有线路连接图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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