锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2022-08-12 13:00:02 光电传感器挡住后不灭什么原因镜反射式光电传感器工作原理对射光电开关传感器感应开关exf5311光电传感器光电传感器lx111214111光电传感器

原地址:http://www.51hei.com/bbs/dpj-156743-1.html

相关文章

1、ST188----https://wenku.baidu.com/view/e31e9c956bec0975f465e258.html

使用时,将右手食指腹部放置st在188反射红外传感器上,您可以看到指示灯随意跳动并闪烁。如果没有闪烁,请适当调整手指压力。调整后,测试过程中不要改变手指压力,保持稳定。当指示灯定期闪烁时,表示信号正确。当单片机检测到大约第五个信号时,它开始显示五个信号计算的平均心率。当超过大约1.5秒钟内未检测到信号,以清除心率。
如果手指抖动或不稳定,指示灯会闪烁,所以测量的数据不准确,在测试过程中保持稳定!

1:初始化液晶和定时器
2:检测外部中断,记录中断间隔
3:当有5个以上的时间记录时,计算5个时间的平均值和相应的60s并显示心率
4:当超过1.5s未检测到中断停止显示
2-3-4循环

电路原理图如下:
0.png

单片机源程序如下:

  1. #include
  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==说明液晶很忙
  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.  
  89.                 LCD_write_char(8,1,'/');
  90.                 LCD_write_char(9,1,'m');
  91.                 LCD_write_char(10,1,'i');
  92.                 LCD_write_char(11,1,'n');
  93.                 TR0=0;//定时器停止
  94.                 EA=1;//开总中断
  95.                 while(1)
  96.                 {
  97.                                 
  98.                                 if(displayOK==1)
  99.                                 {
  100.                                                 rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
  101.                                                 LCD_write_char(5,1,rate/100+48);
  102.                                                 LCD_write_char(6,1,(rate%100)/10+48);
  103.                                                 LCD_write_char(7,1,rate%10+48);
  104.                                 }
  105.                                 DelayMs(300);
  106.                 }
  107. }
  108.  
  109. void ex0() interrupt 0
  110. {
  111.                 EX0=0;//暂时关外部中断
  112.                 if(timecount<8)   //当连续两次检测时间间隔小于8*50ms=400ms不处理
  113.                 {
  114.                                 TR0=1;//开定时器
  115.                 }
  116.                 else
  117.                 {
  118.                                 time[i]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间
  119.                                 TL0=(65536-50000)%256;//重新设置定时器
  120.                                 TH0=(65536-50000)/256;
  121.                                 timecount=0;//50ms计数清零
  122.                                 i++;
  123.                                 if(i==6)//记录到超过等于6次时间
  124.                                 {
  125.                                                 i=1;//计数从1开始
  126.                                                 displayOK=1;    //测得5次开始显示
  127.                                 }        
  128.                                 
  129.                 }
  130.                 EX0=1;
  131. }
  132. void et0() interrupt 1
  133. {
  134.                 TL0=(65536-50000)%256;
  135.                 TH0=(65536-50000)/256;
  136.                         
  137.                 timecount++;//每50ms一次计数
  138.                 if(timecount>25)     //当超过25*50ms=1.25s没有检测到信号停止显示
  139.                 {
  140.                                 i=0;//数据个数清零
  141.                                 timecount=0;//50ms计数清零
  142.                                 displayOK=0;//显示关
  143.                                 TR0=0;//定时器关
  144.                                 TH0=(65536-50000)/256;
  145.                                 TL0=(65536-50000)%256;
  146.                 }
  147. }
  148.  

复制代码


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

 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章