Red de conocimiento informático - Conocimiento sistemático - Buscando un programa sencillo para el coche inteligente c51

Buscando un programa sencillo para el coche inteligente c51

Programa del microcontrolador del sistema

#include "reg52.h"

#define det_Dist 2.55 //La distancia recorrida por el automóvil correspondiente a un solo pulso, su el valor es el perímetro de la rueda/4

#define RD 9 //Longitud del eje diagonal del coche

#define PI 3.1415926

#define ANG_90 90

#definir ANG_90_T 102

#definir ANG_180 189

/*======================= === ===Área de definición de variables globales=============================*/

sbit P10= P1^0 ; //Controla la apertura y cierre del relé

sbit P11=P1^1; //Controla el interruptor de proximidad metálico

sbit P12=P1^2; /Controla la apertura y cierre del sensor de color

sbit P07=P0^7; //Controla la apertura de la señal luminosa y sonora

sbit P26=P2^6; /Recibe la señal del sensor de color, el blanco es 0, el negro es 1

sbit P24=P2^4; //Izquierdo

sbit P25=P2^5; la derecha recibe la señal de los sensores de luz izquierdo y derecho, y la luz es 0

unsigned char mType=0; //Establece el modo de movimiento, 0 adelante 1 izquierda 2 atrás 3 derecha

unsigned char Direction=0; //La dirección en tiempo real del automóvil 0 hacia arriba 1 Mirando hacia la izquierda 2 Mirando hacia abajo 3 Mirando hacia la derecha

unsigned sX=50; coordenadas de la esquina inferior derecha relativa del automóvil CM (sX, sY)

unsigned char StartTask=0; //Después de obtener la pieza de hierro, inicie la tarea de descarga de retorno y establezca StartTask en uno

unsigned char Inter_EX0=0; // Solo puede haber una interrupción externa durante la finalización de una tarea completa

// Inter_EX0 registra el estado de interrupción de la interrupción externa 0

// 0 La acción más reciente no ha sido interrumpida,

// 1 La acción más reciente ha sido interrumpida

unsigned char cntIorn=0 //Número de piezas de hierro

unsigned char bkAim=2; //Destino de regreso, 0 es el almacén A, 1 es el almacén B, 2 es el campo de estacionamiento,

//(Recibe la señal del color de la chapa de hierro sensor de juicio para asignar valor en PRINCIPAL)

unsigned char Light_Flag=0;//Bandera que ingresa al área de la guía de luz (1)

unsigned int cntTime_5Min=0; períodos de tiempo, utilizados para la sincronización precisa de T0

unsigned int cntTime_Plues=0; //El número de pulsos generados por el interruptor Hall

/*======== =====================Área de definición de variable global============== ============ ===*/

/*------------------------ ------------ --------------*/

/*--------------- --Programa de retardo general----- --------------*/

/*--------------- ---------- ------------------------*/

retraso nulo (unsigned int

tiempo) // tiempo*0.5ms de retraso

