/*************************************************************************************** Projet : tp_1s.prj Fichier(s) : TP_1s.c Objet : Introduction au C sur microcontroleur Gestion du carrefour avec une base de temps logicielle Auteurs : Hensinger Benoît / Cuenot Gaël Groupe : RLI 1 Date création : 09 - 11 - 2001 ***************************************************************************************/ // Fichiers à inclure : #include // Commandes du moniteur de mise au point #include // déclaration des registres interne au µC 80C535(SFR) #include // Commandes de l'afficheur LCD #include // Equivalences : #define OFF 0 #define ON 1 // Fonctions externes : // RIEN // Fonctions locales (Prototypes) : void tempo(unsigned int); // Fonction temporisation (delai) void select_mode(void); // Fonction selection void mode_off(void); // Fonction mode OFF void mode_jour(void); // Fonction mode JOUR void mode_nuit(void); // Fonction mode NUIT void mode_clign(void); // Fonction mode CLIGNOTANT void erreur(void); // Fonction d'erreur au cas ou aucun mode valide ne serai selectionne // Definitions particulières (zone SFR ou RAM externe) : // RIEN // Variables Globales : code unsigned char Tab_voit[6]={0x21,0x22,0x24,0x0C,0x14,0x24}; // Tableau de valeurs des feux des voies principale et secondaire code unsigned char Tab_piet[6]={0x09,0x05,0x05,0x06,0x06,0x05}; // Tableau de valeurs des feux pietons code unsigned char Tab_tmp[6]={10000,1000,1000,5000,1000,1000}; // Tableau de valeurs des tempo code unsigned char Tab_mode[4]={0x80,0x10,0x20,0x40}; // Tableau de valeurs des feux de selection de mode int state=0; int mode=0; // ================ ZONE PROGRAMME ============================== /************************************************************************************* Nom : main() Objet : gestion de la led on/off P5.4 par le bouton mode P1.0 Paramètres : - d'appel : aucun - de retour : aucun **************************************************************************************/ void main() { clrscr(); printf("---> TP 1S <---\n"); printf(">> Mode: OFF << "); P4=0; // Mise a 0 des 2 ports P4 et P5 P5=0; I3FR=1; // Front montant sur P1.0 pour detection du mode IEX3=0; // Reset du flag mode_off(); // Au demarrage du programme le carrefour est en mode OFF while(1) // boucle infinie { if(IEX3 == 1) // Test si BP1.0 est appuye (selection) { select_mode(); } } } // end main /************************************************************************************* Nom : select_mode Objet : Selection du mode de fonctionnment des feux. Paramètres : - d'appel : aucun - de retour : aucun **************************************************************************************/ void select_mode(void) { tempo(100); // Anti-rebonds IEX3=0; // Reset du flag mode=mode++; if(mode > 3) mode=0; P5=(P5 & 0x0F) | Tab_mode[mode]; // Allume la led correspondant au mode en cours switch (mode) { case 0: // Mode OFF (tout le carrefour eteint) mode_off(); break; case 1: // Mode JOUR (fonctionnement normal du carrefour) mode_jour(); break; case 2: // Mode NUIT (voie principale au vert, mode_nuit(); // voie secondaire au rouge) break; case 3: // Mode CLIGNOTANT (tous les feux clignotent a l'orange, mode_clign(); //les feux pietons au rouge) break; default: // Si aucun mode correct n'est selectionne erreur(); break; } } // end select_mode /************************************************************************************* Nom : mode_off Objet : fonctionnement du carrefour en mode OFF. Paramètres : - d'appel : aucun - de retour : aucun **************************************************************************************/ void mode_off(void) { printf("\n\n>> Mode: OFF << "); P4=0; P5=(P5 & 0xF0) | 0; } // end mode_off /************************************************************************************* Nom : mode_jour Objet : fonctionnement du carrefour en mode JOUR. Paramètres : - d'appel : aucun - de retour : aucun **************************************************************************************/ void mode_jour(void) { printf("\n\n>> Mode: JOUR <<"); P4=(P4 & 0xC0) | Tab_voit[state]; P5=(P5 & 0xF0) | Tab_piet[state]; tempo(Tab_tmp[state]); state++; if(state > 5) state=0; } // end mode_jour /************************************************************************************* Nom : mode_nuit Objet : fonctionnement du carrefour en mode NUIT. Paramètres : - d'appel : aucun - de retour : aucun **************************************************************************************/ void mode_nuit(void) { if(state == 0) { printf("\n\n>> Mode: NUIT <<"); P4=(P4 & 0xC0) | Tab_voit[0]; P5=(P5 & 0xF0) | Tab_piet[0]; } else mode_jour(); } // end mode_nuit /************************************************************************************* Nom : mode_clign Objet : fonctionnement du carrefour en mode CLIGNOTANT. Paramètres : - d'appel : aucun - de retour : aucun **************************************************************************************/ void mode_clign(void) { printf("\n\nMode: CLIGNOTANT"); P4=0x12; P5=(P5 & 0xF0) | 0x05; tempo(500); P4=0; tempo(500); } // end mode_clign /************************************************************************************* Nom : erreur Objet : Signale qu'aucun mode de fonctionnement valide n'est selectionne et fait fonctionner le carrefour en mode clignotant. Paramètres : - d'appel : aucun - de retour : aucun **************************************************************************************/ void erreur(void) { printf("\n\n !!! ERREUR !!! "); mode_clign(); } // end erreur /************************************************************************************* Nom : tempo Objet : base de temps logicielle de 1 ms Paramètres : - d'appel : durée de la tempo en ms - de retour : aucun **************************************************************************************/ void tempo(unsigned int t) { int ttempo; while (t != 0) { for (ttempo = 1;ttempo < 493;ttempo++); t--; // décrémentation de la variable de contrôle } } // end tempo