|
網絡上只有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);
//功能: 發(fā)送 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
2018-7-1 22:04 上傳
點擊文件名下載附件
881.84 KB, 下載次數: 51
|