标题: 单片机与st188制作的心率测试仪全套设计资料(12864显示) 含源码,原理图等 [打印本页]

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

st188传感器引脚图:

电路原理图如下:


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




单片机源程序如下:
  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黑下载附件…………
复制代码


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



作者: 51电子丶    时间: 2018-5-8 15:25
下载之后为什么不是压缩包形式?解压不了,也查看不了

修改扩展名就好了

作者: 我只是个初学者    时间: 2018-5-8 20:01
老哥  你这是什么  这个格式不对的吧
作者: YLsl349889    时间: 2018-5-8 23:06
大家下载以后改一下文件名就可以打开了.
作者: maibo    时间: 2018-5-14 16:22
很好

作者: maibo    时间: 2018-5-14 16:26
51电子丶 发表于 2018-5-8 15:25
下载之后为什么不是压缩包形式?解压不了,也查看不了

您好!

作者: boo851011    时间: 2018-5-23 19:59
好资料
作者: Ontbibbb    时间: 2018-11-14 12:24

好资料,谢谢分享
作者: samdcn    时间: 2018-11-14 15:00
不断学习,很不错
作者: 艾拉物优菟    时间: 2018-11-15 07:56
好资源
作者: 艾拉物优菟    时间: 2018-11-15 09:06
如何调格式
作者: qq936064662    时间: 2018-12-18 10:26
有没有好心人发一份给我邮箱1173507270@qq.com,拜谢
作者: dbq1183341696    时间: 2018-12-19 13:39
有没有proteus的仿真图

作者: dbq1183341696    时间: 2018-12-19 13:40
有没有proteus仿真图?
作者: cgq01    时间: 2018-12-19 14:16
顶一个 谢兄弟
作者: 17552658059    时间: 2018-12-19 15:16
YLsl349889 发表于 2018-5-8 23:06
大家下载以后改一下文件名就可以打开了.

有Protues仿真图不?

作者: xunzhaoyangyang    时间: 2019-1-8 20:25
有没有好心人给我发一份啊,2415092757@qq.com,有偿&#128521;
作者: xunzhaoyangyang    时间: 2019-1-8 20:27
qq936064662 发表于 2018-12-18 10:26
有没有好心人发一份给我邮箱,拜谢

有没有好心人给我发一份,2415092757@qq.com,拜谢,有偿
作者: a2597162136    时间: 2019-1-9 10:20
大佬,带我飞
作者: qq936064662    时间: 2019-1-15 09:49
st188的程序是哪一部分,可以解释一下怎么来的吗?大佬
作者: 达飞奇    时间: 2019-1-16 14:15
这是啥文件
作者: RGCTHGCHDF    时间: 2019-2-19 14:28
有仿真图吗

作者: MyFaker    时间: 2019-3-21 23:33
我想问一下放大倍数怎么计算
作者: Palmer    时间: 2019-4-3 17:19
感谢分享。。。。
作者: Palmer    时间: 2019-4-3 17:23
很好感谢分享。
作者: lshmm    时间: 2019-4-24 10:08
很好 感谢分享~
作者: 河东51    时间: 2019-4-24 11:24
原来这个也可以用单片机做呀
作者: QZQ1973    时间: 2019-4-29 23:56
好资料 谢谢分享!
作者: yyhlsf    时间: 2019-4-30 14:10
好好学习一下
作者: 王志彬    时间: 2019-5-23 18:57
谢谢分享,你的资料给我带来了很大帮助,点赞
作者: wu90166chun    时间: 2019-6-13 11:51
您好!刚刚打开您分享的压缩包一看,没想到无偿分享这么多资料。我想再加黑币时系统已经提示不能重复了,所以,口头再次用信息感谢感谢您!祝您工作顺利!生活愉快!心想事成!我是做天然乳胶枕头业务的,如果有缘,可加我18989483286手微同号
作者: cduhuapu    时间: 2019-6-14 23:42
非常感谢!很详实的全套资料,涉及到的软件硬件都有。还有文字说明等。正好需要它,真的是非常感谢楼主!棒棒哒!
作者: 小明至极    时间: 2019-10-3 22:00
1306液晶屏能用不?
作者: 18741527880    时间: 2019-11-7 12:39
为什么c语言教程的视频被删除了啊,我急需这个
作者: 颖川    时间: 2019-12-27 17:25
18741527880 发表于 2019-11-7 12:39
为什么c语言教程的视频被删除了啊,我急需这个

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

作者: 颖川    时间: 2019-12-27 18:37
艾拉物优菟 发表于 2018-11-15 07:56
好资源

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

作者: 颖川    时间: 2019-12-27 19:27
有的朋友麻烦分享一份资料,1274302976@qq.com
作者: krysdreamer    时间: 2019-12-30 22:26
问问 可以直接用1602代替掉12864液晶屏吗?
作者: z4zyfg    时间: 2020-3-4 14:12
正需要,谢谢楼主分享
作者: 51hei**1140    时间: 2020-3-4 14:38
krysdreamer 发表于 2019-12-30 22:26
问问 可以直接用1602代替掉12864液晶屏吗?

你好!
不能直接代替,需要重新写显示部分的程序
作者: l956597431    时间: 2020-3-22 16:35
怎么下载不下来了呢
作者: yyzf998    时间: 2020-4-24 23:20
楼主太给力了!资料满满的!谢谢分享!
作者: 席皓哲    时间: 2020-5-1 18:14
很好,分有用
作者: 1422584842    时间: 2020-5-6 23:23
51电子丶 发表于 2018-5-8 15:25
下载之后为什么不是压缩包形式?解压不了,也查看不了

修改扩展名就好了

怎么下载?

作者: 薛定谔的猫喵喵    时间: 2020-12-27 11:28
dbq1183341696 发表于 2018-12-19 13:40
有没有proteus仿真图?

我也想问。。你找到了吗请问

作者: qier666    时间: 2021-7-10 15:32
资料确实很详细




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1