我必须先添加登录,然后才能选择将叉车发送到哪里。数据必须通过键盘输入。应该注意的是,我正在使用 8051 微控制器,我正在使用 IDE Keil c 51 并使用 Proteus 进行仿真。
这是我的代码:
#include <reg51.h>
#include <String.h> //Librería para el manejo de cadenas
#include <stdlib.h>
void init_circuito(void);
void InicializarSerial(void);
void procesar_comando_serial(unsigned char);
void serial(char envia[]);
void enviar_serial(unsigned char dato);
void procesar_comando_serial(unsigned char comando);
void delay(int a);
void borra();
void mensaje();
sbit motor_subir = P2 ^ 0;
sbit motor_bajar = P2 ^ 1;
sbit boton_piso_1 = P2 ^ 3;
sbit boton_piso_2 = P2 ^ 4;
sbit boton_piso_3 = P2 ^ 5;
sbit boton_enclavamiento = P2 ^ 6;
short j = 0;
int piso_actual = 1;
int i;
short length=0;
int mensaje_llamado = 0;// variable para el conteo de la funcion mensaje
void main()
{
init_circuito();
InicializarSerial();
EA = 1;
ES = 1;
while (1)
{ if (mensaje_llamado == 0) {// hacemos que el llamdo ala funcion mensaje solo se ejecute una vez (esto por que me estaba dando problemas)
mensaje();
mensaje_llamado++;
}
if (RI) // Verifica si se ha recibido un byte
{
procesar_comando_serial(SBUF);
RI = 0; // Limpia el bit indicador de recepción
}
}
}
void init_circuito(void)
{
P0 = 0x00; // No se utiliza
P1 = 0xFF; // No se utiliza
P2 = 0x00; // Puerto de salida utilizado para los motores
P3 = 0x03; // Puerto de entrada utilizado para los botones de los pisos
}
void InicializarSerial(void)
{
SCON = 0x50; // Configura la comunicación serial en modo 8 bits sin paridad
TMOD = 0x20; // Configura el temporizador 1 como auto-recarga en modo 8 bits con el bit de overflow habilitado
TH1 = 0xF3; // Configura el temporizador para una velocidad de transmisión de 9600 baudios
TR1 = 1; // Inicia el temporizador 1
TI = 1; // Habilita la interrupción de transmisión serial
RI = 0; // Asegura que la interrupción de recepción serial esté deshabilitada
}
void serial(char envia[]){
length=strlen(envia); //Se determina el tamaño de la cadena
for(i=0;i<=length-1;i++){
SBUF=envia[i]; //Se envía el dato por el puerto serial
for(j=0;j<=800;j++); //delay
}
TI=0; //Puesta a cero del bit
}
void enviar_serial(unsigned char dato)
{
SBUF = dato;
while (!TI);
TI = 0;
}
void procesar_comando_serial(unsigned char comando)
{
if (boton_enclavamiento == 1) //Verifica el estado del botón de enclavamiento
{
serial("Enclavamiento activo, no se puede cambiar de piso.");
enviar_serial(0x0d); // Salto de línea
return;
}
else if (boton_enclavamiento == 0) {
serial("Enclavamiento desactivado ");
enviar_serial(0x0d); // Salto de línea
delay(1000);
}
switch (comando)
{ borra();
case '1':
if (piso_actual != 1)
{
motor_bajar = 1;
motor_subir = 0;
serial("montacargas bajando al primer piso...");
enviar_serial(0x0d); // Salto de línea
while (boton_piso_1 == 0);
motor_bajar = 0;
piso_actual = 1;
serial("montacargas ha llegado al primer piso.");
enviar_serial(0x0d); // Salto de línea
}
break;
case '2':
if (piso_actual == 1)
{ borra();
motor_subir = 1;
motor_bajar = 0;
serial("montacargas subiendo al segundo piso...");
enviar_serial(0x0d); // Salto de línea
while (boton_piso_2 == 0);
motor_subir = 0;
piso_actual = 2;
serial("montacargas ha llegado al segundo piso.");
enviar_serial(0x0d); // Salto de línea
}
else if (piso_actual == 3)
{
motor_bajar = 1;
motor_subir = 0;
serial("montacargas bajando al segundo piso...");
enviar_serial(0x0d); // Salto de línea
while (boton_piso_2 == 0);
motor_bajar = 0;
piso_actual = 2;
serial("montacargas ha llegado al segundo piso.");
enviar_serial(0x0d); // Salto de línea
}
break;
case '3':
borra();
if (piso_actual != 3)
{
motor_subir = 1;
motor_bajar = 0;
serial("montacargas subiendo al tercer piso...");
enviar_serial(0x0d); // Salto de línea
while (boton_piso_3 == 0);
motor_subir = 0;
piso_actual = 3;
serial("montacargas ha llegado al tercer piso.");
enviar_serial(0x0d); // Salto de línea
}
break;
default:
serial("Comando no reconocido.");
enviar_serial(0x0d); // Salto de línea
break;
}
RI = 0;
}
void borra() { // funcion para borrar la informacion de la terminal.
SBUF = 0xC; //Valor para borrar en consola
for (j = 0; j <= 500; j++); //delay
TI = 0;
}
void delay(int a) { // funcion para calcular el tiempo
int i, j;
for (i = 0; i < a; i++)
for (j = 0; j < 255; j++);
}
void mensaje() {
serial(" Proyecto montacargas de 3 niveles ");
enviar_serial(0x0d); // Salto de línea
delay(1000);
serial(" Creado por Adony Rodriguez");
enviar_serial(0x0d); // Salto de línea
serial(" 1172506 ");
enviar_serial(0x0d); // Salto de línea
serial(" ---Bienvenido---");
enviar_serial(0x0d); // Salto de línea
delay(1000);
borra();
serial("El montacargas ha sido iniciado en el primer piso.");
enviar_serial(0x0d); // Salto de línea
delay(1000);
borra();
serial("Presiona el 1 para enviar el montacargas al nivel 1");
enviar_serial(0x0d); // Salto de línea
serial("Presiona el 2 para enviar el montacargas al nivel 2");
enviar_serial(0x0d); // Salto de línea
serial("Presiona el 3 para enviar el montacargas al nivel 3");
enviar_serial(0x0d); // Salto de línea
serial("Presiona el boton rojo para activar el enclavamiento");
enviar_serial(0x0d); // Salto de línea
delay(1000);
SBUF=0;// LIMPIAMOS EL BUFFER
}