找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机的脉搏计程序与电路原理图设计

[复制链接]
跳转到指定楼层
楼主
        本系统由STC89C52、按键、LCD1602、光电传感器、运放等构成,脉搏测量的时候需要人把手轻轻的按在光电传感器上面,由于人脉搏跳动的时候,血液的透光性不一样会导致接收器那边接收的信号强弱不一样,间接的把人脉搏信号传回,通过运放对其进行放大、整形后连接到单片机的IO口,单片机利用外部中断对其进行计数,最终换算成人一分钟脉搏的跳动次数,最终显示在液晶屏上。
脉搏计电路原理图如下:



元件清单:
元件型号    元件名称    元件标号    数量
10uF    电解电容    C1,C4    2
20PF    瓷片电容    C2, C3    2
1uF    电解电容    C5, C6    2
发光二极管    指示灯    D1    1
LCD1602    液晶    LCD1    1
2K    电阻    R1    1
10K    电阻    R2    1
330欧    电阻    R3, R4, R13    3
20K    电阻    R5, R6    2
10K    电阻    R7, R8    2
56k    电阻    R9    1
6.8K    电阻    R10    1
24K    电阻    R11    1
100K    电阻    R12    1
SW-PB    按键    S1    1
STC89C52    单片机    U1    1
ST188    光电开关    U2    1
LM358    放大器    U3    1
12M    晶振    Y1    1

制作出来的脉搏计实物图如下:

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

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

  7. unsigned char i=0,timecount=0,rate=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<110;j++);
  15. }


  16. /********************************************************************
  17. * 名称 : delay_uint()
  18. * 功能 : 小延时。
  19. * 输入 : 无
  20. * 输出 : 无
  21. ***********************************************************************/
  22. void delay_uint(uint q)
  23. {
  24.         while(q--);
  25. }

  26. /********************************************************************
  27. * 名称 : write_com(uchar com)
  28. * 功能 : 1602命令函数
  29. * 输入 : 输入的命令值
  30. * 输出 : 无
  31. ***********************************************************************/
  32. void write_com(uchar com)
  33. {
  34.         e=0;
  35.         rs=0;
  36.         rw=0;
  37.         P0=com;
  38.         delay_uint(25);
  39.         e=1;
  40.         delay_uint(100);
  41.         e=0;
  42. }

  43. /********************************************************************
  44. * 名称 : write_data(uchar dat)
  45. * 功能 : 1602写数据函数
  46. * 输入 : 需要写入1602的数据
  47. * 输出 : 无
  48. ***********************************************************************/
  49. void write_data(uchar dat)
  50. {
  51.         e=0;
  52.         rs=1;
  53.         rw=0;
  54.         P0=dat;
  55.         delay_uint(25);
  56.         e=1;
  57.         delay_uint(100);
  58.         e=0;       
  59. }

  60. /********************************************************************
  61. * 名称 : write_string(uchar hang,uchar add,uchar *p)
  62. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  63.                   write_string(1,5,"ab cd ef;")
  64. * 输入 : 行,列,需要输入1602的数据
  65. * 输出 : 无
  66. ***********************************************************************/
  67. void write_string(uchar hang,uchar add,uchar *p)
  68. {
  69.         if(hang==1)   
  70.                 write_com(0x80+add);
  71.         else
  72.                 write_com(0x80+0x40+add);
  73.         while(1)
  74.         {
  75.                 if(*p == '\0')  break;
  76.                 write_data(*p);
  77.                 p++;
  78.         }       
  79. }

  80. /***********************lcd1602上显示两位十进制数************************/
  81. void write_sfm3(uchar hang,uchar add,uint date)
  82. {
  83.         if(hang==1)   
  84.                 write_com(0x80+add);
  85.         else
  86.                 write_com(0x80+0x40+add);
  87.         write_data(0x30+date/100%10);
  88.         write_data(0x30+date/10%10);
  89.         write_data(0x30+date%10);       
  90. }

  91. /***********************lcd1602初始化设置************************/
  92. void init_1602()
  93. {
  94.         write_com(0x38);        //
  95.         write_com(0x0c);
  96.         write_com(0x06);
  97.         delay_uint(1000);
  98.         write_string(1,0,"   Heart Rate     ");       
  99.         write_string(2,0,"     000/min       ");
  100. }

  101. /*************定时器0初始化程序***************/
  102. void time_init()          
  103. {
  104.         EA   = 1;                   //开总中断
  105.         TMOD = 0X01;          //定时器0、定时器1工作方式1
  106.         ET0  = 1;                  //开定时器0中断
  107.         TR0  = 1;                  //允许定时器0定时
  108. }


  109. /***********外部中断0初始化程序****************/
  110. void init_int0()          //外部中断0初始化程序
  111. {
  112.         EX0=1;                          //允许外部中断0中断
  113.         EA=1;                           //开总中断
  114.         IT0 = 1;                   //外部中断0负跳变中断
  115. }

  116. /****************主函数***************/
  117. void main()
  118. {       
  119.         init_1602();                    //1602初始化
  120.         time_init();                    //初始化定时器
  121.         init_int0();          //外部中断0初始化程序
  122.         while(1)
  123.         {                       
  124.                 rate=60000/(time[1]+time[2]+time[3]+time[4]+time[5])/5;
  125.                 write_sfm3(2,5,rate);

  126.                 delay_1ms(300);
  127.         }
  128. }

  129. void int0() interrupt 0
  130. {
  131.         time[i]=timecount*50+TH0+TL0;//算出间隔时间
  132.         timecount=0;//50ms计数清零
  133.         i++;
  134.         if(i==6)//记录到超过等于6次时间
  135.         {
  136.                 i=1;//计数从1开始
  137.         }                                                               
  138. }

  139. /*************定时器0中断服务程序***************/
  140. void time0_int() interrupt 1
  141. {       
  142.         TH0 = 0x3c;
  143.         TL0 = 0xb0;     // 50ms         12M
  144.         timecount++;//每50ms一次计数
  145.         if(timecount>25)     //当超过25*50ms=1.5s没有检测到信号停止显示
  146.         {
  147.                         timecount=0;//50ms计数清零
  148.                         TR0=0;//定时器关
  149.         }
  150. }

复制代码

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

使用道具 举报

沙发
ID:1075720 发表于 2023-5-12 17:12 | 只看该作者
这个代码运行后,lcd心率显示不对
回复

使用道具 举报

板凳
ID:1075720 发表于 2023-5-12 17:12 | 只看该作者
这个代码烧录后,lcd显示的心率有问题
回复

使用道具 举报

地板
ID:1074754 发表于 2023-5-19 15:10 | 只看该作者
cq995 发表于 2023-5-12 17:12
这个代码运行后,lcd心率显示不对

有没有仿真图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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