亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
ms5611大氣壓強傳感器的IIC驅動源碼
[打印本頁]
作者:
mingwin0602
時間:
2018-4-20 02:08
標題:
ms5611大氣壓強傳感器的IIC驅動源碼
分享ms5611的IIC驅動源程序資料:
單片機源程序如下:
#include "main.h"
/*變量聲明----------------------------------------------------------------*/
uint16_t Cal_C[7]; //用于存放PROM中的6組數據
uint32_t D1_Pres,D2_Temp; // 存放數字壓力和溫度
float Pressure; //溫度補償大氣壓
double dT;
float Temperature,Temperature2;//實際和參考溫度之間的差異,實際溫度,中間值
double OFF,SENS; //實際溫度抵消,實際溫度靈敏度
float Aux,OFF2,SENS2; //溫度校驗值
uint32_t ex_Pressure; //串口讀數轉換值
uint8_t exchange_num[8];
/***初始化函數**/
void MS561101BA_Init(void)
{
my_IIC_Init();
MS561101BA_Reset();
delay_ms(100);
MS561101BA_readPROM();
delay_ms(100);
}
/***軟復位函數****/
void MS561101BA_Reset(void)
{
IIC_Start();
IIC_Send_Byte(MS561101BA_Device_Address);
while(IIC_Wait_Ack());
delay_us(100);
IIC_Send_Byte(MS561101BA_RESET);
while(IIC_Wait_Ack());
delay_us(100);
IIC_Stop();
}
//從PROM讀取出廠校準數據
void MS561101BA_readPROM(void)
{
u16 data1,data2;
u8 i=0;
for(i=0;i<=6;i++)
{
/***********************************/
IIC_Start();
IIC_Send_Byte(MS561101BA_Device_Address);//寫入從設備地址,并設定為寫入模式
while(IIC_Wait_Ack());
delay_us(100);
IIC_Send_Byte(MS561101BA_PROM_BASE_ADDR+i*2);//寫入寄存器地址,準備讀取數據
while(IIC_Wait_Ack());
delay_us(100);
IIC_Stop();
delay_us(100);
IIC_Start();
IIC_Send_Byte(MS561101BA_Device_Address+0x01);//寫入從設備地址,并設定為讀取模式
while(IIC_Wait_Ack());
delay_us(100);
data1=IIC_Read_Byte(1);
data2=IIC_Read_Byte(0);
IIC_Stop();
delay_ms(10);
Cal_C[i]=(data1<<8)|data2;
}
}
/******讀取信息函數******/
uint32_t MS561101BA_DO_CONVERSION(u8 command)
{
u32 conversion=0;
u16 conv1,conv2,conv3;
IIC_Start();
IIC_Send_Byte(MS561101BA_Device_Address);//寫入從設備地址,并設定為寫入模式
while(IIC_Wait_Ack());
IIC_Send_Byte(command); //寫入寄存器地址(指令),準備讀取數據
while(IIC_Wait_Ack());
IIC_Stop();
delay_ms(20);
IIC_Start();
IIC_Send_Byte(MS561101BA_Device_Address);
while(IIC_Wait_Ack());
IIC_Send_Byte(0x00);
while(IIC_Wait_Ack());
IIC_Stop();//I2C ADC read sequence
delay_ms(10);
IIC_Start();
IIC_Send_Byte(MS561101BA_Device_Address+1);
while(IIC_Wait_Ack());
conv1=IIC_Read_Byte(1);
conv2=IIC_Read_Byte(1);
conv3=IIC_Read_Byte(0);
IIC_Stop();
delay_ms(10);
conversion= (conv1<<16) + (conv2<<8) + conv3;
return conversion;
}
//讀取數字溫度
void MS561101BA_GetTemperature(u8 OSR_Temp)
{
D2_Temp= MS561101BA_DO_CONVERSION(OSR_Temp);
delay_ms(10);
dT=D2_Temp - ((((unsigned long)Cal_C[5])<<8)*1.0);
Temperature=2000+dT*((u32)Cal_C[6])/8388608.0;//2007等于20.07攝氏度
}
//讀取大氣壓強
void MS561101BA_GetPressure(u8 OSR_Pres)
{
float Aux,OFF2,SENS2; //溫度校驗值
D1_Pres=MS561101BA_DO_CONVERSION(OSR_Pres);
delay_ms(10);
OFF=(u32)(Cal_C[2]<<16)+((u32)Cal_C[4]*dT)/128.0;
SENS=(u32)(Cal_C[1]<<15)+((u32)Cal_C[3]*dT)/256.0;
//溫度補償
if(Temperature < 2000)// second order temperature compensation when under 20 degrees C
{
Temperature2 = (dT*dT) / 0x80000000;//(0x80000000是2的31次方)
Aux = (Temperature-2000)*(Temperature-2000);
OFF2 = 2.5*Aux;
SENS2 = 1.25*Aux;
if(Temperature < -1500)
{
Aux = (Temperature+1500)*(Temperature+1500);
OFF2 = OFF2 + 7*Aux;
SENS2 = SENS + 5.5*Aux;
}
}else //(Temperature > 2000)
{
Temperature2 = 0;
OFF2 = 0;
SENS2 = 0;
}
Temperature = Temperature - Temperature2;
OFF = OFF - OFF2;
SENS = SENS - SENS2;
Pressure=(D1_Pres*SENS/2097152.0-OFF)/32768.0;//100009= 1000.09 mbar
//一個標準大氣壓的壓強是1.013x10^3mbar
}
void MS561101BA_data_transfer(void)
{
long temp_transfer=0;
long press_transfer=0;
unsigned char temp_exchange_number[]={'0'};
unsigned char press_exchange_number[]={'0'};
u8 temp_datalen=0,press_datalen=0,i=0;
if(Temperature<0)
{
temp_transfer=(long)(-Temperature);//(注意此單位是100*攝氏度,需將溫度轉換成攝氏度為單位)
temp_exchange_number[0]='-';
}
else
{
temp_transfer=(long)Temperature;//(注意此單位是100*攝氏度,需將溫度轉換成攝氏度為單位)
temp_exchange_number[0]='\0';
}
if(temp_transfer>=0&&temp_transfer<=9999)
{
temp_datalen=6;
temp_exchange_number[1]=((u16)(temp_transfer/1000.0f)+0x30);//十位
temp_transfer=temp_transfer%1000;
temp_exchange_number[2]=((u16)(temp_transfer/100.0f)+0x30);//個位
temp_transfer=temp_transfer%100;
temp_exchange_number[3]='.';
temp_exchange_number[4]=((u16)(temp_transfer/10.0f)+0x30);
temp_transfer=temp_transfer%10;
temp_exchange_number[5]=((u16)(temp_transfer)+0x30);
printf("當前溫度是:");
for(i=0;i<6;i++)
{
printf("%c",temp_exchange_number[i]);
}
printf("°C \r \n");
}
if(temp_transfer>=10000)
{//溫度大于100度
temp_datalen=7;
temp_exchange_number[1]=((u16)(temp_transfer/10000.0f)+0x30);//百位
temp_transfer=temp_transfer%10000;
temp_exchange_number[2]=((u16)(temp_transfer/1000.0f)+0x30);//十位
temp_transfer=temp_transfer%1000;
temp_exchange_number[3]=((u16)(temp_transfer/100.0f)+0x30);//個位
temp_transfer=temp_transfer%100;
temp_exchange_number[4]='.';
temp_exchange_number[5]=((u16)(temp_transfer/10.0f)+0x30);
temp_transfer=temp_transfer%10;
temp_exchange_number[6]=((u16)(temp_transfer)+0x30);
printf("當前溫度是:");
for(i=0;i<temp_datalen;i++)
{
printf("%c",temp_exchange_number[i]);
}
printf("°C \r \n");
}
/*********發送氣壓大小***********/
if(Pressure<0)
{
press_transfer=(long)(-Pressure);//(注意此單位是100*攝氏度,需將溫度轉換成攝氏度為單位)
press_exchange_number[0]='-';
}
else
{
press_transfer=(long)Pressure;//(注意此單位是100*攝氏度,需將溫度轉換成攝氏度為單位)
press_exchange_number[0]='\0';
}
if(press_transfer>=0&&press_transfer<=99999)
{
press_datalen=7;
press_exchange_number[1]=((u16)(press_transfer/10000.0f)+0x30);//百位
press_transfer=press_transfer%10000;
press_exchange_number[2]=((u16)(press_transfer/1000.0f)+0x30);//十位
press_transfer=temp_transfer%1000;
press_exchange_number[3]=((u16)(press_transfer/100.0f)+0x30);//個位
press_transfer=temp_transfer%100;
press_exchange_number[4]='.';
press_exchange_number[5]=((u16)(press_transfer/10.0f)+0x30);
press_transfer=temp_transfer%10;
press_exchange_number[6]=((u16)(press_transfer)+0x30);
printf("當前氣壓是:");
for(i=0;i<press_datalen;i++)
{
printf("%c",press_exchange_number[i]);
}
printf("mbar \r \n");
}
if(press_transfer>=100000)
{
press_datalen=8;
press_exchange_number[1]=((u16)(press_transfer/100000.0f)+0x30);//千位
press_transfer=press_transfer%100000;
press_exchange_number[2]=((u16)(press_transfer/10000.0f)+0x30);//百位
press_transfer=press_transfer%10000;
press_exchange_number[3]=((u16)(press_transfer/1000.0f)+0x30);//十位
press_transfer=press_transfer%1000;
press_exchange_number[4]=((u16)(press_transfer/100.0f)+0x30);//個位
press_transfer=press_transfer%100;
press_exchange_number[5]='.';
press_exchange_number[6]=((u16)(press_transfer/10.0f)+0x30);
press_transfer=press_transfer%10;
press_exchange_number[7]=((u16)(press_transfer)+0x30);
printf("當前氣壓是:");
for(i=0;i<press_datalen;i++)
{
printf("%c",press_exchange_number[i]);
}
printf("mbar \r \n");
}
}
/***** brief 獲取ms5611的數據并寫出onenet平臺要求的Http協議格式 *****/
void get_ms5611_data(void)
{
char data[25]={0};
MS561101BA_GetTemperature(MS561101BA_Temp_D2_OSR_4096);
MS561101BA_GetPressure(MS561101BA_Press_D1_OSR_4096);
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.jpg
(23.44 KB, 下載次數: 55)
下載附件
2018-4-20 03:25 上傳
以上2個文件51hei附件下載:
ms5611.rar
(3.52 KB, 下載次數: 167)
2018-4-20 02:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
mmmk
時間:
2018-4-20 11:02
好資料,51黑有你更精彩!!!
作者:
1146734128
時間:
2019-2-26 12:42
感謝分享。。。。。。。。。。!
作者:
cvhnh
時間:
2019-11-6 17:41
感謝分享
作者:
zwl911124
時間:
2019-11-7 07:17
厲害!
作者:
新鄉家電維修
時間:
2020-10-18 12:08
讀出的數據是是矯正過的,還是未矯正的,如果是未矯正的壓強,該如何與溫度矯正呢
作者:
irisice008
時間:
2021-11-2 11:43
很好的資料,已下載,謝謝分享!
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1