Red de conocimiento informático - Conocimiento informático - Ayúdenos con comentarios sobre el código de lenguaje C del sensor de temperatura y humedad integrado.

Ayúdenos con comentarios sobre el código de lenguaje C del sensor de temperatura y humedad integrado.

#include "ioCC2430.h" ?//Contiene archivos de encabezado, placa correspondiente y información del sensor

#include "hal.h"

# include < math.h>

//#include

#include

typedef union //Definir unión,

{

unsigned int i;

float f;

} value ?//Defina el nombre del tipo de unión como valor

#define noACK 0

#define ACK 1

#define STATUS_REG_W 0x06 //0x06 = 0000 0110

#define STATUS_REG_R 0x07 //0x07 = 0000 0111

#define MEASURE_TEMP 0x03 //0x03 = 0000 0011

#define MEASURE_HUMI 0x05 //0x05 = 0000 0101

#define RESET 0x1e ? /0x1e = 0001 1110

#define SDA P1_6 //Definir SDA representa el pin P1_6

#define SCL P1_7

#define comenzar P2_0

unsigned char d1,d2,d3,d4,d5,d6,d7; //Definir variable de carácter sin signo

void Wait(unsigned int ms) //Definir función de espera, utilizada principalmente para software bucles y funciones de retardo

{

unsigned char g,k;

while(ms)

{

for(g = 0;g <= 167; g++)

{

for(k = 0;k <= 48; k++)

}

ms--;

}

}

void QWait() //1us Retraso

{

asm("NOP"); ?//Agregar declaraciones de operación de ensamblaje, sin operaciones, utilizadas principalmente para la ejecución del ciclo de la máquina

asm( "NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP" );

asm("NOP");

asm("NOP");

asm("NOP ");

asm("NOP");

asm("NOP");

}

void initUART(void ) //Inicializa el puerto serie del microcontrolador

{

IO_PER_LOC_USART0_AT_PORT0_PIN2345(); ?//Para la definición y el uso de funciones específicas, debe consultar el código del programa en el archivo de encabezado

IO_DIR_PORT_PIN(1, 6, IO_OUT);

IO_DIR_PORT_PIN(1, 7, IO_OUT);

//IO_IMODE_PORT_PIN(1, 6, IO_IMODE

_TRI);

//IO_IMODE_PORT_PIN(1, 7, IO_IMODE_TRI);

IO_DIR_PORT_PIN(2, 0, IO_OUT);

IO_FUNC_PORT_PIN(2, 0, IO_FUNC_GIO);

//SET_MAIN_CLOCK_SOURCE(RC);

SET_MAIN_CLOCK_SOURCE(CRYSTAL);

UART_SETUP(0, 115200, HIGH_STOP);//Establecer transmisión Velocidad de transmisión de datos 115200

UTX0IF = 1;

U0CSR |= 0XC7; //U0CSR = U0CSR | 0x1010 0111 (realizar operación bit-OR)

IEN0 |= 0x84;

SDA = 1;

SCL = 0;

}

int putchar (int c) // Defina la función de carácter de entrada, el parámetro dado es un número entero

{

if (c == '\n') ?//Determine si el valor del parámetro c es el igual que Los valores de '\n' son iguales

{

mientras (!UTX0IF); //El valor de UTX0IF es 0 durante la ejecución. esta muy bien?

UTX0IF = 0; //Asignar 0 a UTX0IF

U0DBUF = 0x0d;//Asignar U0DBUF 0x0d = 0000 1011

}

while (!UTX0IF);

UTX0IF = 0;

return (U0DBUF = c); //Si el valor de c no es ' \n 'Es decir, cuando aparece el carácter de nueva línea, transferir el valor de c al registro U0DBUF

}

char s_write_byte(valor de carácter sin firmar)? función (8 bits)

{

unsigned char i,error = 0;

for (i = 0x80;i > 0;i /= 2) ? //i Asigne el valor inicial 0x80 = 128, el juicio de ejecución es i > 0 y la declaración de ejecución es i = i / 2, es decir, i = 128, 64, 32, 16, 8, 4, 2, 1, 0,5 (0), 8 bits

{

si (i & valor)

SDA = 1;

si no

SDA = 0;

SCL = 1 ?//En este momento, el puerto SCL, es decir, el pin p1_7 está en nivel alto

QWait( ?//Porque escribir lleva tiempo, agregue las siguientes declaraciones al programa

QWait();

QWait();

QWait() ;

QWait ();

SCL = 0;//Habilite el nivel bajo de p1_7 para habilitar la escritura de datos (para obtener más detalles, consulte el manual del chip de control del microcontrolador

asm("NOP");

asm("NOP");

}

SDA = 1;

SCL = 1;

asm("NOP");

error = SDA;

QWait() ;

QWait( );

QWait();

SDA = 1;

SCL = 0;

>

error de retorno;

}

char s_read_byte(unsigned char ack)? //Leer datos en orden de bytes Tomar (8 bits) 128 = 1000 0000, 64 = 0100 0000, 32 = 0010 0000, 16 = 0001 0000, 8 = 0000 1000, 4 = 0000 0100, 2 = 0000 0010, 1 = 0000 0001

{

unsigned char i,val = 0;

SDA= 1;

for(i = 0x80;i > 0;i /= 2) //Igual que el anterior.

{

SCL = 1;

if (SDA) ?//Determinar si hay un nivel alto en SDA

val = (val | i);//Realizar operación O

else

val = (val | 0x00);

SCL = 0; >

QEsperar();

QEsperar();

QEsperar();

QEsperar();

QEsperar( );

}

SDA = !ack;

SCL = 1;

QWait();

QEsperar();

QEsperar();

QEsperar();

QEsperar();

SCL = 0;

SDA = 1;

return val ? //Devuelve los datos leídos, un byte, ocho bits

}

void s_transstart (void) ?//La función de habilitación de transmisión es darle el nivel correspondiente al pin del controlador para que el módulo correspondiente funcione

{

SDA = 1 ;

SCL = 0;

QWait();

QWait();

SCL = 1;

QWait();

QEsperar();

SDA = 0;

QEsperar();

QEsperar()

SCL = 0;

QWait();

QWait();

QWait();

QWait();

QWait();

SCL = 1;

QWait();

QWait();

SDA = 1;

QWait();

QWait();

SCL = 0;

QWait();

QWait();

}

void s_connectionreset(void) ? //Restablecer función de operación

{

unsigned char i;

SDA = 1;

SCL = 0;

for(i = 0;i < 9; i++ )

{

SCL = 1;

QWait();

QWait();

SCL = 0;

QWait();

QWait();

}

s_transstart(); //Llamar a la función de inicio

}

char s_measure(sin firmar

char *p_value, unsigned char *p_checksum, modo char unsigned) //Función, cuenta principalmente el número de datos transmitidos

{

unsigned er = 0;

unsigned int i,j;

s_transstart();

cambiar(modo)

{

caso 3 :er += s_write_byte(3);

romper;

caso 5 :er += s_write_byte(5);

romper;

predeterminado : romper;

}

for(i = 0;i < 65535;i++)

{

for(j = 0; j < 65535;j++)

{if(SDA == 0)

{

romper;

}

}

if(SDA == 0)

{

romper;

}

}

if(SDA)

{

er += 1;

}

*(valor_p ) = s_read_byte(ACK);

*(p_value + 1) = s_read_byte(ACK);

*p_checksum = s_read_byte(noACK);

d6 = *(p_value);

d7=*(p_value + 1);

retorno er;

}

void calc_sth11(float *p_humidity, float *p_temperature)//Calcular valor de temperatura

{

const float C1 =- 4.0;

const float C2 =+ 0.0405; p>

flotador constante C3 =- 0.0000028;

flotador constante T1 =+ 0.01;

flotador constante T2 =+ 0.00008;

flotador rh = * p_humidity;

flotador t =* p_temperature;

flotador rh_lin;

flotador rh_true;

flotador t_C;

t_C = t* 0.01 - 44.0;

rh_lin = C3 * rh * rh + C2 * rh + C1;

rh_true = (t * 0,01 - 40,0 - 25) * (T1 + T2 * rh) + rh_lin;

if(rh_true > 100)

{

rh_true = 100;

}

si(rh_true < 0.1)

{

rh_true = 0.1;

}

*p_temperature = t_C;

*p_humidity = rh_true;

}

void main() ?//función principal

{

valor humi_val,temp_val;

?//Declarar dos variables de unión

error de carácter sin firmar,checksum; ?//Declarar dos variables de carácter sin signo

initUART( ); puerto serie

P1INP |= 0xC0; //Inicializa el pin P1, 0xC0 = 1010 0000, de modo que los pines P1_7 y P1_5 sean 1

comenzar = 0;

s_connectionreset();

while(1) ?//Operación de bucle infinito

{

error = 0;

error += s_measure((unsigned char*) &humi_val.i,&checksum,5 ?//Leer en el puerto serie Usar los datos para calcular la temperatura

d1 = d6;

d2 = d7;

error += s_measure((unsigned char*) &temp_val.i,&checksum ,3);

d3 = d6;

d4 = d7;

if(error != 0)

s_connectionreset() ;

else

{

humi_val.f = (flotador)humi_val.i;

temp_val.f = (flotador)temp_val .i;

humi_val.f = d1 * 256 + d2;

temp_val.f = d3 * 256 + d4;

calc_sth11(&humi_val.f, &temp_val.f);

printf("temp:%5.1fC humi:%5.1f%%\n",temp_val.f,humi_val.f);

// printf ("t1:%x h1:%x\n",d1,d2);

//printf("t2:%x h2:%x\n",d3,d4);

}

Espera(150);

}

}