找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5374|回复: 0
收起左侧

基于51单片机'ST188心率脉搏检测程序与原理图分享

[复制链接]
ID:274459 发表于 2021-1-9 20:02 | 显示全部楼层 |阅读模式
内含完整原理图设计、文档等

原理图

原理图
传感器的引脚图.png

元件清单:
51hei.png
元件型号    元件名称    元件标号
10uF    电容    C1
20PF    电容    C2, C3
10uF    电容    C4
1uF    电容    C5, C6
LED-R-3mm    指示灯    D1
LCD12864    液晶    LCD1
10K    可调电阻    RV1
10K    电阻    R2
330欧    电阻    R3, R4, R13
20K    电阻    R5, R6
10K    电阻    R7, R8
56k    电阻    R9
6.8K    电阻    R10
24K    电阻    R11
100K    电阻    R12
SW-PB    按键    S1
STC89C52    单片机    U1
ST188    光电开关    U2
LM358    放大器    U3
12M    晶振    Y1


单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535



  4. sbit rs=P2^5;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  5. sbit rw=P2^6;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  6. sbit e =P2^7;         //片选信号   下降沿触发

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


  9. /***********************1ms延时函数*****************************/
  10. void delay_1ms(uint q)
  11. {
  12.         uint i,j;
  13.         for(i=0;i<q;i++)
  14.                 for(j=0;j<120;j++);
  15. }

  16.                                           
  17. /************ 延时函数  *****************/
  18. void delay_uint(uint z)
  19. {
  20.    while(z--);
  21. }


  22. /************ 写命令函数  *****************/
  23. void write_com(uchar com)
  24. {

  25.    P0=com;
  26.    rw=0;
  27.    rs=0;
  28.    delay_uint(25);
  29.    e=1;
  30.    delay_uint(50);
  31.    e=0;
  32. }
  33. /************ 写数据函数  *****************/
  34. void write_data(uchar dat)
  35. {

  36.    P0=dat;;
  37.    rw=0;
  38.    rs=1;
  39.    delay_uint(25);
  40.    e=1;
  41.    delay_uint(50);
  42.    e=0;
  43. }

  44. /**********************************************************
  45. *函数名: addr_12864
  46. *功能:写地址
  47. *说明:写汉字时要写个地址
  48. *输入:无
  49. *返回:无
  50. **********************************************************/
  51. void addr_12864(uchar hang,uchar lie)          //地址转换
  52. {
  53.         uchar address;
  54.         switch(hang)
  55.         {
  56.                 case 1: address=0x80 + lie ;
  57.                                 break;
  58.                 case 2: address=0x90 + lie ;
  59.                                 break;
  60.                 case 3: address=0x88 + lie ;
  61.                                 break;
  62.                 case 4: address=0x98 + lie ;
  63.                                 break;
  64.                 default :
  65.                                 break;
  66.         }        
  67.         write_com(address);
  68. }

  69. /***********************lcd1602上显示两位十进制数************************/
  70. void write_sfm3(uchar hang,uchar add,uint date)
  71. {
  72.         addr_12864(hang,add);         
  73.         write_data(':');
  74.         write_data(0x30+date/100%10);
  75.         write_data(0x30+date/10%10);
  76.         write_data(0x30+date%10);        
  77. }


  78. /**********************************************************
  79. *函数名: write_string
  80. *功能:在12864上显示字符数据
  81. *说明:
  82. *输入:无
  83. *返回:无
  84. **********************************************************/

  85. void write_string(uchar hang,uchar lie,uchar *p)
  86. {
  87.         addr_12864(hang,lie);          //地址转换
  88.         while(*p != '\0')
  89.         {
  90.                 write_data(*p);
  91.                 p++;
  92.                 delay_uint(50);
  93.         }
  94. }

  95. /********************************************************************
  96. * 名称 : init_12864()
  97. * 功能 : 初始化函数
  98. * 输入 : cmdcode
  99. * 输出 : 无
  100. ***********************************************************************/
  101. void init_12864()
  102. {  
  103.     write_com(0x30);
  104.     write_com(0x0c);
  105.     write_com(0x01);
  106.     delay_uint(5000);
  107.         write_string(1,0,"               ");
  108.         write_string(2,0," 心率:000/min  ");
  109.         write_string(3,0,"               ");
  110.         write_string(4,0,"               ");
  111. }

  112. /*************定时器0初始化程序***************/
  113. void time_init()         
  114. {
  115.         EA   = 1;                   //开总中断
  116.         TMOD = 0X01;          //定时器0、定时器1工作方式1
  117.         ET0  = 1;                  //开定时器0中断
  118.         TR0  = 1;                  //允许定时器0定时
  119. }


  120. /***********外部中断0初始化程序****************/
  121. void init_int0()          //外部中断0初始化程序
  122. {
  123.         EX0=1;                          //允许外部中断0中断
  124.         EA=1;                           //开总中断
  125.         IT0 = 1;                   //外部中断0负跳变中断
  126. }

  127. /****************主函数***************/
  128. void main()
  129. {        
  130.         init_12864();     //12864初始化        
  131.         time_init();      //初始化定时器
  132.         init_int0();          //外部中断0初始化程序
  133.         while(1)
  134.         {                        
  135.                 if(displayOK==0)//如果显示关
  136.                 {
  137.                          rate = 0;
  138.                 }
  139.                 else//如果显示开
  140.                 {
  141.                         rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
  142.                 }
  143.                 write_sfm3(2,5,rate);

  144.                 delay_1ms(300);
  145.         }
  146. }

  147. void int0() interrupt 0
  148. {
  149.         if(timecount<8)   //当连续两次检测时间间隔小于8*50ms=400ms不处理
  150.         {
  151.                         TR0=1;//开定时器
  152.         }
  153.         else
  154.         {
  155.                 time[i]=timecount*50+TH0+TL0;//算出间隔时间
  156.                 TH0 = 0x3c;
  157.                 TL0 = 0xb0;     // 50ms         12M
  158.                 timecount=0;//50ms计数清零
  159.                 i++;
  160.                 if(i==6)//记录到超过等于6次时间
  161.                 {
  162.                         i=1;//计数从1开始
  163.                         displayOK=1;    //测得5次开始显示?
  164.                 }                                                               
  165.         }
  166. }

  167. /*************定时器0中断服务程序***************/
  168. void time0_int() interrupt 1
  169. {        
  170.         TH0 = 0x3c;
  171.         TL0 = 0xb0;     // 50ms         12M
  172.         timecount++;//每50ms一次计数
  173.         if(timecount>25)     //当超过25*50ms=1.5s没有检测到信号停止显示
  174.         {
  175.                         i=0;//数据个数清零
  176.                         timecount=0;//50ms计数清零
  177.                         displayOK=0;//显示关
  178.                         TR0=0;//定时器关
  179.                         TH0 = 0x3c;
  180.                         TL0 = 0xb0;     // 50ms         12M
  181.         }
  182. }
复制代码

所有资料51hei提供下载:
单片机脉搏计 12864.7z (1.45 MB, 下载次数: 77)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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