C1 - Semáforo de Veículos

MicrocontroladorPICPIC16F887MPLABX-XC8SimulIDE

Semáforo de Veículos

Objetivo

Acionar 3 saídas simulando um semáforo de veículos.

Conteúdo

  • Uso de definições;
  • Encapsulamento de trechos de código: procedimentos e funções;

Circuito (Hardware)

Figura 1: Semáforo de Veículos para uma via simples
circuito

Programa (Firmware)

Figura 2: Árvore de diretório do projeto
circuito
/*
 * File:   main.c
 * Author: josewrpereira
 *
 * Created on 15 April 2021, 21:11
 * 
 * IDE:                 MPLAB X IDE v5.45
 * Compiler:            XC8 v2.31
 * Operating System:    Debian GNU/Linux bullseye/sid
 * Kernel:              Linux 5.10.0-5-amd64
 * Architecture:        x86-64
 * 
 * Objetivo: 
 *      Acionar 3 saídas simulando um semáforo com os respectivos tempos:
 *          Vermelha: 5s
 *          Verde: 4s
 *          Amarela: 1s
 * 
 * 
 * Pinos    |nº     |Conexão
 *  VDD     |11,32  | Alimentação (Vcc/+5V)
 *  VSS     |12,31  | Alimentação (GND/0V)
 *  RD7     |30     | LED Vermelho (source)
 *  RD6     |29     | LED Amarelo (source)
 *  RD5     |28     | LED Verde (source)
 * 
 */

#include "config.h"
#include <xc.h>

#define _XTAL_FREQ  4000000

void main( void )
{
        // Configuração dos pinos
    TRISDbits.TRISD7 = 0;       // LED Vermelho
    TRISDbits.TRISD6 = 0;       // LED Amarelo
    TRISDbits.TRISD5 = 0;       // LED Verde
    PORTDbits.RD7 = 0;
    PORTDbits.RD6 = 0;
    PORTDbits.RD5 = 0;
    
    while( 1 )
    {
            // LED Vermelho
        PORTDbits.RD7 = 1;
        __delay_ms(5000);
        PORTDbits.RD7 = 0;

            // LED Verde                
        PORTDbits.RD5 = 1;
        __delay_ms(4000);
        PORTDbits.RD5 = 0;

            // LED Amarelo
        PORTDbits.RD6 = 1;
        __delay_ms(1000);
        PORTDbits.RD6 = 0;
    }
}

Utilização de #defines

#include "config.h"
#include <xc.h>

#define _XTAL_FREQ  4000000

#define SEMAFORO_VERMELHO   PORTDbits.RD7
#define SEMAFORO_AMARELO    PORTDbits.RD6
#define SEMAFORO_VERDE      PORTDbits.RD5

#define TEMPO_SEMAFORO_VERMELHO 5000
#define TEMPO_SEMAFORO_AMARELO  1000
#define TEMPO_SEMAFORO_VERDE    4000

void main(void)
{
        // Configuração dos pinos
    TRISDbits.TRISD7 = 0;
    TRISDbits.TRISD6 = 0;
    TRISDbits.TRISD5 = 0;
        // Inicialização do estado dos LEDs
    SEMAFORO_VERMELHO = 0;
    SEMAFORO_AMARELO = 0;
    SEMAFORO_VERDE = 0;

    while( 1 )
    {
        SEMAFORO_VERMELHO = 1;
        __delay_ms( TEMPO_SEMAFORO_VERMELHO );
        SEMAFORO_VERMELHO = 0;

        SEMAFORO_VERDE = 1;
        __delay_ms( TEMPO_SEMAFORO_VERDE );
        SEMAFORO_VERDE = 0;

        SEMAFORO_AMARELO = 1;
        __delay_ms( TEMPO_SEMAFORO_AMARELO );
        SEMAFORO_AMARELO = 0;
    }
}

Encapsulamento de código

#include "config.h"
#include <xc.h>

#define _XTAL_FREQ  4000000

#define SEMAFORO_VERMELHO   PORTDbits.RD7
#define SEMAFORO_AMARELO    PORTDbits.RD6
#define SEMAFORO_VERDE      PORTDbits.RD5

#define TEMPO_SEMAFORO_VERMELHO 5000
#define TEMPO_SEMAFORO_AMARELO  1000
#define TEMPO_SEMAFORO_VERDE    4000

void semaforo_init( void )
{
        // Configuração dos pinos
    TRISDbits.TRISD7 = 0;
    TRISDbits.TRISD6 = 0;
    TRISDbits.TRISD5 = 0;
        // Inicialização do estado dos LEDs
    SEMAFORO_VERMELHO = 0;
    SEMAFORO_AMARELO = 0;
    SEMAFORO_VERDE = 0;
}

void semaforo_vermelho( void )
{
    SEMAFORO_VERMELHO = 1;
    __delay_ms( TEMPO_SEMAFORO_VERMELHO );
    SEMAFORO_VERMELHO = 0;
}

void semaforo_verde( void )
{
    SEMAFORO_VERDE = 1;
    __delay_ms( TEMPO_SEMAFORO_VERDE );
    SEMAFORO_VERDE = 0;
}

void semaforo_amarelo( void )
{
    SEMAFORO_AMARELO = 1;
    __delay_ms( TEMPO_SEMAFORO_AMARELO );
    SEMAFORO_AMARELO = 0;
}

void main(void)
{
    semaforo_init();
    while( 1 )
    {
        semaforo_vermelho();
        semaforo_verde();
        semaforo_amarelo();
    }
}

Agora é a sua vez!

Crie o seu projeto, copie o código, execute-o, procure os erros, arrume-os, seja resiliente, leia novamente a explicação, busque outras fontes, pergunte, responda, faça alterações conscientes no código, explore, divirta-se.

Ficou alguma dúvida, entre em contato.

Bom trabalho!


« C1 - Botão pulsador e LED « C1 - Semáforo de Veículos » C1 - Semáforo de Veículos e de Pedestres »


Voltar