1 pièce(s) jointe(s)
Gestion de feux tricolores avec un PIC 16F877A
Salut,
J'ai un projet en langage C. La description de ce projet est la suivante :
Le but est d'assurer la gestion de feux de trafic d'un carrefour. La solution est basée sur l'utilisation d'un micro-contrôleur PIC 16F877A.
La première partie de ce travail concerne la conception de la carte qui sert de simulateur. La seconde partie concerne la programmation du micro-contrôleur. La troisième partie est une validation de la solution proposée.
Description du cahier des charges : Le but est d'assurer la circulation des véhicules et des piétons au niveau d'un carrefour qui comporte 4 voies.
Fonctionnement du système :
Sur ce carrefour, les voies 1 et 3 fonctionnent ensemble ce qui signifie que le signal vert de la voie 1 et le signal vert de la voie 3 sont couplés et donc simultanément activés pour que le témoin vert de la voie 1 et le témoin vert de la voie 3 soient commandées ensembles : tous les deux allumés, ou tous les deux éteints. Il en va de même pour les témoins jaunes ainsi que pour les témoins rouges de ces deux voies. Les voies 2 et 4 sont couplées de la même façon.
Chaque voie est munie d'un passage réservé aux piétons protégé par deux signalisations Vip et Rip (i=1,2,3 ou 4). Lorsque les véhicules détiennent le contrôle des voies tous les voyants rouges piétons sont allumés. Un bouton-poussoir permet aux piétons de lancer une demande pour prendre le contrôle des voies. Une temporisation de 5 secondes est déclenchée, suite à laquelle tous les voyants rouges des 4 voies destinées aux voitures passent au rouge et les voyants verts destinés aux piétons passent au vert.
Ce cycle dure pendant 15 secondes. Les feux verts piétons clignotent alors 5 fois pendant 5 secondes. Puis le cycle de passage de véhicules reprend dans l'ordre des voies : 1, 2, 3, 4.
Un deuxième bouton-poussoir est prévu pour lancer le fonctionnement en mode clignotant des voyants oranges des 4 voies. Ce fonctionnement est très souvent utilisé la nuit lorsque la cadence du trafic diminue.
J'ai une solution concernant le feu rouge à deux voies :
Le premier fichier est prog.c :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include "C:\feudecarr\prog.h"
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_C(0xFF);
set_tris_b(0x00);
output_b(0x00);
do
{
if (input(PIN_C0)==1)
{
output_B(0b10010);
delay_ms(1000);
output_B(0);
delay_ms(1000);
}
else
{
output_b(0b100001);
delay_ms(5000);
output_b(0b000001);
delay_ms(500);
output_b(0b100001);
delay_ms(500);
output_b(0b000001);
delay_ms(500);
output_b(0b100001);
delay_ms(500);
output_b(0b000001);
delay_ms(500);
output_b(0b100001);
delay_ms(500);
output_b(0b010001);
delay_ms(1000);
output_b(0b001011);
delay_ms(1000);
output_b(0b001100);
delay_ms(5000);
output_b(0b001000);
delay_ms(500);
output_b(0b001100);
delay_ms(500);
output_b(0b001000);
delay_ms(500);
output_b(0b001100);
delay_ms(500);
output_b(0b001000);
delay_ms(500);
output_b(0b001100);
delay_ms(1000);
output_b(0b001010);
delay_ms(1000);
output_b(0b011001);
delay_ms(1000);
}
}
while(true);
} |
Le deuxième fichier est prog.h :
Code:
1 2 3 4
| #include <16F877.h>
#device adc=8
#use delay(clock=400000000)
#fuses NOWDT,RC, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG |
Mais je n'arrive pas à comprendre le code. Mais il est exécutable.
Mon but est de programmer un feu rouge a 4 voies en language C avec la notion de timer.
Quelqu'un peut-il m'aider ?
Voila le code ainsi que l'image mais je veux réaliser un feu rouge a 4 voies avec le code C.
programmtion pic 16F877A en C de feu rouge
salut,
voila un code qui est excutable est juste
mais le problemme est que ne supporte pas l'interruption
j'explique encore
je veux quand je clique sur RBO il me fait le premier code qui sert a clignote le feu rouge
si je lache le boutton il me fonctionne avec le deuxieme code qui est le fonctionnement normale de feu rouge et ainsi de suite
je suppose quand juste ajouter la notion d'interruption au niveau de portB
ce code il me tient juste l'etat initiale de port B
sans avoir le faite de taper sur le bouton
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
void main()
{
TRISC= 0x00;
TRISb =0xFF;
PORTB= 0xFF;
do
{
if (RB0 ==1)
{
PORTC = 0b10010;
delay_ms(1000);
PORTC = 0;
delay_ms(1000);
}
else
{
PORTC = 0b100001;
delay_ms(5000);
PORTC =0b000001;
delay_ms(500);
PORTC =0b100001;
delay_ms(500);
PORTC =0b000001;
delay_ms(500);
PORTC = 0b100001;
delay_ms(500);
PORTC = 0b000001;
delay_ms(500);
PORTC =0b100001;
delay_ms(500);
PORTC = 0b010001;
delay_ms(1000);
PORTC =0b001011;
delay_ms(1000);
PORTC =0b001100;
delay_ms(5000);
PORTC =0b001000;
delay_ms(500);
PORTC =0b001100;
delay_ms(500);
PORTC =0b001000;
delay_ms(500);
PORTC =0b001100;
delay_ms(500);
PORTC =0b001000;
delay_ms(500);
PORTC =0b001100;
delay_ms(1000);
PORTC =0b001010;
delay_ms(1000);
PORTC =0b011001;
delay_ms(1000);
}
}
while(1);
} |
SVP AIDEZ MOI C URGENT
merci d'avance