找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的心率计

[复制链接]
跳转到指定楼层
楼主

人体的健康与心率息息相关。在中医史上,把脉即是对心率的一种测量。为了提高测量的精准度,科学家们不断的对心率计进行开拓。基于了解了该心率计的要求后,设计了以AT89C51单片机为核心芯片的心率计。该心率计由单片机模块、反射式红外光电传感器模块、液晶显示模块等构成,并进行相应的软件设计和硬件调试。利用反射式红外光电传感器将心跳引起的血液浓度的变化转变为电压信号,将电压信号处理后传给单片机,由单片机实现定时计数得出心率,并由液晶显示模块显示心率。经过一系列的调试,该心率计实现了对心率的准确测量,达到了本设计所预期的效果,具有一定的实际意义和应用前景。

原理图如下:
心率脉搏计-51-1602.pdf (192.9 KB, 下载次数: 41)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-10-19 02:27 | 只看该作者
楼主能分享一下图片和源码吗?
回复

使用道具 举报

板凳
ID:240466 发表于 2017-11-8 17:05 | 只看该作者
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P1^0;                             //数据与命令选择控制引脚
sbit rw=P1^1;                                 //读与写选择控制引脚
sbit en=P1^2;                                 //使能择控制引脚
sbit bf=P0^7;                                 //忙标志位

sbit P32=P3^2;

unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
unsigned int time[6]={0};

/************ 延时函数  *****************/
void delay(uint z)
{
   while(z--);
}
/************ 忙检测函数  *****************/
void jiance()
{
  P0=0xff;
  rs=0;rw=1;en=1;
  while(bf);                        //如果BF==1表示液晶在忙
  en=0;
}
/************ 写命令函数  *****************/
void write_com(uchar com)
{
   jiance();
   P0=com;
   rs=0;rw=0;en=1;
   delay(2);
   en=0;
}
/************ 写数据函数  *****************/
void write_dat(uchar dat)
{
   jiance();
   P0=dat;
   rs=1;rw=0;en=1;
   delay(2);
   en=0;
}
/************ 1602液晶初始化函数  *****************/
void init_lcd()
{
   write_com(0x38);           // 设置16*2显示,5*7点阵,8位数据接口
   write_com(0x0c);           // 开显示,不显示光标
   write_com(0x06);           // 地址加1,当写入数据的时候光标右移
   write_com(0x01);           //清屏
}

/******************************************************************/
/*                   在指定位置写字符                                 */
/******************************************************************/
void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data)
{     
    if (y == 0)  
    write_com(0x80 + x);     
    else     
    write_com(0xC0 + x);            
    write_dat(Data);  
}
void DelayMs(unsigned int z)
{
   unsigned int x;
   for(;z>0;z--)
     for(x=110;x>0;x--);
}         
void main()
{
                P32=1;
                init_lcd();//lcd初始化
                TCON=0x01;//设置外部中断0
                EX0=1;
                TMOD=0x01;//定时器0初始化
                TH0=(65536-50000)/256;//实测每50ms中断的定时值
                TL0=(65536-50000)%256;
                ET0=1;//开定时器中断
                //显示基本文字
                LCD_write_char(3,0,'H');
                LCD_write_char(4,0,'e');
                LCD_write_char(5,0,'a');
                LCD_write_char(6,0,'r');
                LCD_write_char(7,0,'t');
                LCD_write_char(8,0,' ');
                LCD_write_char(9,0,'R');
                LCD_write_char(10,0,'a');
                LCD_write_char(11,0,'t');
                LCD_write_char(12,0,'e');

                LCD_write_char(8,1,'/');
                LCD_write_char(9,1,'m');
                LCD_write_char(10,1,'i');
                LCD_write_char(11,1,'n');
                TR0=0;//定时器停止
                EA=1;//开总中断
                while(1)
                {
                               
                                if(displayOK==1)
                                {
                                                rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
                                                LCD_write_char(5,1,rate/100+48);
                                                LCD_write_char(6,1,(rate%100)/10+48);
                                                LCD_write_char(7,1,rate%10+48);
                                }
                                DelayMs(300);
                }
}

void ex0() interrupt 0
{
                EX0=0;//暂时关外部中断
                if(timecount<8)   //当连续两次检测时间间隔小于8*50ms=400ms不处理
                {
                                TR0=1;//开定时器
                }
                else
                {
                                time[i]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间
                                TL0=(65536-50000)%256;//重新设置定时器
                                TH0=(65536-50000)/256;
                                timecount=0;//50ms计数清零
                                i++;
                                if(i==6)//记录到超过等于6次时间
                                {
                                                i=1;//计数从1开始
                                                displayOK=1;    //测得5次开始显示
                                }       
                               
                }
                EX0=1;
}
void et0() interrupt 1
{
                TL0=(65536-50000)%256;
                TH0=(65536-50000)/256;
                       
                timecount++;//每50ms一次计数
                if(timecount>25)     //当超过25*50ms=1.25s没有检测到信号停止显示
                {
                                i=0;//数据个数清零
                                timecount=0;//50ms计数清零
                                displayOK=0;//显示关
                                TR0=0;//定时器关
                                TH0=(65536-50000)/256;
                                TL0=(65536-50000)%256;
                }
}

IMG_20160430_184524.jpg (3.68 MB, 下载次数: 88)

IMG_20160430_184524.jpg
回复

使用道具 举报

地板
ID:587714 发表于 2019-7-28 14:40 | 只看该作者
学习了,谢谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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