Programa de ejemplo Código Arduino

#incluir <stdio.h>
#incluir <cadena.h>
#incluir <inttipos.h>
#incluir “Arduino.h”
#incluir “XGZP6859D.h”
//La inicialización de IIC BUS
anular XGZP6859D::IIC_Inicio(vacío)
{
modo pin(IIC_SCL, PRODUCCIÓN); //Establecer el pin en modo de salida
modo pin(IIC_SDA, PRODUCCIÓN);
escritura digital(IIC_SCL, ALTO); //Salida de alto nivel
escritura digital(IIC_SDA, ALTO);
}
//Generar señal de inicio
anular XGZP6859D::IIC_Inicio(vacío)
{
modo pin(IIC_SDA, PRODUCCIÓN);
escritura digital(IIC_SDA, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME); //Retraso de varios microsegundos
escritura digital(IIC_SCL, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SDA, BAJO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SCL, BAJO);
retrasoMicrosegundos(IIC_DELAY_TIME);
}
//Generar señal de parada
anular XGZP6859D::IIC_Detener(vacío)
{
modo pin(IIC_SDA, PRODUCCIÓN);
escritura digital(IIC_SDA, BAJO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SCL, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SDA, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
}
//Espere la señal ACK
//devolver 1 significa fracaso
//devolver 0 significa éxito
byte XGZP6859D::IIC_Espera_Ack(vacío)
{
byte ucErrTime=0;
modo pin(IIC_SDA, APORTE);
escritura digital(IIC_SDA, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SCL, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
mientras(lectura digital(IIC_SDA)==ALTO)
{
ucErrTiempo++;
si(ucErrTiempo>250)
{
IIC_Detener();
devolver 1;
}
}
escritura digital(IIC_SCL, BAJO);
devolver 0;
}
//Generar señal ACK
anular XGZP6859D::IIC_Ack(vacío)
{
escritura digital(IIC_SCL, BAJO);
modo pin(IIC_SDA, PRODUCCIÓN);
escritura digital(IIC_SDA, BAJO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SCL, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SCL, BAJO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SDA, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
}
//No generar señal ACK
anular XGZP6859D::IIC_NAck(vacío)
{
escritura digital(IIC_SCL, BAJO);
modo pin(IIC_SDA, PRODUCCIÓN);
escritura digital(IIC_SDA, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SCL, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SCL, BAJO);
retrasoMicrosegundos(IIC_DELAY_TIME);
}
//Enviar un byte a través del bus IIC
//El valor de retorno significa respuesta del esclavo.
//1 significa recibir respuesta
//0 significa no recibir respuesta
anular XGZP6859D::IIC_Enviar_Byte(byte txd)
{
bytet;
modo pin(IIC_SDA, PRODUCCIÓN);
escritura digital(IIC_SCL, BAJO);
para(t=0;t<8;t++)
{
si(txd & 0x80)
escritura digital(IIC_SDA, ALTO);
demás
escritura digital(IIC_SDA, BAJO);
txd<<=1;
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SCL, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SCL, BAJO);
retrasoMicrosegundos(IIC_DELAY_TIME);
}
escritura digital(IIC_SCL, BAJO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SDA, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
}
//Leer un byte, enviar ACK mientras ack = 1, enviar nACK mientras ack = 0
byte XGZP6859D::IIC_Read_Byte(cambiar por desgracia)
{
intercambiar en,recibir=0;
modo pin(IIC_SDA, APORTE);
para(yo=0;i<8;yo ++ )
{
escritura digital(IIC_SCL, BAJO);
retrasoMicrosegundos(IIC_DELAY_TIME);
escritura digital(IIC_SCL, ALTO);
retrasoMicrosegundos(IIC_DELAY_TIME);
recibir<<=1;
si(lectura digital(IIC_SDA)==ALTO)
recibir++;
retrasoMicrosegundos(IIC_DELAY_TIME);
}
escritura digital(IIC_SDA, ALTO);
devolver recibir;
}
//Escribe un byte en una dirección especificada.
anular XGZP6859D::Escritura_Un_Byte(dirección u8 ,datos u8)
{
IIC_Inicio();
IIC_Enviar_Byte((byte)(Dirección_dispositivo + 0));
Serial.print(“La dirección_dispositivo es “);
Serial.println(Dirección_dispositivo + 0, MALEFICIO);
IIC_Espera_Ack();
IIC_Enviar_Byte(DIRECCIÓN);
IIC_Espera_Ack();
IIC_Enviar_Byte(datos);
IIC_Espera_Ack();
IIC_Detener();
}
//Leer un byte de una dirección especificada
byte XGZP6859D::Lectura_un_byte(dirección u8)
{
byte mis datos;
IIC_Inicio();
IIC_Enviar_Byte((byte)(Dirección_dispositivo + 0));
IIC_Espera_Ack();
IIC_Enviar_Byte(DIRECCIÓN);
IIC_Espera_Ack();
IIC_Inicio();
IIC_Enviar_Byte((byte)(Dirección_dispositivo + 1));
IIC_Espera_Ack();
misdatos = IIC_Read_Byte(0);
IIC_Detener();
devolver mis datos;
}
anular XGZP6859D::XGZP6859D_get_cal() //La acción de medición de XGZP6859D
{
byte i=0;
mejora de bytes[5]; //Variables de cinco bytes, utilizado para guardar los bytes leídos desde XGZP6859D
anuncio de presión largo sin firmar,anuncio_temperatura; //Variables utilizadas para guardar la presión y temperatura calibradas.
Escritura_Un_Byte(0x30, 0x0A); //Indicar una conversión combinada
mientras ((Lectura_un_byte(0x30) & 0x08) == 0x80) //Juzgue si la recopilación de datos ha terminado
{
Serial.println(“XGZP6859D no está listo”);; //Espere mientras los datos no estén listos
demora(1000);
}
para(yo=0;i<5;yo ++) //Leer datos de salida ADC de presión y temperatura
pulir[i] = Leer_Un_Byte(0x06 + i);
Serial.print(“pulir[0…4] es 0x”);
Serial.print(pulir[0], MALEFICIO);
Serial.print(“, 0incógnita”);
Serial.print(pulir[1], MALEFICIO);
Serial.print(“, 0incógnita”);
Serial.print(pulir[2], MALEFICIO);
Serial.print(“, 0incógnita”);
Serial.print(pulir[3], MALEFICIO);
Serial.print(“, 0incógnita”);
Serial.println(pulir[4], MALEFICIO);
//Calcule el valor de la presión convertida por ADC
presión_ad = ((largo sin firmar)((largo sin firmar)(pulir[0] * 65536)) + ((entero sin firmar)(pulir[1] * 256)) + ((byte)pulir[2]));
Serial.print(“presión_ad es “);
Serial.println(anuncio_presion);
si (anuncio_presion > 8388608) //
{
presión = (largo)(((largo)(anuncio_presion – 16777216)) / 8192);
//Porque el lapso es -500Pa~+500Pa, entonces k es 8192;k debe cambiarse según la condición actual; la unidad de presión es pa
}
demás
{
presión = (largo)(anuncio_presion / 8192);
}
//Calcule el valor de la temperatura convertida por ADC
anuncio_temperatura = ((entero sin firmar)((entero sin firmar)(pulir[3]<<8)) + ((byte)pulir[4]));
si (anuncio_temperatura > 32768)
{
temperatura = (flotar)(((largo)(anuncio_temperatura – 65536)) / 256);
//La unidad de temperatura es centígrados.
}
demás
{
temperatura = (flotar)(anuncio_temperatura / 256);
}
}
XGZP6859D Mi_XGZP6859D; //Defina un objeto llamado My_XGZP6859D de la clase XGZP6859D
configuración nula()
{
Serie.comienzo(9600); //La inicialización del puerto serie.
Mi_XGZP6859D.IIC_Init(); //Inicialice los pines del bus IIC de My_XGZP6859D
}
bucle vacío()
{
Mi_XGZP6859D.XGZP6859D_get_cal(); //Llame a la función XGZP6859D_get_cal() del objeto My_XGZP6859D para calcular la presión y la temperatura
Serial.print(Mi_XGZP6859D.presión);
Serial.println(” Pensilvania”);
Serial.print(Mi_XGZP6859D.temperatura);
Serial.println(” Centígrado”);
Serial.println(“”);
demora(1000);
}