找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 6409|回复: 18
收起左侧

用89c51和max30100模块测量心率

  [复制链接]
回帖奖励 100 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
ID:274373 发表于 2018-7-1 22:07 | 显示全部楼层 |阅读模式
网络上只有stm32的代码,自己改编失败了,求温度代码改编为心率测试的代码
//RCWL-0530模块与51接口连接:
// 1:VCC   --〉   1.8V-5.5V电源
// 2:SCL   --〉   P3.5
// 3:SDA   --〉   P3.7
// 4:INT   --〉   NC
// 5:IRD   --〉   NC
// 6:RD    --〉   NC
// 7:GND   --〉   地
//-------------------------------------------------------------------------------------//
# include <reg52.h>
# include <stdio.h>
# include <intrins.h>
//定义IIC接口
sbit IIC_SCL    =P3^5;     //IIC的SCL
sbit IIC_SDA    =P3^7;     //IIC的SDA
bit  IIC_ACK;              //IIC的ACK
int  rda;                  //IIC读出
//-------------------------------------------------------------------------------------//
//函数:    delayms()
//功能:    延时程序
//-------------------------------------------------------------------------------------//
void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}
//-------------------------------------------------------------------------------------//
//函数:    void iic_start();
//功能:    I2C总线开始
//-------------------------------------------------------------------------------------//
//   SCL   --- --- ___
//   SDA   --- ___ ___
void iic_start()
{  
IIC_SDA=1;
_nop_();
_nop_();
IIC_SCL=1;         
_nop_();
_nop_();
IIC_SDA=0;
_nop_();
_nop_();
IIC_SCL=0;
_nop_();
_nop_();
}
//-------------------------------------------------------------------------------------//
//函数:    void iic_stop();
//功能:    I2C总线结束
//需定义:
//-------------------------------------------------------------------------------------//
//   SCL   ___ --- ---
//   SDA   ___ ___ ---
void iic_stop()
{  
IIC_SCL=0;
_nop_();
_nop_();
IIC_SDA=0;
_nop_();
_nop_();
IIC_SCL=1;
_nop_();
_nop_();
IIC_SDA=1;
_nop_();
_nop_();
}
//-------------------------------------------------------------------------------------//
//函数:    void iic_sendbyte(unsigned char c);
//功能:    发送 8_BIT 数据
//-------------------------------------------------------------------------------------//
void iic_sendbyte(unsigned char c)
{
unsigned char bitcnt;
for(bitcnt=0;bitcnt<8;bitcnt++)
{
if((c<<bitcnt)&0x80)
IIC_SDA=1;
else
IIC_SDA=0;
_nop_();
_nop_();
IIC_SCL=1;
_nop_();
_nop_();
IIC_SCL=0;
}
_nop_();
_nop_();
IIC_SDA=1;
_nop_();
_nop_();
IIC_SCL=1;
_nop_();
_nop_();
if(IIC_SDA==0)
IIC_ACK=0;
else
IIC_ACK=1;
IIC_SCL=0;
_nop_();
_nop_();
}
//-------------------------------------------------------------------------------------//
//函数:    int iic_rcvbyte_nack();
//功能:    接收 8_BIT 数据  最后ack信号
//-------------------------------------------------------------------------------------//
int iic_rcvbyte_nack()
{
unsigned char retc;
unsigned char bitcnt;
retc=0;
IIC_SDA=1;
for(bitcnt=0;bitcnt<8;bitcnt++)
{
_nop_();
_nop_();
IIC_SCL=0;
_nop_();
_nop_();
IIC_SCL=1;
_nop_();
_nop_();
retc=retc<<1;
if(IIC_SDA==1)
retc=retc+1;
_nop_();
_nop_();
}
//给出NACK信号
_nop_();
_nop_();
IIC_SCL=0;
_nop_();
_nop_();
IIC_SDA=1;
_nop_();
_nop_();
IIC_SCL=1;
_nop_();
_nop_();
IIC_SCL=0;
_nop_();
_nop_();
return(retc);
}
//-------------------------------------------------------------------------------------//
//函数:    int iic_rcvbyte_ack();
//功能:    接收 8_BIT 数据 最后ack信号
//-------------------------------------------------------------------------------------//
int iic_rcvbyte_ack()
{
unsigned char retc;
unsigned char bitcnt;
retc=0;
IIC_SDA=1;
for(bitcnt=0;bitcnt<8;bitcnt++)
{
_nop_();
_nop_();
IIC_SCL=0;
_nop_();
_nop_();
IIC_SCL=1;
_nop_();
_nop_();
retc=retc<<1;
if(IIC_SDA==1)
retc=retc+1;
_nop_();
_nop_();
}
//给出ACK信号
_nop_();
_nop_();
IIC_SCL=0;
_nop_();
_nop_();
IIC_SDA=0;
_nop_();
_nop_();
IIC_SCL=1;
_nop_();
_nop_();
IIC_SCL=0;
_nop_();
_nop_();
return(retc);
}
//-------------------------------------------------------------------------------------//
//函数:      wr_max30100_one_data()
//功能:      写一位max30100数据
//address:   芯片从地址
//saddress:  写寄存器地址
//w_data:    待写数据
//-------------------------------------------------------------------------------------//
void wr_max30100_one_data(int address,int saddress,int w_data )
{
_nop_();
iic_start();
_nop_();
iic_sendbyte(address);
_nop_();
iic_sendbyte(saddress);
_nop_();
iic_sendbyte(w_data);
_nop_();
iic_stop();
_nop_();
}
//-------------------------------------------------------------------------------------//
//函数:      rd_max30100_one_data()
//功能:      读一位max30100数据
//address:   芯片从地址
//saddress:  读寄存器地址
//rda:       读出的数据
//-------------------------------------------------------------------------------------//
void rd_max30100_one_data(int address,int saddress)
{
iic_start();
_nop_();
iic_sendbyte(address);
_nop_();
iic_sendbyte(saddress);
_nop_();
address=address+1;
_nop_();
iic_start();
_nop_();
iic_sendbyte(address);
_nop_();
rda=iic_rcvbyte_nack();
_nop_();
iic_stop();
}
//-------------------------------------------------------------------------------------//
//函数:      主程序
//功能:      读max30100内部温度
//-------------------------------------------------------------------------------------//
main()
{
double temp,temp1,temp2;
//temp       测量温度
//temp1      30100整数部分温度
//temp2      30100小数部分温度
TMOD=0x21;                  
SCON=0x50;
TH1=0xE6;
TL1=0xE6;
TR1=1;                          
TI=1;   
//设置51的波特率为 1200 N 8 1
//51主频为12MHz STC的MCU注意要选择外部晶体振荡
while(1)
{
//复位芯片,设置模式
wr_max30100_one_data(0xae,0x06,0x0b);  
//读芯片ID
rd_max30100_one_data(0xae,0xff);            // 读出芯片ID
printf("MAX30100 ID =%d\n",rda);            // 串口显示
//点亮芯片LED
wr_max30100_one_data(0xae,0x07,0x43);       // 设置电流,点亮LED
delayms(10);   
//温度功能测试
wr_max30100_one_data(0xae,0x09,0x66);       // 0X06地址B3位TEMP_EN置1
delayms(50);                                // 等待温度转换完成,不等待,读出数据有误
rd_max30100_one_data(0xae,0x16);            // 读出温度信号
printf("temp1=%d\n",rda);                   // 串口显示
temp1=rda;
rd_max30100_one_data(0xae,0x17);            // 读出温度小数部分数据
printf("temp2=%d\n",rda);                   // 串口显示
temp2=rda;
temp=temp1+(temp2*0.0625);                  // 计算温度,小数部分最小温度值0.0625
printf("当前温度=%.4f\n",temp);             // 串口显示当前温度
delayms(100);  
printf("\n");                               // 串口显示当前温度
}
}



max30100.pdf

881.84 KB, 下载次数: 51

回复

举报

ID:363209 发表于 2018-7-5 09:33 | 显示全部楼层
楼主得到心率代码了吗,我也需要一份

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

举报

ID:393021 发表于 2018-9-3 16:46 | 显示全部楼层
用max30100模块测量心率 的STM32代码还在吗

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

举报

ID:401559 发表于 2018-9-23 14:00 | 显示全部楼层
楼主,请问测心率代码还在吗?
回复

举报

ID:404915 发表于 2018-10-2 19:02 | 显示全部楼层
感谢楼主分享
回复

举报

ID:63090 发表于 2018-10-4 21:56 | 显示全部楼层
上淘宝,有很多带51例程的现在
回复

举报

ID:405466 发表于 2018-10-5 07:34 | 显示全部楼层

感谢楼主分享
回复

举报

ID:557637 发表于 2019-6-8 11:56 | 显示全部楼层
楼主有测心率代码吗?
回复

举报

ID:425825 发表于 2019-6-9 10:12 | 显示全部楼层

你好!可以采用心电芯片,实现心电图检测和心率显示;
测量精度满足实验要求,有 PCB板 和 万用板两种版本;
也可以按照不同需求完成定制修改,请注明:来自51黑

001.png
回复

举报

ID:93224 发表于 2019-6-9 17:26 | 显示全部楼层
这个模块很不好用,就算你出来数据了,大部分还是错误的
回复

举报

ID:545795 发表于 2019-7-18 09:05 | 显示全部楼层
温度测量不准确
回复

举报

ID:420213 发表于 2019-7-18 09:27 | 显示全部楼层
谢谢楼主分享的资料
回复

举报

ID:501451 发表于 2019-12-12 15:46 | 显示全部楼层
感谢楼主分享
回复

举报

ID:627214 发表于 2019-12-14 20:07 | 显示全部楼层
基于51单片机心率测量电路设计 - 百度文库 https://wenku.baidu.com/view/0ca ... 86bceb19e8ed42.html
网上找的,希望对你有帮助
回复

举报

ID:507688 发表于 2020-2-19 19:26 | 显示全部楼层
求51单片机测心率的代码
回复

举报

ID:589541 发表于 2020-3-19 17:59 | 显示全部楼层
学习了,感谢楼主
回复

举报

ID:541522 发表于 2020-5-1 15:54 | 显示全部楼层
求51单片机测心率的代码,哪位大神搞出来了,帮忙发一下啊
回复

举报

ID:896118 发表于 2021-3-24 17:43 | 显示全部楼层
楼主楼主,可以分享一下代码吗?
回复

举报

ID:139866 发表于 2021-3-26 10:58 | 显示全部楼层
你用示波器看一下SDA和SCL的波形是不是符合Max30100的要求,一般都是SCL的延时出问题,主要是因为不同的单片机频率基本不一样,你需要看波形起伏的时间,过长过短都不行
回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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