单片机与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分频器的单片机频率计仿真与源码

推荐阅读最新更新时间:2024-11-13 11:21

第一节:吴坚鸿谈初学单片机的误区
从业将近十年!手把手教你单片机程序框架 第一讲: (1)很难记住繁杂的寄存器?寄存器不用死记硬背,鸿哥我行走江湖多年,连一个寄存器都记不住。需要配置寄存器的时候,直接在网上或者书本上参考别人现成的配置程序是上策,查找芯片数据手册是中策,死记硬背寄存器是最最下策。 (2)很难记住繁杂的汇编语言指令?除非是在校学生要应付考试或者少数工作中绕不开汇编,否则学汇编就是浪费时间。鸿哥我行走江湖多年,从来就没有用汇编帮客户做过一个项目。 (3)C语言很难学?你不用学指针,你不用学带形参的函数,你不用学结构体,你不用学宏定义,你不用学文件操作,你也不用死记繁琐的数据类型。你只要会: 5条指令语句switch语句,if else语句,whi
[单片机]
强打高整合SoC方案 MCU厂抢当物联网芯片一哥
物联网晶片市场将呈现新战局。物联网应用风潮带动超低功耗、少量多样设计趋势,激励许多微控制器(MCU)开发商乘势大展拳脚,并提出整合MCU、无线通讯、嵌入式记忆体、射频(RF)、感测器及电源管理的物联网系统单晶片(SoC)解决方案,期在产业典范转移之际,取得更有利的市场立足点,进而抢下物联网晶片市场一哥宝座。 芯科实验室副总裁暨MCU与无线产品部门总经理Daniel Cooley认为,Thread同时拥有低功耗、长距离传输和IP网状网路支援等优势,发展潜力不容忽视。 芯科实验室(Silicon Labs)副总裁暨MCU与无线产品部门总经理Daniel Cooley表示,PC、行动装置时代前后孕育出英特尔(Intel)、高通
[物联网]
C51单片机模块化编程万年历设计
原文地址: C51单片机模块化编程万年历设计 作者: 给力哈 哈 程序如下: main.h #ifndef __MAIN_H__ #define __MAIN_H__ #include regx52.h #include intrins.h #include absacc.h #define uchar unsigned char #define uint unsigned int #define DQ P3_7 #endif ds18b20.h #include main.h uint sec; uint min=41; uint hour=18; uint day=20; uint month=
[单片机]
微控制器驱动压电蜂鸣器的改进
本文主要针对如何用一只微控制器以大交流电压驱动一个压电蜂鸣器,它使用了一个四MOSFET的电路,与微控制器的两个I/O引脚连接(参考文献1)。以下是本文对这个电路的修改扩充,能节省下一只微控制器的I/O引脚。Q4的栅极连接到Q2的漏极,而不是第二个I/O引脚(图)。微处理器在I/O引脚施加一个高逻辑电平,使Q2导通,将Node A拉至低逻辑电平。这个动作打开Q3,关闭Q4。Node B上的电压变为15V,Q1关闭。压电元件上的电压现在为15V。 一只微控制器I/O引脚驱动这个电路,在压电蜂鸣器两端产生一个交流电压 然后,微控制器将I/O引脚切换为低,Q2关闭。Q1也关闭,因此Node A通过上拉电阻R1,缓慢地升至高逻辑电
[单片机]
<font color='red'>微控制器</font>驱动压电蜂鸣器的改进
基于单片机的智能浇花(灌溉)系统设计
智能浇花系统选择AT89C51单片机最小系统作为整体控制芯片。该系统功能为对土壤温度值与湿度值进行实时监测,并及时控制土壤中温度值与湿度值。将测量的温温度值与湿度值返回给单片机进行数据处理通过控制模块进行温湿度控制。智能浇花系统主要分为两个部分:监测模块选用湿度传感器YL-69来对土壤中湿度值进行监测以及温度传感器DS18B20对花周围温度进行实时检测。温度值与湿度值的控制则为连接在单片机上的SRD-05VDC-SL-C继电器,通过控制连接水管的电磁阀开关来实现对土壤浇水。通过电磁阀来控制风扇从而进行温度控制。模拟部分通过控制加热棒来模拟夏天高温天气,利用风扇降温。 本设计软件实现方法是将湿度传感器YL-69的探头完全插
[单片机]
基于<font color='red'>单片机</font>的智能浇花(灌溉)系统设计
51单片机-超声波测距程序
今天弄了一下以前买的超声波测距的模块,51单片机接上12864液晶,HC-SR04超声波模块,就可以了,具体程序没怎么看,超声波模块的硬件也不晓得,今天先贴个图,贴个程序吧(程序是淘宝买的模块附赠的) 。 源程序: /******************************************************************************/ /* Name: LCD12864(St7920/St7921)+超声波测距模块+STC89C52 */ /* HC-SR04 超声波测距模块 DEMO 程序 */ /* 晶振:11.0592M
[单片机]
51<font color='red'>单片机</font>-超声波测距程序
Renesas RA2L1 MCU产品贸泽开售
专注于引入新品的全球电子元器件授权分销商贸泽电子 (Mouser Electronics) 即日起开售Renesas Electronics的RA2L1 MCU产品群。这些MCU具有64 μA/MHz工作电流、250 nA超低软件待机电流,以及创新型触摸感应接口,是各种互联家居、物联网 (IoT) 和其他自动化应用的理想之选。 贸泽电子供应的Renesas RA2L1 MCU搭载基于Armv8-M 架构的48 MHz Arm® Cortex®-M23核心,配备高达256 KB的代码闪存、32 KB的SRAM以及电容式触摸感应装置。RA2L1 MCU中先进的电容式触摸IP可使各种接触式和非接触式系统实现更强的操作性。RA2
[嵌入式]
Renesas RA2L1 <font color='red'>MCU</font>产品贸泽开售
8位单片机体系的直接软件构架(C51系列)
1.启动文件的编制 $ NOMOD51 ;Ax51宏汇编器控制命令:禁止预定义的8051 ;自定义上电后需要初始化的储存区域 ;间接寻址区IDATA起始地址固定为0 IDATALEN EQU 8OH ;指定需要初始化的IDATA区长度(以字节为单位) XDATASTART EQU OH ;需要初始化的外部直接寻址区XDATA的起始地址 XDATALEN EQU OH ;指定需要初始化的XDATA区长度(以字节为单位) PDATASTART EQU OH ;指定需要初始化的页寻址区PDATA起始地址 PDATALEN EQU OH ;指定需要初始化的PDATA
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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