{

unsigned int i,j;

for(j=0;j

{

for(i=0;i<60;i++)

{;}

}

}

/*------------------------------------------------ ------- ---------*/

/*-------------------Módulo de control de pantalla- ------- --------*/

/*------------------------ ---------- ----------*/

/*La pantalla del tubo digital muestra el número de piezas de hierro (configuradas para ser conectado a P0, ***yin)*/

void Display(unsigned char n)

{

char Numb[12]={0x3F,0x06 ,0x5B,0x4F,0x66,0x6D,0x7D,0x07 ,0x7F,0x6F,0x37,0x77};

P0=Numb[n];

}

/*--------- -------------------------------------- --*/

/*- ------------------Módulo sensor---------------- --*/

/*- ------------------------------------ --------------*/

/*Programa de detección de fuente de luz: */

/*Se utiliza para corregir el funcionamiento correcto del coche. ruta*/

unsigned char LightSeek()

{ void Display(unsigned char);

bit l,r;

l =P24;

r=P25;

if(l==0&&r==1)

{

//Mostrar( 1);

return (3); //Izquierda, Abierto a la derecha

}

if(r==0&&l==1)

{

//Display(3);

return(1); //A la derecha, abre a la izquierda

}

if((l==1&&r==1)||(l ==0&&r==0))

{//Display(9);

return(0); //Sin desviación, avanzando

}

}

/*Programa de detección de chapa de hierro: */

/*Juzgue el color de la chapa de hierro, establezca bkAim, 0 es el almacén A, 1 es el almacén B, 2 es el estacionamiento*/

void IornColor()

{

retraso(4000);

bkAim=(int )(P26);

Pantalla((int)(P26)+2);

}

/*--------- ------------------------- ---------------*/

/*- ------------------Módulo de control de movimiento-- ---------------*/

/*-- ---------------------- -----------------*/

/*====Capa de acción básica: ensamblaje para completar acciones de movimiento básicas====*/

/*Programa de ajuste de movimiento: */

/* Bien -ajustar el movimiento del coche*/

void ctrMotor_Adjust(unsigned char t)

{

if(t==0)

{

P2=P2&240|11; //Se utiliza para resolver el problema de asimetría entre los dos motores

delay(6);

}

if(t==3)

{

P2=P2&250; //Ir a la izquierda

delay(1);

}

if(t==1)

{

P2=(P2&245);

retraso( 1) ; //Vaya a la derecha

}

P2=((P2&240)|15);

retraso(10);

}

/*Programa de caminata directa: */

/*Controla la distancia de movimiento del automóvil, dist es la distancia de movimiento (cm), el tipo es el modo de movimiento (0 2)*/

/*Solo cambia los valores del auto sX y sY sin cambiar el valor de Dirección */

void ctrMotor_Dist(float dist,tipo char sin signo. )

{unsigned char t=0;

mType=tipo;

P2=((P2&240)|15);

cntTime_Plues=(int)(dist/det_Dist) ;

mientras(cntTime_Plues)

{

if(Inter_EX0==1&&StartTask==0)

{

cntTime_Plues=0;

romper;

}

if(Light_Flag==1) t=LightSeek ();

if(type==0) //Avanzar

{

P2=P2&249;

retraso(40 );

ctrMotor_Adjust(t);

}

if(type==2) //Hacia atrás

{

P2=P2&246;

retraso(50);

ctrMotor_Adjust(t);

}

P2=( (P2&240)|15);

if(mType==2) retraso(60);//freno 0,5 ms

si no retraso(75);

}

}

/*Programa de giro: */

/*Controla el ángulo de movimiento del automóvil, el tipo es el modo de movimiento (1 3) */

/ *Solo cambia el valor de la dirección del automóvil sin cambiar los valores de sX y sY*/

void ctrMotor_Ang(unsigned char ang, unsigned char type, unsigned char dir)

{

carácter sin firmar i=0;

mType=tipo;

P2=((P2&240)|15 );

cntTime_Plue

s=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);

mientras(cntTime_Plues)

{

if(Inter_EX0==1&&StartTask==0)

{

cntTime_Plues=0;

descanso;

}

if(type==1) //Ir a la izquierda

{

P2=P2&250;

delay(100);

ctrMotor_Adjust(0);

}

if(type==3) //Vaya a la derecha

{

P2=P2&245;

retraso(100);

ctrMotor_Adjust(0);

}

P2=(( P2&240) |15);

retraso(50);//freno 0,5ms

}

if(!(Inter_EX0==1&&StartTask== 0))

{

Direction=dir;

}

}

/*=== =Capa de ruta básica : Un conjunto que describe la ruta básica de movimiento del automóvil====*/

/*Cuando el automóvil llegue al almacén o estacionamiento, coloque la pieza de hierro o deténgase (0, 1 para el almacén, 2 para el estacionamiento)*/

void rchPlace()

{unsigned int time,b,s,g;

time=(int )(cntTime_5Min* 0.065535);//Cuando solo hay un tubo digital, se muestra sucesivamente el número de segundos de todo el proceso.

b=time%100;

s=(tiempo-b*100)% 100;

g=(tiempo-b*100-s*10)%10;

if(bkAim==2)

{

//Llegado al parking, aparca el coche

EA=0;

P2=((P2&240)| 15);

mientras(1 )

{

Display(10); //N

retraso(2000);

Display(cntIorn);

p>

retraso(2000);

Display(11);//A

retraso(2000 );

Pantalla(b);

retraso(2000);

Pantalla(s);

retraso(2000);

Pantalla(g);

retraso(2000);

}

}

else

{

if( Inter_EX0==1&&StartTask==1)P10=0 //Llega al almacén y descarga las piezas de hierro

}

}

/*Modo sin tarea: */

/*Establece la ruta de movimiento fija del automóvil, la ruta de movimiento cuando no se encuentra ninguna pieza de hierro*/

void BasicRoute()

{ //Light_Flag =1;

ctrMotor_Dist(153,0);

//Light_Flag=0;

ctrMotor_Ang(ANG_90,1,1);

ctrMotor_

Dist(100-sX,0);

ctrMotor_Dist(125,2);

ctrMotor_Dist(73,0);

ctrMotor_Ang(ANG_90,1, 2);

//Light_Flag=1;

ctrMotor_Dist(153,0);

//Light_Flag=0;

ctrMotor_Ang(ANG_180,1,0);

rchPlace();

}

/*Modo de tarea: */

/ *Establece la ruta de movimiento del automóvil después de descubrir la pieza de hierro*/

void TaskRoute()

