Vous êtes sur la page 1sur 4

Le schma est trs simple: les ports sur lesquels les LED sont raccordes sont configurs en sortie.

Le port
raccord l'unique interrupteur servant changer de mode est configur en entre, une rsistance de tirage
vers le bas l'accompagne.
Les LED jaunes et vertes utilises ici ont une tension directe " Vf " et un courant identique ( ce n'est

pas toujours le cas ), sachant qu'elles ne se seront jamais allumes en mme temps dans
un mme feu: on peut utiliser une rsistance commune.
Les rouges, ont une chute de tension diffrente, il leur faut donc une autre valeur de
rsistance de limitation.
C1 sert de dcouplage.

Avec l'extrme simplicit du schma de raccordement, il me fallait un contenu pouvant


meubler la page du site, c'est pourquoi je publie exceptionnellement le programme du
microcontrleur en langage pascal:
Message aux dbutant(e)s: Sachez que ma manire d'organiser un programme n'est pas forcment des plus
ordonne qui soit et que les noms de variables ne sont pas toujours bien choisis, ne soyez pas effray par
a. Je ne me considre pas du tout comme un exemple suivre en matire de programmation.
Tout ce qui crit en vert sont des commentaires pour aider la comprhension.

program feux_tricol_2012;
var temps,ts,cl,attente_nuit,cln,reprise:word; //variables
ctB,ctA,activation_cligno_piton_1,activation_cligno_piton_2,
mode_normal,activation_mode_nuit:byte; //variables
//Raccordements correspondants au schma:
// portB: b0 = vert_voie_1
b1 = orange_voie_1

//variables

b2 = rouge_voie_1

b3 =

vert_piton_1

b4 = rouge_piton_1

// b5 = vert_voie_2
b6 = orange_voie_2
b7 = rouge_voie_2
// portA: a0= vert_piton_2 a1 = rouge_piton_2
A2 = mode jour/nuit
procedure cligno_vert_voie2_piton;
// procdure de clignotement de la
LED verte du feu piton 2
begin
if cl > 250 then begin ctA.0:=1; end else begin ctA.0:=0; end;
end;
procedure cligno_vert_voie1_piton;
// procdure de clignotement de la
LED verte du feu piton 1
begin
if cl > 250 then begin ctB.3:=1; end else begin ctB.3:=0; end;
end;
procedure nuit;
// procdure de clignotement des feux
oranges en mode nuit
begin
if cln > 500 then begin ctb.1:=1; ctb.6:=1; end else begin ctb.1:=0; ctb.6:=0;
end;
end;

begin
// dbut
TRISA:=$1C; // 1C

(hexadcimal) correspond 11100 en binaire


(configuration port A)
TRISB:=$00; // 00 (hexadcimal) correspond 00000000 en binaire
(configuration port B)
ctB:=0; ctA:=0; portb:=0; porta:=0; temps:=0;
ts:=0; cl:=0; activation_cligno_piton_1:=0; activation_cligno_piton_2:=0;
activation_mode_nuit:=0;
attente_nuit:=0; mode_normal:=1; // tat
initiale des variables

while (1=1) do // bouble infinie


begin
delay_ms(1); // fixation de la base de temps dans le programme ( ce n'est pas
la meilleure mthode )
if activation_mode_nuit = 0 then begin inc(ts); end; // base de temps
if ts > 999 then begin inc(temps); ts:=0; end;
// base de temps

if mode_normal = 1 then

// mode mode_normal ( jour ):

begin
if temps = 1 then begin ctB.0:=1; ctB.4:=1; ctA.0:=1; ctB.7:=1; ctB.2:=0;
cta.1:=0; end;

if temps = 8 then begin ctB.0:=0; ctB.1:=1; activation_cligno_piton_2:=1;


end;
if temps = 11 then begin ctB.1:=0; ctB.2:=1; cta.1:=1; ctA.0:=0;
activation_cligno_piton_2:=0; end;
if temps = 13 then begin ctB.5:=1; ctB.7:=0; ctB.3:=1; ctB.4:=0; end;

if temps = 20 then begin ctB.5:=0; ctB.6:=1; activation_cligno_piton_1:=1;


end;
if temps = 23 then begin ctB.6:=0; ctB.7:=1; ctB.4:=1; ctB.3:=0;
activation_cligno_piton_1:=0; end;
if temps > 25 then begin temps:=0;

end;

end; // le groupe d'instructions ci-dessus sert commander l'allumage des


diffrentes LED ou appeler des procdures de clignotement situe tout en bas.

// entre en mode nuit ( si l'interrupteur est sur on ) et si la valeur de


"temps" le permet
if (((temps = 11)or(temps = 23))and(porta.2=1)) then
begin
activation_mode_nuit:=1;
reprise:=0;
mode_normal:=0;
end;

// reprise du mode jour (si l'interrupteur est sur off )


if (porta.2=0) then
begin
activation_mode_nuit:=0;
attente_nuit:=0;
if mode_normal = 0 then
begin
if reprise < 5000 then begin inc(reprise); end; // compter ( incrmenter
la variable "reprise")
if reprise = 10 then begin ctb.1:=1; ctb.6:=1; end;
// allumer feux oranges sur les 2 voies en fixe
if reprise = 2000 then begin ctb.1:=0; ctb.6:=0;
ctB.7:=1; cta.1:=1; end;
//teindres les oranges et allumer tous les rouges
end;

ctB.2:=1;

ctB.4:=1;

if reprise = 4999 then begin temps:=0; ts:=0; end;


if reprise = 5000 then begin mode_normal:=1; end; // permet de se rengager
dans le mode normal (jour)
end;

if (activation_mode_nuit = 1) then
begin
if attente_nuit < 2000 then begin inc(attente_nuit); end; // compter
( incrmenter la variable "attente_nuit")
if attente_nuit = 2000 then begin nuit; ctB.2:=0; ctB.4:=0; ctB.7:=0;
ctA.1:=0; end; // appeler la procdure
"nuit" et teindre tous les feux
rouges
end;

inc(cl); // sert fixer la frquence et le rapport cyclique du clignotement


des feux verts pitons
if cl > 500 then begin cl:=0; end; // (suite)
inc(cln); // sert fixer la frquence et le rapport cyclique des feux
oranges en mode nuit
if cln > 1000 then begin cln:=0; end; // (suite)

if activation_cligno_piton_1 = 1 then begin cligno_vert_voie1_piton; end; //


appel de la fonction clignotement
if activation_cligno_piton_2 = 1 then begin cligno_vert_voie2_piton; end; //
appel de la fonction clignotement
portb:=ctB;
chaque bits
porta:=ctA;
chaque bits
end;
end.

//
de
//
de

allumer ou teindre les LEDS du port B en fonction de l'tat de


la variable ctB
allumer ou teindre les LEDS du port A en fonction de l'tat de
la variable ctA