Advertisement
Electgpl

8051 - Estacion Externa Silabs C8051F832

Sep 30th, 2017
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 14.92 KB | None | 0 0
  1. //*********************************************************************************************************
  2. // Programa para la estacion meteorologica Interna inalámbrica
  3. // El programa recibe Temperatura, Humedad y Luminosidad por interrupcion
  4. // El sistema mide Temperatura y Humedad interior
  5. // El enlace se realiza mediante una comunicacion ASK OOK UHF sobre UART Invertido a 600bps
  6. // Se muestra medicion interna y externa en un LCD de 2x16
  7. // Microcontrolador Silabs C8051F832
  8. //*********************************************************************************************************
  9. #include <reg52.h>
  10. #include <REG51F800.H>
  11. #include <intrins.h>
  12. #include <stdio.h>
  13. //*********************************************************************************************************
  14. // Variables
  15. //*********************************************************************************************************
  16. #define HEADER 200                                           //Definicion de valor Header para el payload
  17. sbit DATA = P1^0;                                            //Pin del bus de un hilo para el DHT11
  18. static int datoInt[2];                                       //Variable donde se alojan los datos internos
  19. static int payload[5];                                       //Variable donde se aloja el payload
  20. static int datoExt[3];                                       //Variable donde se alojan los datos externos
  21. sbit P0MDIN = 0xF1;                                          //Port 0 Input Mode
  22. sbit P0SKIP = 0xD4;                                          //Port 0 Skip
  23. sbit ADC0CF = 0xBC;                                          //ADC0 Configuration
  24. sbit ADC0CN = 0xE8;                                          //ADC0 Control 0
  25. sbit AD0BUSY = 0xF8;                                         //ADC0 Busy
  26. sbit ADC0L = 0xBD;                                           //ADC0 Data Word Low Byte
  27. sbit ADC0H = 0xBE;                                           //ADC0 Data Word High Byte
  28. //*********************************************************************************************************
  29. // delay_us Bloqueante Micro Segundos
  30. //*********************************************************************************************************
  31. void delay_us(unsigned int us_count){                        //Funcion para delay_ms de micro-segundos
  32.    int t=0;
  33.    while(us_count!=0){                                       //Mientras que el contador es distinto de cero
  34.       for(t=0;t<16;t++){                                     //16MIPS dividido en 16 para 1us
  35.          _nop_();                                            //Ejecuta funcion NOP de ensamblador
  36.       }
  37.       us_count--;                                            //Decremento del valor de delay_ms
  38.    }
  39. }
  40. //*********************************************************************************************************
  41. // delay_ms Bloqueante Mili Segundos
  42. //*********************************************************************************************************
  43. void delay_ms(unsigned int us_count){                        //Funcion para delay_ms de micro-segundos
  44.    while(us_count!=0){                                       //Mientras que el contador es distinto de cero
  45.       delay_us(1000);                                        //Ejecuta funcion delay_ms micro segundos
  46.       us_count--;                                            //Decremento del valor de delay_ms
  47.    }
  48. }
  49. //*********************************************************************************************************
  50. // Configuracion ADC pin P0.0
  51. //*********************************************************************************************************
  52. void configuraADC(void){
  53.    #define VREF 3                                            //Tensión de referencia interna
  54.    P0MDIN=0xFE;                                              //Selecciona pin P0.0 como canal ADC
  55.    P0SKIP=0x01;                                              //Decodificacion Crossbar
  56.    ADC0CF=0xF8;                                              //Habilita ADC 0
  57.    ADC0CN=0x80;                                              //Habilita conversion en registro
  58. }
  59. //*********************************************************************************************************
  60. // Funcion para inicializar el puerto serie 9600 @ 11.059MHz
  61. //*********************************************************************************************************
  62. void serialInit(void){                                       //Funcion para configurar UART
  63.     TMOD=0x20;                                               //Timer 1 en modo 2 - Auto recarga para generar Baudrate
  64.     SCON=0x50;                                               //Serial modo 1, 8bit de dato, 1bit de start, 1bit de stop
  65.     TH1=0xFD;                                                //Carga el baudrate en el timer a 9600bps
  66.     TR1=1;                                                   //Dispara el timer
  67.  }
  68. //*********************************************************************************************************
  69. // Trama DHT11 - Segun Datasheet
  70. // ____             ____      ____                                       ___
  71. //     |___________|    |____|    |.....................................|
  72. //     |   18ms    |    |80us|80us|               5x8 bit               |
  73. //     |    PIC    |    |                  DHT11 respuesta              | Fin de
  74. //     |  request  |    |  2x80us, intRH, decRH, intT, decT, checksum   | Trama
  75. // ____          ________
  76. //     |________|        |...                        0 bit
  77. //      <-50us-> <-27us->
  78. // ____          _________________________
  79. //     |________|                         |...       1 bit
  80. //      <-50us-> <---------70us---------->
  81. //*********************************************************************************************************
  82. unsigned int trama[5];                                       //Vector donde se alojan los datos
  83. //*********************************************************************************************************
  84. // Funcion de recepcio de Byte
  85. // Lee el valor leido en la trama y lo separa realizando shift
  86. // Retorna el valor en forma de byte, es utilizado en la funcion recibeDato()
  87. //*********************************************************************************************************
  88. unsigned int recibeByte(){                                   //Funcion que recibe un Byte
  89.    unsigned int valorLeido = 0;                              //Valor de retorno de la funcion
  90.    int i=0;                                                  //Inicializacion del indice
  91.    for(i=0; i<8; i++){                                       //Iteracion para recepcion de bits
  92.       valorLeido <<= 1;                                      //Registro de desplazamiento de bits
  93.       while(DATA==0);                                        //Espera a DATA = 0
  94.       delay_us(30);                                          //Demora de 30us (Del Datasheet)
  95.       if(DATA==1){                                           //Pregunta si DATA = 1
  96.           valorLeido |= 1;                                   //Realiza toggle del valor leido
  97.       }
  98.       while(DATA==1);                                        //Espera a DATA = 1
  99.    }
  100.    return valorLeido;                                        //Retorna el valor leido
  101. }
  102. //*********************************************************************************************************
  103. // Funcion de recepcion de dato para el DHT11
  104. // Recive los valores de temperatura y humedad (parte entera y decimales por separado)
  105. // Recive el checksum enviado por el DHT11 y lo compara con el leido en el programa
  106. //*********************************************************************************************************
  107. unsigned int recibeDato(){                                   //Funcion que recibe el Dato
  108.    int validacion = 0;                                       //Variable de Validacion
  109.    int checksum = 0;                                         //Variable de deteccion de cambios de secuencia
  110.    int j=0;                                                  //Variable para el lazo for
  111.    DATA = 1;                                                 //Set DATA = 1  
  112.    DATA = 0;                                                 //Set DATA = 0
  113.    delay_ms(18);                                             //Demora de 18ms (Del Datasheet)
  114.    DATA = 1;                                                 //Set DATA = 1
  115.    delay_us(25);                                             //Demora de 25ms (Del Datasheet)
  116.    validacion = DATA;                                        //Mueve valor de DATA a Validacion
  117.    delay_us(80);                                             //Espera 80us (Del Datasheet)
  118.    validacion = DATA;                                        //Mueve valor de DATA a Validacion
  119.    if(!validacion){                                          //Si Validacion = 0, Error de secuencia
  120.       printf( "Error en Checksum \r");                       //Muestra leyenda de error
  121.    }
  122.    delay_us(80);                                             //Espera 80us (Del Datasheet)
  123.    for(j=0; j<5; j++){                                       //Lazo de carga de bytes de datos
  124.        trama[j] = recibeByte();                              //Carga del vector de datos
  125.    }
  126.    DATA = 1;                                                 //Set DATA = 1
  127.    for(j=0; j<4; j++){                                       //Lazo de carga de bytes de verificacion
  128.        checksum += trama[j];                                 //Carga de bytes de verificacion
  129.    }
  130.    if(checksum == trama[4]){                                 //Si la secuencia de verificacion es correcta
  131.       return 0;                                              //Se retorna 0 y se realiza la lectura
  132.    }
  133. }
  134. //*********************************************************************************************************
  135. // Lee DHT11
  136. //*********************************************************************************************************
  137. void leeDHT11(void){                                         //Funcion que lee el DHT11
  138.    if(recibeDato()==0){                                      //Consulta si hay dato en la entrada del DHT11
  139.       datoInt[0]=trama[2];                                   //Carga el valor de temperatura DHT en byte 1 del payload
  140.       datoInt[1]=trama[0];                                   //Carga el valor de humedad DHT en byte 2 del payload
  141.    }
  142. }
  143. //*********************************************************************************************************
  144. // Funcion que realiza la lectura del sensor LDR y acondiciona el valor
  145. //*********************************************************************************************************
  146. int lecturaLDR(void){                                        //Funcion que realiza la lectura del ADC para el LDR
  147.    unsigned int adval;                                       //Variable donde se guarda el valor del ADC
  148.    AD0BUSY=1;                                                //Inicia conversion de ADC
  149.    while(AD0BUSY);                                           //Espera que finalice la conversion
  150.    adval=ADC0L;                                              //Lee el ADC de 0 a 511
  151.    return(adval);                                            //Retorna el valor del ADC canal 0
  152. }
  153. //*********************************************************************************************************
  154. // Funcion para enviar byte por puerto serie
  155. //*********************************************************************************************************
  156. void sendByte(unsigned char serialdata){
  157.    SBUF=serialdata;                                          //Carga el dato a enviar por uart
  158.    while(TI==0);                                             //Espera a la transmicion completa
  159.    TI=0;                                                     //Borra el flag de transmision
  160. }
  161. //*********************************************************************************************************
  162. // Funcion que realiza el parse de datos y armado del payload para enviar por UART
  163. //*********************************************************************************************************
  164. void enivaRF(void){                                          //Declaración de función para enviar datos
  165.    payload[0]=HEADER;                                        //Carga el Header en byte 0 del payload
  166.    payload[4]=payload[1]+payload[2]+payload[3];              //Realiza suma de los tres datos y lo carga en el byte 4 del payload
  167.    sendByte(payload[0]);                                     //Envía el byte 0 del payload por UART
  168.    delay_ms(50);                                             //Delay de espera entre bytes enviados por UART
  169.    sendByte(payload[1]);                                     //Envía el byte 1 del payload por UART
  170.    delay_ms(50);                                             //Delay de espera entre bytes enviados por UART
  171.    sendByte(payload[2]);                                     //Envía el byte 2 del payload por UART
  172.    delay_ms(50);                                             //Delay de espera entre bytes enviados por UART
  173.    sendByte(payload[3]);                                     //Envía el byte 3 del payload por UART
  174.    delay_ms(50);                                             //Delay de espera entre bytes enviados por UART
  175.    sendByte(payload[4]);                                     //Envía el byte 4 del payload por UART
  176.    delay_ms(50);                                             //Delay de espera entre bytes enviados por UART
  177.    printf("\r");                                             //Envía caracter de retorno de linea como final de payload
  178. }
  179. //*********************************************************************************************************
  180. // Programa principal, Realiza la lectura de DHT11, lectura de bateria y recibe los datos por UART
  181. // Lee la temperatura y humedad interna, realiza un pronóstico aproximado
  182. //*********************************************************************************************************
  183. void main(){                                                 //Funcion principal
  184.    serialInit();    
  185.    configuraADC();                                           //Función que configura ADC
  186.    while(1){                                                 //Loop principal infinito
  187.       if(recibeDato()==0){                                   //Consulta si hay dato en la entrada del DHT11
  188.          payload[1]=trama[2];                                //Carga el valor de temperatura DHT en byte 1 del payload
  189.          payload[2]=trama[0];                                //Carga el valor de humedad DHT en byte 2 del payload
  190.          payload[3]=lecturaLDR();                            //Carga el valor de luminosidad en el byte 3 del payload
  191.          enivaRF();                                          //Llamado a la función que envía datos
  192.       }      
  193.       delay_ms(2304);                                        //Delay del timer de sleep*
  194.    }
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement