#include "MyDefine.h"
#include "JHM1200.h"
#include "JHM1200_IIC.h"
// Определить верхний и нижний пределы калибровочного давления
#define CAL_L 20000 //20Kpa
#define CAL_H 120000 //120Kpa
// 7-битный адрес IIC JHM 1200 — 0x78.
//uchar Device_Address = 0x78 << 1;
uchar Device_Address;// = 0xf0;
//Необходимо определить функцию задержки
void DelayMs(uchar shu) // Демонстрационная программа 8 МГц/1 мс
{
uchar j;
uchar i;
_clrwdt();
for(i=0; i<shu; i++)
for(j=0; j<120; j++)
{
_nop();_nop();
}
}
// Прочтите статус IIC, чтобы определить, занят ли IIC.
uchar JHM1200_IsBusy(void)
{
uchar status;
_clrwdt();
BSP_IIC_Read(Device_Address, &status, 1);
status = (status >> 5) & 0x01;
return status;
}
/**
* @Используйте команду 0xAC для расчета фактического давления и температуры с использованием внутреннего алгоритма JHM 1200.
* @Обратите внимание на отправку 0xAC, чтение статуса IIC до тех пор, пока IIC не будет занят.
* @Обратите внимание, что общий размер возвращаемых данных составляет 6 байтов, расположенных по порядку: слово состояния, трехбайтовое значение давления, двухбайтовое значение температуры.
* @Обратите внимание, что возвращаемое трехбайтовое значение давления пропорционально максимальному 24-битному значению 16777216. На основе этого соотношения фактическое значение давления снова преобразуется в соответствии с диапазоном калибровки.
* @Обратите внимание, что возвращаемое двухбайтовое значение температуры пропорционально 16-битному максимальному значению 65536. На основе этого соотношения фактическое значение давления снова преобразуется в соответствии с диапазоном калибровки.
* @Примечание Точка нулевого давления и точка полного давления калибровочного давления составляют 20 кПа и 120 кПа соответственно.
* @Обратите внимание, что нулевая точка температуры калибровки равна -40°C, а полная точка – 150°C.
* @Примечание: Рассчитайте измеренное значение давления на основе единицы измерения давления Па и измеренного значения температуры 0,01°C.
*/
void JHM1200_get_cal()
{
uchar buffer[6] = {0};
ulong press_raw = 0;
uint temp_raw = 0;
double press = 0.0, temp = 0.0;
_clrwdt();
// Отправляем команду 0xac и читаем возвращенные шестибайтовые данные
buffer[0] = 0xAC;
BSP_IIC_Write(Device_Address, buffer, 1);// Запишите один байт данных через IIC
DelayMs(5);
while (1)
{
if (JHM1200_IsBusy())// Прочтите статус IIC, чтобы определить, занят ли IIC.
{
DelayMs(1);
}
else
break;
}
BSP_IIC_Read(Device_Address, buffer, 6);//Чтение байтов данных через IIC
// Преобразование возвращаемых значений давления и температуры в фактические значения на основе диапазона калибровки.
press_raw = ((ulong)buffer[1] << 16) | ((ulong)buffer[2] << 8) | buffer[3];
temp_raw = ((ulong)buffer[4] << 8) | (buffer[5] << 0);
press = (double)press_raw / 16777216;
press = press * (CAL_H - CAL_L) + CAL_L;
temp = (double)temp_raw / 65536;
temp = temp * 19000 - 4000;
}