Electgpl

PIC - DHT11 UART

Nov 19th, 2016
1,023
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <16F883.h>
  2. #FUSES NOWDT
  3. #FUSES HS
  4. #FUSES MCLR
  5. #use delay(clock=4000000)
  6. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  7. #define DATA PIN_B0                    //Pin del bus de un hilo para el DHT11
  8. unsigned int trama[5];                 //Vector donde se alojan los datos
  9. unsigned int recibeByte()              //Funcion que recibe un Byte
  10. {
  11.    unsigned int8 valorLeido = 0;       //Valor de retorno de la funcion
  12.    int8 i=0;
  13.    for(i=0; i<8; i++)                  //Iteracion para recepcion de bits
  14.    {
  15.       valorLeido <<= 1;                //Registro de desplazamiento de bits
  16.       while(!input(DATA));             //Espera a DATA = 0
  17.       delay_us(30);                    //Demora de 30us (Del Datasheet)
  18.       if(input(DATA))                  //Pregunta si DATA = 1
  19.       {
  20.           valorLeido |= 1;             //Realiza toggle del valor leido
  21.       }
  22.       while(input(DATA));              //Espera a DATA = 1
  23.    }
  24.    return valorLeido;                  //Retorna el valor leido
  25. }
  26. unsigned int recibeDato()              //Funcion que recibe el Dato
  27. {
  28.    int validacion = 0;                 //Variable de Validacion
  29.    int checksum = 0;                   //Variable de deteccion de cambios de secuencia
  30.    int8 j=0;                           //Variable para el lazo for
  31.    output_high(DATA);                  //Set DATA = 1  
  32.    output_low(DATA);                   //Set DATA = 0
  33.    delay_ms(18);                       //Demora de 18ms (Del Datasheet)
  34.    output_high(DATA);                  //Set DATA = 1
  35.    delay_us(25);                       //Demora de 25ms (Del Datasheet)
  36.    validacion = input(DATA);           //Mueve valor de DATA a Validacion
  37.    if(validacion)                      //Si Validacion = 1, Sensor no encontrado
  38.    {
  39.       printf( "Sensor no encontrado. \r");                      
  40.    }
  41.    delay_us(80);                       //Espera 80us (Del Datasheet)
  42.    validacion = input(DATA);           //Mueve valor de DATA a Validacion
  43.    if(!validacion)                     //Si Validacion = 0, Error de secuencia
  44.    {
  45.       printf( "Error en secuencia (Checksum) \r");  
  46.    }
  47.    delay_us(80);                       //Espera 80us (Del Datasheet)
  48.    for(j=0; j<5; j++)                  //Lazo de carga de bytes de datos
  49.    {
  50.        trama[j] = recibeByte();        //Carga del vector de datos
  51.    }
  52.    output_high(DATA);                  //Set DATA = 1
  53.    for(j=0; j<4; j++)                  //Lazo de carga de bytes de verificacion
  54.    {
  55.        checksum += trama[j];           //Carga de bytes de verificacion
  56.    }
  57.    if(checksum == trama[4])            //Si la secuencia de verificacion es correcta
  58.    {
  59.       return 0;                        //Se retorna 0 y se realiza la lectura
  60.    }
  61. }
  62. void main()
  63. {
  64.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  65.    setup_timer_1(T1_DISABLED);
  66.    setup_timer_2(T2_DISABLED,0,1);
  67.    while(TRUE)
  68.    {
  69.       if(recibeDato()==0)              //Si el retorno es 0, se imprime en terminal
  70.          printf( "Temp: %2u - R.H: %2u \r", trama[2], trama[0]);
  71.       delay_ms(500);
  72.    }
  73. }
RAW Paste Data