找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2307|回复: 1
收起左侧

51单片机 max30100程序

[复制链接]
ID:411446 发表于 2018-10-17 23:12 | 显示全部楼层 |阅读模式
# 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=0xFD;
TL1=0xFD;
TR1=1;      
TI=1;   
//设置51的波特率为 9600 N 8 1
//51主频为11.0592MHz
while(1)
{
wr_max30100_one_data(0xae,0x06,0x0a);       // 0X06地址B3位TEMP_EN置1
delayms(20);                                // 等待温度转换完成,不等待,读出数据有误
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/100);
printf("temp=%.2f\n",temp);                 // 串口显示
rd_max30100_one_data(0xae,0xff);            // 读出芯片ID
printf("MAX30100 ID =%d\n",rda);            // 串口显示
delayms(100);   
}
}


回复

使用道具 举报

ID:1 发表于 2018-10-17 23:15 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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