Пример кода программы Arduino

#включать <stdio.h>
#включать <строка.h>
#включать <inttypes.h>
#включать “Ардуино.ч”
#включать “XGZP6859D.h”
//Инициализация IIC BUS
пустота XGZP6859D::IIC_Init(пустота)
{
контактный режим(IIC_SCL, ВЫХОД); //Установите вывод в режим вывода
контактный режим(IIC_SDA, ВЫХОД);
цифровая запись(IIC_SCL, ВЫСОКИЙ); //Выход высокого уровня
цифровая запись(IIC_SDA, ВЫСОКИЙ);
}
//Сгенерировать стартовый сигнал
пустота XGZP6859D::IIC_Start(пустота)
{
контактный режим(IIC_SDA, ВЫХОД);
цифровая запись(IIC_SDA, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME); //Задержка на несколько микросекунд
цифровая запись(IIC_SCL, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SDA, НИЗКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SCL, НИЗКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
}
//Генерировать сигнал остановки
пустота XGZP6859D::IIC_Stop(пустота)
{
контактный режим(IIC_SDA, ВЫХОД);
цифровая запись(IIC_SDA, НИЗКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SCL, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SDA, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
}
//Дождитесь сигнала подтверждения
//возвращаться 1 означает неудачу
//возвращаться 0 означает успех
байт XGZP6859D::IIC_Wait_Ack(пустота)
{
байт ucErrTime=0;
контактный режим(IIC_SDA, ВХОД);
цифровая запись(IIC_SDA, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SCL, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
пока(цифровое чтение(IIC_SDA)== ВЫСОКИЙ)
{
ucErrTime++;
если(ucErrTime>250)
{
IIC_Stop();
возвращаться 1;
}
}
цифровая запись(IIC_SCL, НИЗКИЙ);
возвращаться 0;
}
//Сгенерировать сигнал ACK
пустота XGZP6859D::IIC_Ack(пустота)
{
цифровая запись(IIC_SCL, НИЗКИЙ);
контактный режим(IIC_SDA, ВЫХОД);
цифровая запись(IIC_SDA, НИЗКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SCL, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SCL, НИЗКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SDA, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
}
//Не генерировать сигнал ACK
пустота XGZP6859D::IIC_NAck(пустота)
{
цифровая запись(IIC_SCL, НИЗКИЙ);
контактный режим(IIC_SDA, ВЫХОД);
цифровая запись(IIC_SDA, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SCL, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SCL, НИЗКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
}
//Отправить один байт по шине IIC
//Возвращаемое значение означает ответ от подчиненного устройства
//1 значит получить ответ
//0 значит не получить ответ
пустота XGZP6859D::IIC_Send_Byte(байт txd)
{
байт т;
контактный режим(IIC_SDA, ВЫХОД);
цифровая запись(IIC_SCL, НИЗКИЙ);
для(т=0;т<8;т++)
{
если(спасибо & 0х80)
цифровая запись(IIC_SDA, ВЫСОКИЙ);
еще
цифровая запись(IIC_SDA, НИЗКИЙ);
спасибо<<=1;
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SCL, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SCL, НИЗКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
}
цифровая запись(IIC_SCL, НИЗКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SDA, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
}
//Прочитать один байт, отправить ACK, пока ack = 1, отправить nACK, пока подтверждено = 0
байт XGZP6859D::IIC_Read_Byte(измениться, увы)
{
обмен в,получить = 0;
контактный режим(IIC_SDA, ВХОД);
для(я = 0;я<8;я++ )
{
цифровая запись(IIC_SCL, НИЗКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
цифровая запись(IIC_SCL, ВЫСОКИЙ);
задержкамикросекунды(IIC_DELAY_TIME);
получать<<=1;
если(цифровое чтение(IIC_SDA)== ВЫСОКИЙ)
получать++;
задержкамикросекунды(IIC_DELAY_TIME);
}
цифровая запись(IIC_SDA, ВЫСОКИЙ);
возврат получить;
}
//Записать один байт по указанному адресу
пустота XGZP6859D::Write_One_Byte(адрес u8 ,данные u8)
{
IIC_Start();
IIC_Send_Byte((байт)(Адрес_устройства + 0));
Серийный.печать(“Адрес_устройства “);
Серийный.println(Адрес_устройства + 0, шестигранник);
IIC_Wait_Ack();
IIC_Send_Byte(адрес);
IIC_Wait_Ack();
IIC_Send_Byte(данные);
IIC_Wait_Ack();
IIC_Stop();
}
//Прочитать один байт с указанного адреса
байт XGZP6859D::Read_One_Byte(адрес u8)
{
байт моиданные;
IIC_Start();
IIC_Send_Byte((байт)(Адрес_устройства + 0));
IIC_Wait_Ack();
IIC_Send_Byte(адрес);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte((байт)(Адрес_устройства + 1));
IIC_Wait_Ack();
моиданные = IIC_Read_Byte(0);
IIC_Stop();
вернуть мои данные;
}
пустота XGZP6859D::XGZP6859D_get_cal() //Измерительное действие XGZP6859D
{
байт я = 0;
байтовый бафф[5]; //Пятибайтовые переменные, используется для сохранения байтов, прочитанных из XGZP6859D
беззнаковое длинное давление_объявление,температура_ад; //Переменные, используемые для сохранения калиброванного давления и температуры.
Write_One_Byte(0х30, 0х0А); //Укажите комбинированную конверсию
пока ((Read_One_Byte(0х30) & 0х08) == 0x80) //Судите, закончен ли сбор данных
{
Серийный.println(“XGZP6859D не готов.”);; //Подождите, пока данные не готовы
задерживать(1000);
}
для(я = 0;я<5;я++) //Чтение выходных данных АЦП о давлении и температуре
бафф[я] = Чтение_Один_Байт(0х06 + я);
Серийный.печать(“бафф[0…4] 0x”);
Серийный.печать(бафф[0], шестигранник);
Серийный.печать(“, 0Икс”);
Серийный.печать(бафф[1], шестигранник);
Серийный.печать(“, 0Икс”);
Серийный.печать(бафф[2], шестигранник);
Серийный.печать(“, 0Икс”);
Серийный.печать(бафф[3], шестигранник);
Серийный.печать(“, 0Икс”);
Серийный.println(бафф[4], шестигранник);
//Вычислить значение давления, преобразованное с помощью АЦП
давление_ад = ((беззнаковый длинный)((беззнаковый длинный)(бафф[0] * 65536)) + ((беззнаковое целое число)(бафф[1] * 256)) + ((байт)бафф[2]));
Серийный.печать(“Pressure_ad это “);
Серийный.println(давление_объявление);
если (давление_объявление > 8388608) //
{
давление = (длинный)(((длинный)(давление_объявление – 16777216)) / 8192);
//Поскольку диапазон составляет -500 Па ~ + 500 Па., итак, это 8192;k следует менять в соответствии с фактическим состоянием; единица давления - Па
}
еще
{
давление = (длинный)(давление_объявление / 8192);
}
//Вычислить значение температуры, преобразованное АЦП
температура_ад = ((беззнаковое целое число)((беззнаковое целое число)(бафф[3]<<8)) + ((байт)бафф[4]));
если (температура_ад > 32768)
{
температура = (плавать)(((длинный)(температура_ад – 65536)) / 256);
//Единица температуры — градус Цельсия.
}
еще
{
температура = (плавать)(температура_ад / 256);
}
}
XGZP6859D My_XGZP6859D; //Определите объект с именем My_XGZP6859D класса XGZP6859D.
недействительная установка()
{
Серийный.начало(9600); //Инициализация последовательного порта
My_XGZP6859D.IIC_Init(); //Инициализируйте контакты шины IIC My_XGZP6859D.
}
пустая петля()
{
My_XGZP6859D.XGZP6859D_get_cal(); //Вызовите функцию XGZP6859D_get_cal.() объекта My_XGZP6859D для расчета давления и температуры
Серийный.печать(My_XGZP6859D.pressure);
Серийный.println(” Па”);
Серийный.печать(My_XGZP6859D.температура);
Серийный.println(” стоградусный”);
Серийный.println(“”);
задерживать(1000);
}