/********************************************************** Projet : tp5_1.prj Fichier(s) : TP_51.c Objet : Commande d'un chenillard via une liaison serie Auteurs : Hensinger Benoît / Cuenot Gaël Binome : 3 Groupe : RLI 1 Date création : **********************************************************/ // 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 BS 0x08 // Fonctions externes : // Fonctions locales (Prototypes) : void tempo(unsigned int); // Fonction temporisation (delai) void it_uart(void) interrupt 4 using 1; void send_char_uart(char val); void send_string_uart(char *chaine); // Definitions particulières (zone SFR ou RAM externe) : at 0x90 sbit in_bpmode; // in_bpmode est le nom donné à la ligne P1.0 (adr. 0x90) at 0xFC sbit out_led; // out_led est le nom donné à la led P5.4 (jour) at 0xCC sfr16 THL2; at 0xCA sfr16 CRCHL; at 0x8000 xdata unsigned char low_BG; at 0x9000 xdata unsigned char high_BG; // Variables Globales : bit ok_trans,new; int cpt,indice,free_cpt,i; unsigned char menu; code unsigned char Tab_Val[6]={0x04,0x08,0x10,0x20,0x40,0x80}; //code unsigned char Tab_Val0x0000,0x0001,0x0003,0x0007,0x000F,0x001F,0x003F,0x007F,0x00FF,0x01FF,0x03FF}; // ================ 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_51 CHENILLARD\n"); //printf("\n\n---> ARRET <---"); //Parametre du timer T2: CRCHL=-50000/1; //periode T2=2ms T2PS=0; //Timer a FQ/12 THL2=CRCHL; //chargement T2R0=0; T2R1=1; //auto-reload T2I0=1; T2I1=0; //mode timer TF2=0; ET2=1; //reset flag autorisation IRQ //Parametre de l'UART SM0=0; //Mode 1,8 bits de données,bdrate variable SM1=1; SM2=1; BD=1; //Generateur de bdrate interne PCON=PCON|0x80; //Reglage SMOD : vitesse 9600 bauds (fq=12Mhz) REN=1; //Autorisation IRQ en reception RI=0; //Reset flag reception TI=0; //Reset flag emission ES=1; //Autorisation IRQ individuelle UART ok_trans=1; //UART prete a emettre //Def des priorites IP0=(IP0&0xD7)|0x18; //priorite maximum sur arret puis sur timer IP1=(IP1&0xD7)|0x10; EAL=1; //Autorisation globale //send_char_uart('a'); send_string_uart("\n\rMenu du chenillard\n\n\r"); send_string_uart("1.Arret \n\r"); send_string_uart("2.Rotation Droite \n\r"); send_string_uart("3.Rotation a gauche\n\r"); cpt=0; while(1); } // end main /******************************************************** Nom : it_uart Objet : gestion de l'interruption de l'uart Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_uart(void) interrupt 4 using 1 { char val; if(RI==1) { RI=0; val=SBUF; if('1'<=val && val<='3') { menu=val; printf("\n\nchoix: %c ",menu); new=1; } } else { TI=0; ok_trans=1; } } /******************************************************** Nom : it_T2 Objet : Affichage multiplexé Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_T2(void)interrupt 5 using 3 { TF2=0; if(new==1) { new=0; send_char_uart(BS); send_char_uart(menu); } cpt++; if(cpt>10) { switch(menu) { case '1': printf("\n\n> TP5.1 ARRET <"); TF2=0; //Interdiction timer break; case '2': i=i-1; if(i<0) i=5; printf("\n\nRotation Droite "); break; case '3': i=i+1; if(i>5) i=0; printf("\n\nRotation Gauche "); break; default: break; } high_BG=Tab_Val[i]; cpt=0; } } /******************************************************** Nom : send_char_uart Objet : Envoye un caractere Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void send_char_uart(char val) { //char val; while(ok_trans==0) { } SBUF=val; ok_trans=0; } //Retour /******************************************************** Nom : send_string_uart Objet : Envoye une chaine de caracteres Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void send_string_uart(char *chaine) { while((*chaine)!='\0') { send_char_uart(*chaine); chaine++; } } //Retour /******************************************************** 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