{

//Tabla de ruta de carrera básica, registrando la Gire en dirección 0 hacia adelante 1, gire a la izquierda 2, hacia atrás 3, gire a la derecha, lea hacia adelante y vaya al área A, lea hacia atrás y vaya al área B

StartTask=1;

ctrMotor_Ang(ANG_90_T,1,2);

if(bkAim==1) //Almacén A

{

ctrMotor_Dist(10,0);

P2=(( P2&240)|15);

retraso(60);

ctrMotor_Ang(ANG_90_T,1,3);

ctrMotor_Dist(100-sX,2);

ctrMotor_Ang(ANG_90_T,1,2);

Light_Flag=1;

ctrMotor_Dist(153,2) ;

Light_Flag= 0;

// ctrMotor_Ang(208,1,0);

}

else if(bkAim= =0) //Almacén B

{

ctrMotor_Dist(10,0);

P2=((P2&240)|15);

retraso(60);

p>

ctrMotor_Ang(ANG_90_T,1,3);

ctrMotor_Dist(100-sX,0);

ctrMotor_Ang (ANG_90_T,1,0);

Light_Flag=1;

ctrMotor_Dist(153,2);

Light_Flag=0;

//ctrMotor_Ang(208,1,0);

}

retraso(5000);

rchPlace();

}

/*-- -------------------------------------- ------------*/

/*-------------------Sección principal del programa----- -------------*/

/*-------------------------- ---------------------- */

void main()

{

delay(4000);

P2=0xff; //Puerto de inicialización

P07=0;

P1=0;

TMOD =0x01; //Inicializa el temporizador 0/1 y su interrupción

TL0 =0;

TH0=0;

TR0=1;

ET0=1;

ET1=1;

IT0=1; //Inicializar interrupción externa

EX0=

1;

IT1=1;

EX1=1;

EA=1;

P11=1;

mientras(1)

{

Display(cntIorn);

bkAim=2;

BasicRoute();

if(Inter_EX0==1)

{

TaskRoute();//Avanzar según la ruta tras obtener la pieza de hierro

IE0 =0;

EX0=1;

}

Inter_EX0=0;

}

}

/*---------------------------------------- -------- -*/

/*--------------------- -Interrumpir segmento de programa---- --*/

/*--------------- -------- -----------------*/

/ *Programa de interrupción del temporizador 0: */

/*Cuando hayan pasado 5 minutos, el automóvil se detendrá y entrará en estado de suspensión*/

void tmOver(void) interrupción 1

{

cntTime_5Min++;

TL0=0;

TH0=0;

if(cntTime_5Min>=4520)

{

Display(5);

P2=((P2&240)|15);

EA=0; Procedimiento de estacionamiento

P07=1;

retraso(4000);

PCON=0X00;

mientras(1);

}

}

/*Interrupción externa 0 programa de interrupción: */

/*Cuando se encuentra la pieza de hierro, envía una señal sonora y luminosa y aspira la pieza de hierro. El LED y la abeja. Los zumbadores*/

/* están conectados en paralelo (establecido en P07 es el almacén A, 1 es el almacén B). 2 es estacionamiento*/

void fndIorn(void ) interrupción 0

{

unsigned char i;

P10=1;

P2=((P2&240)|15); //Parada

P07=1;

retraso(1000);//Freno 0,5ms

P07=0;

Inter_EX0=1;

cntIorn++;

Pantalla(cntIorn);

for( i=0;i<40;i++)

{

P2=P2&249;

retraso(2);

P2= ((P2&240)|15);

retraso(2);

}

P2=P2&249;

retraso(100) ;

P2=((P2&240)| 15); //Estacionamiento

IornColor(); //Juzga el blanco y negro de la pieza de hierro, establece bkAim

for(i=0;i<95;i++)

{

P2=P2&249;

retraso(3);

P2=((P2&240)|15);

retraso(2);<

/p>

}

P2=((P2&240)|15); //Detén el auto

delay(4000); //Aspira el trozo de hierro

p>

EX0=0;

}

/*Programa de interrupción de interrupción externa 1: */

/*Conteo de pulsos del interruptor Hall, Registre la posición del automóvil para localizarlo*/

void stpMove(void) interrupt 2

{

cntTime_Plues--;

if(Direction==0) //Arriba

{

if(mType==0) sY+=det_Dist;

si no( mType==2)

sY-=det_Dist;

}

else if(Direction==1) //A la izquierda

{

if(mType==0) sX+=det_Dist;

si no(mType==2)

sX-=det_Dist;

}

else if(Direction==2) //Abajo

{

if(mType==0) sY-=det_Dist ;

si no(mType==2)

sY+=det_Dist;

}

si no(Dirección==3) //A la derecha

{

if(mType==0) sX-=det_Dist;

else if(mType==2)

sX+=det_Dist;

}

}