C1 - Semáforo de Veíc. e Ped. com Máquina de Estados
MicrocontroladorPICPIC16F887MPLABX-XC8SimulIDE 2021-04-20Semáforo
Objetivo
Simular um semáforo de veículos e de pedestre, incluindo o botão para bloqueio da via e liberação da atravessia aos pedestres utilizando uma máquina de estados.
Conteúdo
- Estrutura condicional
switch case
; - Máquina de estados.
Circuito (Hardware)
Figura 1: Semáforo de Veículos para uma via simples com botão de pedestre |
---|
![]() |
Programa (Firmware)
Figura 2: Árvore de diretório do projeto |
---|
![]() |
Biblioteca local delay
#include <xc.h>
#include "delay.h"
void delay( unsigned int t )
{
while( t )
{
__delay_ms( 1 );
--t;
}
}
#ifndef DELAY_H
#define DELAY_H
#define _XTAL_FREQ 4000000
void delay( unsigned int t );
#endif
Biblioteca local semáforo
#include <xc.h>
#include "semaforo.h"
void semaforo_init( void )
{
// Configuração dos pinos
TRISDbits.TRISD7 = 0; // Saída: Vermelho veículos
TRISDbits.TRISD6 = 0; // Saída: Amarelo veículos
TRISDbits.TRISD5 = 0; // Saída: Verde veículos
TRISDbits.TRISD3 = 0; // Saída: Vermelho pedestre
TRISDbits.TRISD2 = 0; // Saída: Verde pedestre
TRISDbits.TRISD0 = 1; // Entrada: Botão pedestre
// Inicialização do estado dos LEDs
PORTDbits.RD7 = 0;
PORTDbits.RD6 = 0;
PORTDbits.RD5 = 0;
PORTDbits.RD3 = 0;
PORTDbits.RD2 = 0;
}
char botao_pedestre( void )
{
return( PORTDbits.RD0 );
}
void semaforo( unsigned char cor )
{
PORTDbits.RD2 = 0;
PORTDbits.RD3 = 0;
PORTDbits.RD5 = 0;
PORTDbits.RD6 = 0;
PORTDbits.RD7 = 0;
switch( cor )
{
case VERMELHO:
PORTDbits.RD7 = 1;
PORTDbits.RD2 = 1;
break;
case AMARELO:
PORTDbits.RD6 = 1;
PORTDbits.RD3 = 1;
break;
case VERDE:
PORTDbits.RD5 = 1;
PORTDbits.RD3 = 1;
break;
}
}
#ifndef SEMAFORO_H
#define SEMAFORO_H
#define VERMELHO 'R'
#define AMARELO 'Y'
#define VERDE 'G'
void semaforo_init( void );
char botao_pedestre( void );
void semaforo( unsigned char cor );
#endif
Programa principal
/*
* File: main.c
* Author: josewrpereira
*
* Created on 20 April 2021, 20:42
*
* 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:
* Simular um semáforo de veículos e de pedestre,
* incluindo o botão para bloqueio da via e
* liberação da atravessia aos pedestres
* utilizando Máquina de Estados.
*
*
* Pinos |nº |Conexão
* VDD |11,32 | Alimentação (Vcc/+5V)
* VSS |12,31 | Alimentação (GND/0V)
* RD7 |30 | LED Vermelho Veículos (source)
* RD6 |29 | LED Amarelo Veículos (source)
* RD5 |28 | LED Verde Veículos (source)
* RD3 |22 | LED Vermelho Pedestres(source)
* RD2 |21 | LED Verde Pedestres(source)
* RD0 |19 | Botão Pulsador Pedestres (pullDown)
*
*/
#include "config.h"
#include <xc.h>
#include "semaforo.h"
#include "delay.h"
void main(void)
{
char estado = 0;
int tempo;
semaforo_init();
while( 1 )
{
switch( estado )
{
case 0:
semaforo( VERDE );
estado = 1;
break;
case 1:
if( botao_pedestre() )
estado = 2;
break;
case 2:
tempo = 2000;
estado = 3;
break;
case 3:
delay(1);
--tempo;
if( tempo == 0 )
estado = 4;
break;
case 4:
semaforo( AMARELO );
estado = 5;
break;
case 5:
tempo = 3000;
estado = 6;
break;
case 6:
delay(1);
--tempo;
if( tempo == 0 )
estado = 7;
break;
case 7:
semaforo( VERMELHO );
estado = 8;
break;
case 8:
tempo = 5000;
estado = 9;
break;
case 9:
delay(1);
--tempo;
if( tempo == 0 )
estado = 0;
break;
}
}
}
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 - Semáforo de Veículos e de Pedestres « C1 - Semáforo com Máquina de Estados » C1 - Partida Estrela/Triângulo »