找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16694|回复: 45
收起左侧

单片机与st188制作的心率测试仪全套设计资料(12864显示) 含源码,原理图等

  [复制链接]
ID:320623 发表于 2018-5-7 21:30 | 显示全部楼层 |阅读模式
        第一次发帖纪念一下        作为一个初学者,今天查阅了网上的资料,用用传统20引脚12864屏幕制作了一款心率测试仪。
        传感器用的是检测血液上的脉搏转换成心率,在资料里面有C语言程序、板子所用的元器件的清单等。非常适合初学者买回来自己制作和练习。
        运用的芯片是89C52单片机。
        资料里面包含了AD教学、单片机基本原理教学、protel基础教学等。也可以说是一个学习资料库。
        文档里面都是网上资料,在完成1602屏幕后,可以运用12864去尝试做。
        资料里面是传统20引脚的12864,作为初学者的我,首先碰到的是普中开发板的16个引脚的12864,里面资料少之又少,仅有例程。。。
        不过在其他帖子上也有介绍这块12864的,可以先在此资料里面学习传统的20引脚的使用,之后再把mini12864屏幕运用起来!!
        希望这份资料能帮助到大家!!!!
使用时把右手食指指肚放在st188反射式红外传感器上,放置合适时会看到指示灯随心跳同时闪动,如果没有闪烁请适当调节手指压力,调节完后在测试过程中手指压力不要变,保持稳定,当指示灯有规律闪烁时表示信号正确。当单片机检测到大约第五次信号时开始显示这五次信号算出的平均心率。当超过大约3秒没有检测到信号,清除心率。
如果手指抖动或者不稳定会看到指示灯乱闪,这样测得的数据不准,在测试过程中保持稳定!

st188传感器引脚图:
0.png
电路原理图如下:
截图格式 双击可以打.png

论文内容截图(附件可下载完整版)

0.png


单片机源程序如下:
  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. }
  183. ……………………

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

所有资料51hei提供下载:
##单片机脉搏计 12864.zip (5.9 MB, 下载次数: 679)

评分

参与人数 2黑币 +55 收起 理由
不知道111 + 5 11
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:303539 发表于 2018-5-8 15:25 | 显示全部楼层
下载之后为什么不是压缩包形式?解压不了,也查看不了

修改扩展名就好了
回复

使用道具 举报

ID:254395 发表于 2018-5-8 20:01 | 显示全部楼层
老哥  你这是什么  这个格式不对的吧
回复

使用道具 举报

ID:325570 发表于 2018-5-8 23:06 | 显示全部楼层
大家下载以后改一下文件名就可以打开了.
回复

使用道具 举报

ID:329690 发表于 2018-5-14 16:22 | 显示全部楼层
很好
回复

使用道具 举报

ID:329690 发表于 2018-5-14 16:26 | 显示全部楼层
51电子丶 发表于 2018-5-8 15:25
下载之后为什么不是压缩包形式?解压不了,也查看不了

您好!
回复

使用道具 举报

ID:336740 发表于 2018-5-23 19:59 | 显示全部楼层
好资料
回复

使用道具 举报

ID:344600 发表于 2018-11-14 12:24 | 显示全部楼层

好资料,谢谢分享
回复

使用道具 举报

ID:147492 发表于 2018-11-14 15:00 | 显示全部楼层
不断学习,很不错
回复

使用道具 举报

ID:426726 发表于 2018-11-15 07:56 来自手机 | 显示全部楼层
好资源
回复

使用道具 举报

ID:426726 发表于 2018-11-15 09:06 来自手机 | 显示全部楼层
如何调格式
回复

使用道具 举报

ID:448673 发表于 2018-12-18 10:26 | 显示全部楼层
有没有好心人发一份给我邮箱1173507270@qq.com,拜谢
回复

使用道具 举报

ID:449394 发表于 2018-12-19 13:39 | 显示全部楼层
有没有proteus的仿真图
回复

使用道具 举报

ID:449394 发表于 2018-12-19 13:40 | 显示全部楼层
有没有proteus仿真图?
回复

使用道具 举报

ID:448105 发表于 2018-12-19 14:16 | 显示全部楼层
顶一个 谢兄弟
回复

使用道具 举报

ID:439149 发表于 2018-12-19 15:16 来自手机 | 显示全部楼层
YLsl349889 发表于 2018-5-8 23:06
大家下载以后改一下文件名就可以打开了.

有Protues仿真图不?
回复

使用道具 举报

ID:464872 发表于 2019-1-8 20:25 | 显示全部楼层
有没有好心人给我发一份啊,2415092757@qq.com,有偿&#128521;
回复

使用道具 举报

ID:464872 发表于 2019-1-8 20:27 | 显示全部楼层
qq936064662 发表于 2018-12-18 10:26
有没有好心人发一份给我邮箱,拜谢

有没有好心人给我发一份,2415092757@qq.com,拜谢,有偿
回复

使用道具 举报

ID:374552 发表于 2019-1-9 10:20 | 显示全部楼层
大佬,带我飞
回复

使用道具 举报

ID:448673 发表于 2019-1-15 09:49 | 显示全部楼层
st188的程序是哪一部分,可以解释一下怎么来的吗?大佬
回复

使用道具 举报

ID:469105 发表于 2019-1-16 14:15 来自手机 | 显示全部楼层
这是啥文件
回复

使用道具 举报

ID:478092 发表于 2019-2-19 14:28 | 显示全部楼层
有仿真图吗
回复

使用道具 举报

ID:254673 发表于 2019-3-21 23:33 | 显示全部楼层
我想问一下放大倍数怎么计算
回复

使用道具 举报

ID:502478 发表于 2019-4-3 17:19 | 显示全部楼层
感谢分享。。。。
回复

使用道具 举报

ID:502478 发表于 2019-4-3 17:23 | 显示全部楼层
很好感谢分享。
回复

使用道具 举报

ID:520222 发表于 2019-4-24 10:08 | 显示全部楼层
很好 感谢分享~
回复

使用道具 举报

ID:510258 发表于 2019-4-24 11:24 | 显示全部楼层
原来这个也可以用单片机做呀
回复

使用道具 举报

ID:512205 发表于 2019-4-29 23:56 | 显示全部楼层
好资料 谢谢分享!
回复

使用道具 举报

ID:375715 发表于 2019-4-30 14:10 来自手机 | 显示全部楼层
好好学习一下
回复

使用道具 举报

ID:415633 发表于 2019-5-23 18:57 | 显示全部楼层
谢谢分享,你的资料给我带来了很大帮助,点赞
回复

使用道具 举报

ID:561427 发表于 2019-6-13 11:51 | 显示全部楼层
您好!刚刚打开您分享的压缩包一看,没想到无偿分享这么多资料。我想再加黑币时系统已经提示不能重复了,所以,口头再次用信息感谢感谢您!祝您工作顺利!生活愉快!心想事成!我是做天然乳胶枕头业务的,如果有缘,可加我18989483286手微同号
回复

使用道具 举报

ID:261045 发表于 2019-6-14 23:42 | 显示全部楼层
非常感谢!很详实的全套资料,涉及到的软件硬件都有。还有文字说明等。正好需要它,真的是非常感谢楼主!棒棒哒!
回复

使用道具 举报

ID:234889 发表于 2019-10-3 22:00 | 显示全部楼层
1306液晶屏能用不?
回复

使用道具 举报

ID:623885 发表于 2019-11-7 12:39 来自手机 | 显示全部楼层
为什么c语言教程的视频被删除了啊,我急需这个
回复

使用道具 举报

ID:651495 发表于 2019-12-27 17:25 来自手机 | 显示全部楼层
18741527880 发表于 2019-11-7 12:39
为什么c语言教程的视频被删除了啊,我急需这个

急需加一,朋友有找到能用的么
回复

使用道具 举报

ID:651495 发表于 2019-12-27 18:37 来自手机 | 显示全部楼层
艾拉物优菟 发表于 2018-11-15 07:56
好资源

你好,可以分享一下资源么,他过期了
回复

使用道具 举报

ID:651495 发表于 2019-12-27 19:27 来自手机 | 显示全部楼层
有的朋友麻烦分享一份资料,1274302976@qq.com
回复

使用道具 举报

ID:677050 发表于 2019-12-30 22:26 | 显示全部楼层
问问 可以直接用1602代替掉12864液晶屏吗?
回复

使用道具 举报

ID:702286 发表于 2020-3-4 14:12 | 显示全部楼层
正需要,谢谢楼主分享
回复

使用道具 举报

ID:648281 发表于 2020-3-4 14:38 | 显示全部楼层
krysdreamer 发表于 2019-12-30 22:26
问问 可以直接用1602代替掉12864液晶屏吗?

你好!
不能直接代替,需要重新写显示部分的程序
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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