Pesquisar neste blog

01/05/2021

Semáforo com PIC 16F877A

 Desafio1: construir um semáforo para carros e pedestre

Descrição do funcionamento.

O semáforo deve ficar sempre verde para os carros e vermelho para os pedestres. Entretanto
quando um pedestre acionar um dos botões colocados em ambos os lados da rua, o semáforo
inicia a sequência de liberação da passagem para ele. Essa sequência e descrita a seguir:

1. Em funcionamento sem pedestre o sinal é sempre verde para os carros e vermelho
para a passagem de pedestre

2. Após um pedestre pressionar o botão os sistema espera 10 segundo mantendo o
verde para os carros e vermelho para o pedestre.

3. Então, sinal muda amarelo para os carros e continua vermelho para os pedestre por 2
segundos.

4. Após o tempo com amarelo ligado, o sinal dos carros muda para vermelho, espera um
segundo e o sinal do pedestre vai para verde;

5. Depois de 10 segundos dando passagem para os pedestres, o sinal (do pedestre)
começa a piscar e fica assim por mais 5 segundos;

6. Então o sinal do pedestres fica vermelho.

7. Após um segundo o sinal para os carros muda para verde, mantendo assim até um
pedestre pressionar o botão novamente.


Figura 1 - Semáforo de pedestre
















Resolução:

Código feito em CCS Compiler

#include <16F877A.h>
#device adc = 8
#use delay(crystal = 20MHz)
#fuses HS, NOWDT, NOPROTECT, NOLVP
#define D1 1000
#define D2 2000
#define D3 3000
#define D4 100

//0b00000001 // vermelho carros
//0b00000010 // amarelo  carros
//0b00000100 // verde    carros
//0b00000001 // vermelho para carros e vermelho para pedestres
//0b01000100 // verde para carros e vermelho para pedestres
//0b01000010 // amarelo para carros e vermelho para pedestres

boolean flag = false;
int cont = 0;

void main(){

   while(TRUE){
      //TODO: User Code
      
      if(input(PIN_B0) == TRUE){
         flag = true;
         output_high(PIN_B1);
      }
      
      cont++;
      delay_ms(10);
      
      
      
      switch(cont){
         
         case 1:
            if(input(PIN_B0) == true){
               flag = true;
               output_high(PIN_B1);
            }
            
            output_d(0b01000100);
            delay_ms(D3);
            
            if(input(PIN_B0) == true){
               flag = true;
               output_high(PIN_B1);
            }
         break;
         
         case 2:
            if(input(PIN_B0) == true){
               flag = true;
               output_high(PIN_B1);
            }
         
           output_d(0b01000010);
           delay_ms(D2);
                                            
           if(input(PIN_B0) == true){
               flag = true;
               output_high(PIN_B1);
           }
           
         break;
         
         case 3:
            if(input(PIN_B0) == true){
               flag = true;
               output_high(PIN_B1);
            }
                  
            output_d(0b01000001);
            delay_ms(D3);
            
            if(input(PIN_B0) == true){
               flag = true;
               output_high(PIN_B1);
            }
            
            delay_ms(D4);
            
            if(flag == true){
               output_d(0b10000001);
               delay_ms(D3);
               
               for(int i = 0; i < 10; i++){
                  output_high(PIN_D7);
                  delay_ms(200);
                  output_low(PIN_D7);
                  delay_ms(200);
               }
               
               output_low(PIN_B1);
               flag = false;
               cont = 0 ;
            }
            cont = 0;
         break;   
         
      }
         
   }

}



Nenhum comentário: