找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 20446|回复: 18
收起左侧

51单片机+ST188光电传感器心率脉搏检测程序+电路图

  [复制链接]
ID:514753 发表于 2019-4-17 16:57 | 显示全部楼层 |阅读模式
使用时把右手食指指肚放在st188反射式红外传感器上,放置合适时会看到指示灯随心跳同时闪动,如果没有闪烁请适当调节手指压力,调节完后在测试过程中手指压力不要变,保持稳定,当指示灯有规律闪烁时表示信号正确。当单片机检测到大约第五次信号时开始显示这五次信号算出的平均心率。当超过大约1.5秒没有检测到信号,清除心率。
如果手指抖动或者不稳定会看到指示灯乱闪,这样测得的数据不准,在测试过程中保持稳定!

1:初始化液晶和定时器
2:检测外部中断,并记录中断时间间隔
3:当有超过5个符合要求的时间记录,算出5个时间的平均值和对应的60s的心率并显示
4:当超过1.5s没有检测到中断发生停止显示
2-3-4循环

电路原理图如下:
0.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit rs=P1^0;                             //数据与命令选择控制引脚
  5. sbit rw=P1^1;                                 //读与写选择控制引脚
  6. sbit en=P1^2;                                 //使能择控制引脚
  7. sbit bf=P0^7;                                 //忙标志位

  8. sbit P32=P3^2;

  9. unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
  10. unsigned int time[6]={0};

  11. /************ 延时函数  *****************/
  12. void delay(uint z)
  13. {
  14.    while(z--);
  15. }
  16. /************ 忙检测函数  *****************/
  17. void jiance()
  18. {
  19.   P0=0xff;
  20.   rs=0;rw=1;en=1;
  21.   while(bf);                        //如果BF==1表示液晶在忙
  22.   en=0;
  23. }
  24. /************ 写命令函数  *****************/
  25. void write_com(uchar com)
  26. {
  27.    jiance();
  28.    P0=com;
  29.    rs=0;rw=0;en=1;
  30.    delay(2);
  31.    en=0;
  32. }
  33. /************ 写数据函数  *****************/
  34. void write_dat(uchar dat)
  35. {
  36.    jiance();
  37.    P0=dat;
  38.    rs=1;rw=0;en=1;
  39.    delay(2);
  40.    en=0;
  41. }
  42. /************ 1602液晶初始化函数  *****************/
  43. void init_lcd()
  44. {
  45.    write_com(0x38);           // 设置16*2显示,5*7点阵,8位数据接口
  46.    write_com(0x0c);           // 开显示,不显示光标
  47.    write_com(0x06);           // 地址加1,当写入数据的时候光标右移
  48.    write_com(0x01);           //清屏
  49. }

  50. /******************************************************************/
  51. /*                   在指定位置写字符                                 */
  52. /******************************************************************/
  53. void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data)
  54. {     
  55.     if (y == 0)  
  56.     write_com(0x80 + x);     
  57.     else     
  58.     write_com(0xC0 + x);            
  59.     write_dat(Data);  
  60. }
  61. void DelayMs(unsigned int z)
  62. {
  63.    unsigned int x;
  64.    for(;z>0;z--)
  65.      for(x=110;x>0;x--);
  66. }         
  67. void main()
  68. {
  69.                 P32=1;
  70.                 init_lcd();//lcd初始化
  71.                 TCON=0x01;//设置外部中断0
  72.                 EX0=1;
  73.                 TMOD=0x01;//定时器0初始化
  74.                 TH0=(65536-50000)/256;//实测每50ms中断的定时值
  75.                 TL0=(65536-50000)%256;
  76.                 ET0=1;//开定时器中断
  77.                 //显示基本文字
  78.                 LCD_write_char(3,0,'H');
  79.                 LCD_write_char(4,0,'e');
  80.                 LCD_write_char(5,0,'a');
  81.                 LCD_write_char(6,0,'r');
  82.                 LCD_write_char(7,0,'t');
  83.                 LCD_write_char(8,0,' ');
  84.                 LCD_write_char(9,0,'R');
  85.                 LCD_write_char(10,0,'a');
  86.                 LCD_write_char(11,0,'t');
  87.                 LCD_write_char(12,0,'e');

  88.                 LCD_write_char(8,1,'/');
  89.                 LCD_write_char(9,1,'m');
  90.                 LCD_write_char(10,1,'i');
  91.                 LCD_write_char(11,1,'n');
  92.                 TR0=0;//定时器停止
  93.                 EA=1;//开总中断
  94.                 while(1)
  95.                 {
  96.                                 
  97.                                 if(displayOK==1)
  98.                                 {
  99.                                                 rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
  100.                                                 LCD_write_char(5,1,rate/100+48);
  101.                                                 LCD_write_char(6,1,(rate%100)/10+48);
  102.                                                 LCD_write_char(7,1,rate%10+48);
  103.                                 }
  104.                                 DelayMs(300);
  105.                 }
  106. }

  107. void ex0() interrupt 0
  108. {
  109.                 EX0=0;//暂时关外部中断
  110.                 if(timecount<8)   //当连续两次检测时间间隔小于8*50ms=400ms不处理
  111.                 {
  112.                                 TR0=1;//开定时器
  113.                 }
  114.                 else
  115.                 {
  116.                                 time[i]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间
  117.                                 TL0=(65536-50000)%256;//重新设置定时器
  118.                                 TH0=(65536-50000)/256;
  119.                                 timecount=0;//50ms计数清零
  120.                                 i++;
  121.                                 if(i==6)//记录到超过等于6次时间
  122.                                 {
  123.                                                 i=1;//计数从1开始
  124.                                                 displayOK=1;    //测得5次开始显示
  125.                                 }        
  126.                                 
  127.                 }
  128.                 EX0=1;
  129. }
  130. void et0() interrupt 1
  131. {
  132.                 TL0=(65536-50000)%256;
  133.                 TH0=(65536-50000)/256;
  134.                         
  135.                 timecount++;//每50ms一次计数
  136.                 if(timecount>25)     //当超过25*50ms=1.25s没有检测到信号停止显示
  137.                 {
  138.                                 i=0;//数据个数清零
  139.                                 timecount=0;//50ms计数清零
  140.                                 displayOK=0;//显示关
  141.                                 TR0=0;//定时器关
  142.                                 TH0=(65536-50000)/256;
  143.                                 TL0=(65536-50000)%256;
  144.                 }
  145. }
复制代码

所有资料51hei提供下载:
心率脉搏计源程序.rar (34.39 KB, 下载次数: 400)

评分

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

查看全部评分

回复

使用道具 举报

ID:524107 发表于 2019-4-28 23:45 | 显示全部楼层
楼主,你好,按照你给的原理图和程序,做出了实物,为什么没有反应啊?
回复

使用道具 举报

ID:524107 发表于 2019-4-28 23:46 | 显示全部楼层
楼主,你好,按照你给的原理图和程序,做出了实物,为什么没有反应?
回复

使用道具 举报

ID:573032 发表于 2019-6-28 09:25 | 显示全部楼层
源程序不对啊,下载不行
回复

使用道具 举报

ID:284488 发表于 2019-6-29 22:28 | 显示全部楼层
哇!下载后无法打开
回复

使用道具 举报

ID:328014 发表于 2019-6-30 01:18 | 显示全部楼层
lon7085 发表于 2019-6-29 22:28
哇!下载后无法打开

您用的什么软件解压的?我用winrar最新版貌似没问题
回复

使用道具 举报

ID:284488 发表于 2019-6-30 11:30 | 显示全部楼层
我用7-zip,了,用您说的winrar试看看,谢谢您
回复

使用道具 举报

ID:69115 发表于 2019-8-14 00:32 | 显示全部楼层
这个电路挺好,有实用价值.
回复

使用道具 举报

ID:599701 发表于 2019-8-15 18:34 | 显示全部楼层
真好 很有实用价值
回复

使用道具 举报

ID:616026 发表于 2019-9-25 13:55 | 显示全部楼层
可以呀,谢谢啦
回复

使用道具 举报

ID:571461 发表于 2019-12-24 08:45 | 显示全部楼层
if(displayOK==1)
                                {
                                                rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
                                                LCD_write_char(5,1,rate/100+48);
                                                LCD_write_char(6,1,(rate%100)/10+48);
                                                LCD_write_char(7,1,rate%10+48);
                                }我不太懂这一点的程序的运算是怎么出来的
回复

使用道具 举报

ID:651495 发表于 2019-12-27 10:02 来自手机 | 显示全部楼层
你好,这大概测一次需要多久呢
回复

使用道具 举报

ID:651495 发表于 2019-12-28 10:10 来自手机 | 显示全部楼层
xiexugang 发表于 2019-8-14 00:32
这个电路挺好,有实用价值.

你好,请问资料能分享一份么,上面的不能用了
回复

使用道具 举报

ID:525137 发表于 2020-3-8 18:55 | 显示全部楼层
你好楼主st188不是非接触吗,为啥要接触,检测距离4-13mm
回复

使用道具 举报

ID:705967 发表于 2020-3-21 21:13 | 显示全部楼层
非常详细。适合学习
回复

使用道具 举报

ID:705967 发表于 2020-4-5 20:37 | 显示全部楼层
您好,里面有仿真电路图吗
回复

使用道具 举报

ID:891632 发表于 2021-3-25 14:59 | 显示全部楼层
你好,为什么心率计算的时候需要+48呢?
回复

使用道具 举报

ID:891632 发表于 2021-3-25 14:59 | 显示全部楼层
你好,为什么心率计算要加48呢?
回复

使用道具 举报

ID:905400 发表于 2021-4-14 10:10 | 显示全部楼层
这里面的电容是点解电容吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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