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:
Postar um comentário