Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.13 KB | None | 0 0
  1. // CONFIG
  2. #pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
  3. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  4. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  5. #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
  6. #pragma config LVP = ON        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
  7. #pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
  8. #pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
  9. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  10.  
  11.  
  12. #include <xc.h> //Inclusão do arquivo header xc.h
  13. #include <string.h>
  14. #include <stdlib.h> //Conversões
  15. #include <stdio.h>
  16. #define _XTAL_FREQ 4000000 //Define a frequência de clock utilizada
  17.  
  18. //Protótipos das funções********************************************************
  19. void lcd_ini();
  20. void lcd_cmd(char cmd);
  21. void lcd_envia_byte(char nivel, char dado);
  22. void lcd_envia_string(char mensagem[]);
  23. void lcd_pos_xy(char x, char y);
  24. void Setup();
  25. void le_peso();
  26. void init_timer();
  27.  
  28. //DEFINES***********************************************************************
  29. #define TIPO        PORTBbits.RB0  //Pino botão  muda tipo
  30. #define PESAGEM     PORTBbits.RB1  //Pino  botão verifica pesagem
  31. #define SENSORPRE   PORTBbits.RB2  //Pino botão sensor presença (com retenção)
  32. #define LED         PORTBbits.RB3  //Saída que aciona LEDs
  33.  
  34. #define PESOLIMITETOCO      7.5
  35. #define PESOLIMITETRUCK     12.5
  36. #define PESOLIMITECARRETA   40
  37. //Variáveis*********************************************************************
  38. bit auxTIPO     = 0;    //Auxiliar do botao tipo
  39. bit auxPESAGEM  = 0;    //Auxiliar referente a esta rou nao na pesagem
  40.  
  41. unsigned int adc  = 0;    //Leitura realizada na porta analogica (PESO)
  42. float        Peso = 0;    //Conversão da leitura analógica para toneladas
  43.  
  44. unsigned char contTIPO = 0; //Auxilia na escolha do tipo de caminhão
  45.  
  46. int counter = 0; //Contador do timer 0
  47.  
  48. void main(void)
  49. {
  50.  Setup(); //Chama tela de configurações
  51.  
  52.  while(1) //Loop principal
  53. {
  54.      if ((!PESAGEM) && (!SENSORPRE) && (auxPESAGEM == 0)) //Se presisonado pesagem e o
  55.      {                                                    //Caminhão já estiver na posição adequada para isso
  56.          auxPESAGEM = 1;
  57.          switch (contTIPO) //DEPEONDENDO DO TIPO ESCOLHIDO COMPARA COM
  58.         {                  //UM DIFERENTE LIMITE DE PESO
  59.             case 0: if (Peso <= PESOLIMITETOCO) //Se estiver dentro do limite para TOCO
  60.                     {
  61.                        lcd_envia_byte(0, 0x01); //Limpa
  62.                        lcd_pos_xy(5,1);
  63.                        lcd_envia_string("PESO  OK");
  64.                     }
  65.                     else //Se não
  66.                     {
  67.                        lcd_envia_byte(0, 0x01); //Limpa
  68.                        lcd_pos_xy(1,1);
  69.                        lcd_envia_string(" ACIMA  DO PESO ");
  70.                     }
  71.             break;
  72.  
  73.             case 1: if (Peso <= PESOLIMITETRUCK) //Se estiver dentro do limite para TOCO
  74.                     {
  75.                        lcd_envia_byte(0, 0x01); //Limpa
  76.                        lcd_pos_xy(5,1);
  77.                        lcd_envia_string("PESO  OK");
  78.                     }
  79.                     else //Se não
  80.                     {
  81.                        lcd_envia_byte(0, 0x01); //Limpa
  82.                        lcd_pos_xy(1,1);
  83.                        lcd_envia_string(" ACIMA  DO PESO ");
  84.                     }
  85.             break;
  86.  
  87.             case 2: if (Peso <= PESOLIMITECARRETA) //Se estiver dentro do limite para TOCO
  88.                     {
  89.                        lcd_envia_byte(0, 0x01); //Limpa
  90.                        lcd_pos_xy(5,1);
  91.                        lcd_envia_string("PESO  OK");
  92.                     }
  93.                     else //Se não
  94.                     {
  95.                        lcd_envia_byte(0, 0x01); //Limpa
  96.                        lcd_pos_xy(1,1);
  97.                        lcd_envia_string(" ACIMA  DO PESO ");
  98.                     }
  99.             break;
  100.         }
  101.      }
  102.      if (SENSORPRE) { auxPESAGEM = 0; }
  103.      
  104.      if (auxPESAGEM == 0) //Se nao estiver no momento de pesagem
  105.      {
  106.         //Escrevendo o tipo de caminhão e o peso atual
  107.         lcd_pos_xy(1,1);
  108.         lcd_envia_string("Peso: ");
  109.         lcd_pos_xy(1,2);
  110.         lcd_envia_string("Tipo: ");
  111.  
  112.         le_peso(); //Chama a função que realiza leitura da analógica
  113.  
  114.         //Mostrando PESO no LCD
  115.         unsigned char BufLCD[10];                 //Vetor p/ armazenamento de strings p/ o LCD  
  116.         sprintf(BufLCD,"%.2f  TON", Peso);  //Armazena em buffer a string a ser enviada ao LCD
  117.         if (Peso < 10)
  118.         {
  119.             lcd_pos_xy(7,1);
  120.             lcd_envia_string("0");              //Escreve no LCD
  121.             lcd_pos_xy(8,1);
  122.             lcd_envia_string(BufLCD);              //Escreve no LCD
  123.         }
  124.         else
  125.         {
  126.             lcd_pos_xy(7,1);
  127.             lcd_envia_string(BufLCD);              //Escreve no LCD
  128.         }
  129.  
  130.         switch (contTIPO) //DEPEONDENDO DO TIPO ESCOLHIDO MOSTRA
  131.         {                 //DIFERENTES TIPOS DE CAMINHÕES
  132.             case 0: lcd_pos_xy(7,2);
  133.                     lcd_envia_string("TOCO      ");
  134.             break;
  135.  
  136.             case 1: lcd_pos_xy(7,2);
  137.                     lcd_envia_string("TRUCK     ");
  138.             break;
  139.  
  140.             case 2: lcd_pos_xy(7,2);
  141.                     lcd_envia_string("CARRETA   ");
  142.             break;
  143.         }
  144.  
  145.         if ((!TIPO) && (auxTIPO == 0) && (SENSORPRE)) //Se pressionar o botão tipo
  146.         {
  147.             auxTIPO = 1;
  148.             contTIPO++; //Troca     1 - TOCO 2 - TRUCK 3 - CARRETA
  149.             if (contTIPO == 3)
  150.             {
  151.                 contTIPO = 0;
  152.             }
  153.         }
  154.         if (TIPO) auxTIPO = 0;
  155.      }
  156. }
  157. } //Final da função principal (main)
  158.  
  159. void le_peso() //Função de leitura de analógica
  160. {
  161.     ADCON0bits.GO = 1; //Inicia a conversão A/D
  162.  
  163.     while (ADCON0bits.GO); //Aguarda a finalização da conversão
  164.  
  165.     adc = ADRESH; //Armazena a parte alta do resultado em adc
  166.     adc = (adc << 8) + ADRESL; /*Desloca 8 bits à esquerda e soma com a
  167.     parte baixa do resultado da conversão A/D.*/
  168.    
  169.     Peso = (adc*0.0488758553); //Conversão de adc para toneladas
  170. }
  171.  
  172. void interrupt chk_isr() //INTERRUPÇÃO QUANDO
  173. {
  174.     if((TMR0IE)&&(TMR0IF)) //Timer 0 estiver habilitado e der overflow
  175.     {
  176.         TMR0 = 5;
  177.         INTCONbits.TMR0IF=0; //Reseta overflow
  178.         counter++; // Conta
  179.        
  180.         if (SENSORPRE)
  181.         {
  182.             if (counter >= 500)
  183.             {
  184.               counter = 0;
  185.               LED = !LED;  
  186.             }          
  187.         }
  188.         else
  189.         {
  190.             if (counter >= 1000)
  191.             {
  192.               counter = 0;
  193.               LED = !LED;  
  194.             }  
  195.         }
  196.     }
  197. }
  198.  
  199. void init_Timer()
  200. {
  201.     OPTION_REG = 0x01; // 0x08 = 00000000 - 8 BITS  e PRESSCALER 1:4    
  202.                   // RBPU = 0 | INTEDG = 0 | T0CS  = 0 | T0SE  = 0 |
  203.                   // PSA   = 0 | TOPS2  = 0 | TOPS1 = 0 | TOPS0 = 1 |
  204.     INTCON = 0xE0;  // 0xE4 = 11100100      
  205.                     // GIE  = 1 | PEIE   = 1 | TMR0IE  = 1 | INT0IE = 0 |
  206.                     // RBIE = 0 | TMR0IF = 0 | INTOIF = 0 | RBIF   = 0 |
  207.    
  208.     TMR0 = 5; // Turn on T0
  209. }
  210.  
  211. void Setup()
  212. {
  213.     //Início da função principal (main)
  214.     lcd_ini(); //Inicializa LCD
  215.     lcd_envia_byte(0, 0x01); //Limpa
  216.  
  217.     TRISB=0b00000111;
  218.     PORTB=0x00; //Poe PORTB em zero
  219.    
  220.     ADCON0 = 0b11001001; /* Bits 7 e 6 = 1 ? Clock através do oscilador interno
  221.     bits 5, 4 = 0 e 3 = 1 ? Seleção do canal analógico AN1
  222.     bit 1 = 0 ? Conversão A/D não iniciada
  223.     bit 0 = 1 ? Módulo A/D habilitado */
  224.  
  225.     ADCON1 = 0b10000100; /*Bit 7 = 1 ? Resultado da conversão justificado à
  226.     direita. bits 3, 2, 1 e 0 = 0 ? Referências de tensão pelo VDD e GND*/
  227.     init_Timer(); // Inicia timer 0
  228. }
  229.  
  230. void lcd_ini()
  231. { //Incício da função lcd_ini
  232.     char i; //Variável de controle para envio dos comandos
  233.     TRISD = 0b00000000; //Todos os pinos da porta D configurados como saída
  234.     TRISEbits.TRISE1 = 0; //Pino 1 da porta E configurado como saída
  235.     TRISEbits.TRISE0 = 0; //Pino 0 da porta E configurado como saída
  236.     PORTD = 0b00000000; //Toda porta D em nível lógico 0
  237.     PORTEbits.RE0 = 0; //Pino 0 da porta E em nível 0
  238.     PORTEbits.RE1 = 0; //Pino 1 da porta E em nível 0
  239.     __delay_ms(15); //Atraso de 15ms
  240.     //Envia o comando 0x30 ao LCD por 3 vezes, em intervalos de 5ms
  241.     for(i=0;i<=2;i++)
  242.     {
  243.     lcd_cmd(0x30);
  244.     __delay_ms(5);
  245.     }
  246.      lcd_cmd(0x02); //LCD deve trabalhar com 4 bits de dados
  247.      __delay_us(40); //Atraso de 40us
  248.     lcd_cmd(0x28); //Comunicação em 4 bits, display de 2 linhas e matriz 7X5
  249.      __delay_us(40); //Atraso de 40us
  250.     lcd_cmd(0x01); //Limpa a memória do LCD
  251.     __delay_ms(2); //Atraso de 2ms
  252.     lcd_cmd(0x0C); //Liga o display sem cursor
  253.      __delay_us(40); //Atraso de 40us
  254.     lcd_cmd(0x06); //Deslocamento do cursor à direita após um novo caractere
  255.     __delay_us(40); //Atraso de 40us
  256. } //Final da função lcd_ini()
  257.  
  258. void lcd_cmd(char cmd)
  259. { //Início da função lcd_cmd
  260.     PORTD = cmd & 0xF0; //Posiciona a parte mais significativa do byte na porta D
  261.     PORTEbits.RE1 = 1; //Coloca o pino 1 da porta E (EN) em 1
  262.     PORTEbits.RE1 = 0; //Coloca o pino 1 da porta E (EN) em 0
  263.      __delay_us(100); //Atraso de 100us
  264.  
  265.     PORTD = (cmd << 4) & 0xF0; /*Posiciona a parte menos significativa do byte na porta D*/
  266.     PORTEbits.RE1 = 1; //Coloca o pino 1 da porta E (EN) em 1
  267.     PORTEbits.RE1 = 0; //Coloca o pino 1 da porta E (EN) em 0
  268. } //Final da função lcd_cmd
  269.  
  270. void lcd_envia_byte(char nivel, char dado)
  271. { //Início da função lcd_envia_byte()
  272.     PORTEbits.RE0 = nivel; //Habilita comando ou escrita para o LCD
  273.     __delay_us(100); //Atraso de 100us
  274.     PORTEbits.RE1 = 0; //Coloca o pino 1 da porta E (EN) em 0
  275.    lcd_cmd(dado); //chama a função lcd_cmd com o parâmetro 'dado'
  276. } //Final da função lcd_envia_byte()
  277.  
  278. void lcd_envia_string(unsigned char mensagem[])
  279. {
  280.     for (int i=0; i<strlen(mensagem); i++)
  281.     {
  282.      lcd_envia_byte(1, mensagem[i]);  
  283.     }
  284. }
  285.  
  286. void lcd_pos_xy(char x, char y) //Função de posicionamento do cursor
  287. { char endereco; //Variável de informação para o endereço do cursor
  288.     if (y!=1) //Se o valor de y for 2
  289.     endereco = 0xC0; /*Então endereco vai ser igual a 0xC0 (endereço da segunda linha)*/
  290.     else //Senão
  291.     endereco = 0x80; /*Endereço vai ser igual a 0x80 (endereço da primeira linha)*/
  292.    
  293.     endereco = (endereco + x) - 1; /*Soma o valor de x à variavel endereco e decrementa 1*/
  294.     lcd_envia_byte(0,endereco); /*Chama a função lcd_envia_byte, com o valor 0,
  295.     informando para o LCD que será enviado um dado e
  296.     este dado está contido na variável endereço*/
  297. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement