Exemple
de programme C - Commande 4 Quadrants
#pragma symbols code debug
objectextend optimize(4)
#include <reg51.h>
#include <stdio.h>
// robotaa2.c
// Amélioration de la correction trajectoire
// en inversant le sens de rotation des moteurs
//commandes L298 4 Quadrants 8capteurs HOA2498
sbit inGplus=P3^1; sbit inGmoins=P3^0;
sbit inDplus=P3^4; sbit inDmoins=P3^3;
sbit LED=P3^5;
//variables
unsigned char mem1;
unsigned char mem2;
unsigned char mem3;
unsigned char mem4;
unsigned char mem5;
unsigned char mem6;
unsigned char sensG;
unsigned char sensD;
unsigned char capt;
unsigned char ecart;
unsigned int i;
unsigned long j;
// Procédures d'interruptions
void MLID (void); //timer0 pour le moteurD
void MLIG (void); //timer1 pour le moteurG
void STOP (void); // Int0
//Prog principal
void main (void)
{
P1=0xFF;
TMOD=0x22;
//timer 1 en mode 2, timer 0 mode 8b horloge interne
ET0=1;ET1=1;EX0=1;IT0=0;PX0=1;EA=1; //INITs interruptions
TR0=1;TR1=1;
//Programme de suivi de ligne ***************************************
do
{
P1 = 0xFF;
capt = P1;
switch (capt) // codage de la position
{
case 0x7F : sensD=0;sensG=1;mem2 = 0xF0; mem4 =
0x80;LED=0;break;
case 0x3F : sensD=0;sensG=1;mem2 = 0xF0; mem4 =
0x40;LED=0;break;
case 0xBF : sensD=0;sensG=1;mem2 = 0xF0; mem4 =
0x20;LED=0;break;
case 0x9F : sensD=1;sensG=1;mem2 = 0xF0; mem4 =
0x00;LED=1;break;
case 0xDF : sensD=1;sensG=1;mem2 = 0xF0; mem4 =
0x20;LED=1;break;
case 0xCF : sensD=1;sensG=1;mem2 = 0xF0; mem4 =
0x40;LED=1;break;
case 0xEF : sensD=1;sensG=1;mem2 = 0xF0; mem4 =
0x80;LED=1;break;
case 0xE7 : sensD=1;sensG=1;mem2 = 0xF0; mem4 =
0xF0;LED=1;break;
case 0xF7 : sensD=1;sensG=1;mem2 = 0x80; mem4 =
0xF0;LED=1;break;
case 0xF3 : sensD=1;sensG=1;mem2 = 0x40; mem4 =
0xF0;LED=1;break;
case 0xFB : sensD=1;sensG=1;mem2 = 0x20; mem4 =
0xF0;LED=1;break;
case 0xF9 : sensD=1;sensG=1;mem2 = 0x00; mem4 =
0xF0;LED=1;break;
case 0xFD : sensD=1;sensG=0;mem2 = 0x20; mem4 =
0xF0;LED=0;break;
case 0xFC : sensD=1;sensG=0;mem2 = 0x40; mem4 =
0xF0;LED=0;break;
case 0xFE : sensD=1;sensG=0;mem2 = 0x80; mem4 =
0xF0;LED=0;break;
}
mem1=(255-mem2);
mem3=(255-mem4);
}
while(1);
}
// *************************************************************************
void MLID (void) interrupt 1 //Mli moteur D
{
if(sensD==1)
{
inDmoins=0;
inDplus=!inDplus;
if (inDplus==0)
TL0=mem4;
else TL0=mem3;
}
else
{
inDplus=0;
inDmoins=!inDmoins;
if (inDmoins==0)
TL0=mem4;
else TL0=mem3;
}
}
// **************************************************************************
void MLIG (void) interrupt 3 //Mli moteur G
{
if(sensG==1)
{
inGmoins=0;
inGplus=!inGplus;
if (inGplus==0)
TL1=mem2;
else TL1=mem1;
}
else
{
inGplus=0;
inGmoins=!inGmoins;
if (inGmoins==0)
TL1=mem2;
else TL1=mem1;
}
}
// ****************************************************
void STOP (void) interrupt 0 //Arret
{
inGplus = 0; inGmoins = 0;
inDplus = 0; inDmoins = 0;
TR0=0;
ET0=0;
TR1=0;
ET1=0;
for (;;);
}
|