Programa de comunicación serie del microcontrolador Gaofen 51
# incluir ltintrins.h gt
#Definir carácter uchar sin signo
#Definir uint entero sin signo
sbit LCD_RS = p2^0;
sbit LCD_rw = p2^1;
sbit LCD_en = p2^2;
# define retraso nop(); _ no _(); _ no _(); _ no _(); _ no _() }; 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x 20 };
uchar temp , buf, m, count p>
bit play flag = 0;
código uchar cdis 1[]= { " transferencia SERILA " };
código uchar cdis 2[]= { " " } ;
/************************************ ***** **********************
Subrutina de retardo
*********** ** ************************************************* /
Código de carácter SST 516[3]_ at _ 0x 003 b;
Retraso no válido 1 (unidad de milisegundo)
{
uchar k;
cuando (milisegundos)
{
for(k = 0; k lt120; k );
}
}
/********************************** * ***********************************/
/* */
/*Verifique el estado de ocupación de la pantalla LCD*/
/*Cuando /*lcd_busy es 1, ocupado y espere. Cuando lcd-busy es 0, está en estado inactivo y se pueden escribir instrucciones y datos.
*/
/* */
/****************************** ***** *************************************/
bit lcd_busy()
{
Resultado del bit;
LCD _ RS = 0
LCD _ RW = 1; p>
LCD_EN = 1;
retraso nop();
resultado=(bit)(P0 amp0x 80);
LCD_EN = 0;
Devolver (resultado);
}
/************************ ******** ******************************************* ***/
/* */
/*Escribir datos de comando en LCD */
/*RS=L, RW=L, E= pulso alto, D0-D7=código de comando. */
/* */
/****************************** ***** *******************************************/ p>
LCD_wcmd(uchar cmd) no válido
{
mientras(LCD_ocupado());
LCD_RS = 0; p>
LCD _ RW = 0;
LCD_EN = 0;
_ nop _();
_ nop _(); p>
P0 = cmd
retraso nop();
LCD_EN = 1;
retraso nop();
LCD_EN = 0 ;
}
/****************************** ****** *************************************/
/* */
/*Escribir datos de visualización en LCD */
/*RS=H, RW=L, E=pulso de alto nivel, D0-D7=datos.
*/
/* */
/****************************** ***** *******************************************/ p>
void lcd_wdat(uchar dat)
{
mientras(LCD_ocupado());
LCD_RS = 1; p>
LCD _ RW = 0;
LCD _ EN = 0;
P0 = dat
retraso nop();
LCD _ EN = 1;
retraso nop();
LCD _ EN = 0
}
/ ******** ******************************************* ********* ********/
/* */
/* Configuración de inicialización de LCD*/
/* */
/*************************************** ********* *************************/
void lcd_init()
{
retraso 1( 15);
LCD _ wcmd(0x 01); //Borrar el contenido de la pantalla LCD.
LCD _ wcmd(0x 38); //Pantalla de 16*2, matriz de puntos de 5*7, datos de 8 bits
retraso 1(5);
LCD _ wcmd(0x 38);
retraso 1(5);
LCD _ wcmd(0x 38);
retraso 1(5); ;
LCD _ wcmd(0x0c); //Enciende la pantalla, muestra el cursor y el cursor parpadea.
retraso 1(5);
LCD _ wcmd(0x 01); //Borrar el contenido de la pantalla LCD.
retraso 1(5);
}
/********************* * ***********************************************/
/* */
/*Establecer posición de visualización*/
/* */
/****** ** ************************************************* *** ********/
LCD_pos(uchar pos) no válido
{
LCD _ wcmd(pos | 0x 80); //puntero de datos=80 variable de dirección
}
/*************************** ******** ****************************
Función de envío de datos
***** ******************************************* ********* **/
void envía datos (uchar dat)
{
SBUF = dat
Y (!TI);
p>TI = 0;
}
/************** ************** ********************************** p>
Función de servicio de interrupción en serie
************************************ ****************** ********/
Interrupción serie() no válida 4
{ p>
ES = 0; //Desactivar la interrupción en serie
p>RI = 0; //Borrar el indicador de aceptación en serie.
buf = SBUF//Obtener datos del buffer serie
play flag = 1;
Cambiar (buffer)
{
Caso 0x 31: enviar datos('
Caso 0x 32: enviar datos(' L '); Break; // Después de recibir 2, envía el carácter 'I' a la computadora.
Caso 0x 33: enviar datos(' 1 '); Break; // Después de recibir 3, envía el carácter 'l' a la computadora.
Caso 0x 34: enviar datos("0"); Break; //Después de recibir 4, envía el carácter 'l' a la computadora.
Caso 0x 35: enviar datos("0"); //Después de recibir 5, envía el carácter 'a' a la computadora.
Caso 0x 36: enviar datos("0"); Break; //Después de recibir 5, envía el carácter 'r' a la computadora.
Valor predeterminado: enviar datos(buf); //Recibir otros datos y enviarlos a la computadora.
}
Si (buf!=0x0D)
{
Si (buf!=0x0A)
{
temp = buf
if(count lt; 16)
{
datos rxd[count]= temp;
count ;
}
}
}
ES = 1; //Permitir interrupciones del puerto serie
}
/********************************** * ************************
Función de visualización de datos
******** *** ************************************************* / p>
Brecha no válida()
{
if(play flag)
{
LCD _ pos (0x 40); //Establece la posición en la segunda fila.
for(m = 0; m lt16; m )
LCD _ wdat(cdis 2[m]); //Borrar la segunda línea de LCD1602.
for(m = 0; m lt16; m )
{
LCD _ pos(0x 40 m); //Establece la posición de visualización en Dos líneas.
LCD _ wdat(rxd data[m]); //Mostrar caracteres
}
play flag = 0;
count = 0x00
for(m = 0; m lt16; m )
rxd data[m]= 0x 20; //Borrar unidad de almacenamiento
}
}
/************************************ ******* **********************
Funciones principales
***** ******* ******************************************* **/
Control no válido (no válido)
{
P0 = 0xff
P2 = 0x ff;
SCON = 0x 50; //Establece el modo de funcionamiento del puerto serie
PCON = 0x 00; //La velocidad en baudios no se multiplica
TMOD = 0x 20; 1 funciona en modo de recarga automática de 8 bits para generar la velocidad en baudios.
EA = 1;
ES = 1; //Habilitar interrupciones del puerto serie
TL 1 = 0x F3
th 1; = 0x F3; //Velocidad en baudios 2400
tr 1 = 1
LCD _ init()
LCD _ pos(0x 00); /Establezca la posición de visualización en la primera línea.
for(m = 0; m lt16; m )
LCD _ wdat(cdis 1[m]); //Mostrar caracteres
LCD _ pos (0x 40); //Establece la posición de visualización en la segunda línea.
for(m = 0; m lt16; m )
LCD _ wdat(cdis 2[m]); //Mostrar caracteres
while(1) )
{
play();
}
}
Este programa de comunicación serie está en mi La versión de desarrollo ha sido completamente verificada. Puede cambiar algunos parámetros según la situación real para satisfacer sus necesidades.
Por ejemplo, si enciendes una pequeña luz, sólo podrás añadir código en la posición correspondiente. Los microcontroladores son todos 51.
El programa de visualización de 1602 se utiliza para verificar si la comunicación es exitosa y puede usarlo como referencia. Puede reemplazar esta pieza con un pequeño programa de visualización de luces.