单片机与st188制作的心率测试仪全套设计

发布者:梦回归处最新更新时间:2019-12-31 来源: 51hei关键字:单片机  st188  心率测试仪 手机看文章 扫描二维码
随时随地手机看文章

今天查阅了网上的资料,用用传统20引脚12864屏幕制作了一款心率测试仪。

传感器用的是检测血液上的脉搏转换成心率,在资料里面有C语言程序、板子所用的元器件的清单等。非常适合初学者买回来自己制作和练习。

运用的芯片是89C52单片机。

资料里面包含了AD教学、单片机基本原理教学、protel基础教学等。也可以说是一个学习资料库。

文档里面都是网上资料,在完成1602屏幕后,可以运用12864去尝试做。

资料里面是传统20引脚的12864,作为初学者的我,首先碰到的是普中开发板的16个引脚的12864,里面资料少之又少,仅有例程。。。

不过在其他帖子上也有介绍这块12864的,可以先在此资料里面学习传统的20引脚的使用,之后再把mini12864屏幕运用起来!!

使用时把右手食指指肚放在st188反射式红外传感器上,放置合适时会看到指示灯随心跳同时闪动,如果没有闪烁请适当调节手指压力,调节完后在测试过程中手指压力不要变,保持稳定,当指示灯有规律闪烁时表示信号正确。当单片机检测到大约第五次信号时开始显示这五次信号算出的平均心率。当超过大约3秒没有检测到信号,清除心率。
如果手指抖动或者不稳定会看到指示灯乱闪,这样测得的数据不准,在测试过程中保持稳定!

st188传感器引脚图:
 
电路原理图如下:
 

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

 


单片机源程序如下:

#include                  //调用单片机头文件

#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255

#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535




sbit rs=P2^5;         //寄存器选择信号 H:数据寄存器          L:指令寄存器

sbit rw=P2^6;         //寄存器选择信号 H:数据寄存器          L:指令寄存器

sbit e =P2^7;         //片选信号   下降沿触发


unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;

unsigned int time[6]={0};



/***********************1ms延时函数*****************************/

void delay_1ms(uint q)

{

        uint i,j;

        for(i=0;i                for(j=0;j<120;j++);

}


                                           

/************ 延时函数  *****************/

void delay_uint(uint z)

{

   while(z--);

}



/************ 写命令函数  *****************/

void write_com(uchar com)

{


   P0=com;

   rw=0;

   rs=0;

   delay_uint(25);

   e=1;

   delay_uint(50);

   e=0;

}

/************ 写数据函数  *****************/

void write_data(uchar dat)

{


   P0=dat;;

   rw=0;

   rs=1;

   delay_uint(25);

   e=1;

   delay_uint(50);

   e=0;

}


/**********************************************************

*函数名: addr_12864

*功能:写地址

*说明:写汉字时要写个地址

*输入:无

*返回:无

**********************************************************/

void addr_12864(uchar hang,uchar lie)          //地址转换

{

        uchar address;

        switch(hang)

        {

                case 1: address=0x80 + lie ;

                                break;

                case 2: address=0x90 + lie ;

                                break;

                case 3: address=0x88 + lie ;

                                break;

                case 4: address=0x98 + lie ;

                                break;

                default : 

                                break;

        }        

        write_com(address);

}


/***********************lcd1602上显示两位十进制数************************/

void write_sfm3(uchar hang,uchar add,uint date)

{

        addr_12864(hang,add);         

        write_data(':');

        write_data(0x30+date/100%10);

        write_data(0x30+date/10%10);

        write_data(0x30+date%10);        

}



/**********************************************************

*函数名: write_string

*功能:在12864上显示字符数据

*说明:

*输入:无

*返回:无

**********************************************************/


void write_string(uchar hang,uchar lie,uchar *p)

{

        addr_12864(hang,lie);          //地址转换

        while(*p != '')

        {

                write_data(*p);

                p++;

                delay_uint(50);

        }

}


/********************************************************************

* 名称 : init_12864()

* 功能 : 初始化函数

* 输入 : cmdcode

* 输出 : 无

***********************************************************************/

void init_12864()

{  

    write_com(0x30);

    write_com(0x0c);

    write_com(0x01);

    delay_uint(5000);

        write_string(1,0,"               ");

        write_string(2,0," 心率:000/min  ");

        write_string(3,0,"               ");

        write_string(4,0,"               ");

}


/*************定时器0初始化程序***************/

void time_init()          

{

        EA   = 1;                   //开总中断

        TMOD = 0X01;          //定时器0、定时器1工作方式1

        ET0  = 1;                  //开定时器0中断 

        TR0  = 1;                  //允许定时器0定时

}



/***********外部中断0初始化程序****************/

void init_int0()          //外部中断0初始化程序

{

        EX0=1;                          //允许外部中断0中断

        EA=1;                           //开总中断

        IT0 = 1;                   //外部中断0负跳变中断

}


/****************主函数***************/

void main()

{        

        init_12864();     //12864初始化        

        time_init();      //初始化定时器 

        init_int0();          //外部中断0初始化程序

        while(1)

        {                        

                if(displayOK==0)//如果显示关

                {

                         rate = 0;

                }

                else//如果显示开

                {

                        rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);

                }

                write_sfm3(2,5,rate);


                delay_1ms(300);

        }

}


void int0() interrupt 0

{

        if(timecount<8)   //当连续两次检测时间间隔小于8*50ms=400ms不处理

        {

                        TR0=1;//开定时器

        }

        else

        {

                time[i]=timecount*50+TH0+TL0;//算出间隔时间

                TH0 = 0x3c;

                TL0 = 0xb0;     // 50ms         12M

                timecount=0;//50ms计数清零

                i++;

                if(i==6)//记录到超过等于6次时间

                {

                        i=1;//计数从1开始

                        displayOK=1;    //测得5次开始显示?

                }                                                                

        }

}


/*************定时器0中断服务程序***************/

void time0_int() interrupt 1

{        

        TH0 = 0x3c;

        TL0 = 0xb0;     // 50ms         12M

        timecount++;//每50ms一次计数

        if(timecount>25)     //当超过25*50ms=1.5s没有检测到信号停止显示

        {

                        i=0;//数据个数清零

                        timecount=0;//50ms计数清零

                        displayOK=0;//显示关

                        TR0=0;//定时器关

[1] [2]
关键字:单片机  st188  心率测试仪 引用地址:单片机与st188制作的心率测试仪全套设计

上一篇:单片机GPS定位LCD1602液晶显示经纬度海拔及时间日期实物制作
下一篇:NE555+74LS90+74LS08分频器的单片机频率计仿真与源码

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved