有人可以帮我添加一个登录到这个代码吗? [关闭]

问题描述 投票:0回答:0

我必须先添加登录,然后才能选择将叉车发送到哪里。数据必须通过键盘输入。应该注意的是,我正在使用 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
}
c 8051
© www.soinside.com 2019 - 2024. All rights reserved.