7.3. Comunicaciones serie por muestreo (polling)
Ejemplo de comunicaciones en serie utilizando el método de muestreo (Polling):
/**********************************************************
Ejemplo de un programa para la transmisión de datos por el
puerto serie RS-232, operando por muestreo (polling).
Para el compilador de c keil C51 y los microcontroladores
8051.
Descripción: Programa que dado un carácter a,b,c.. en
minusculas o mayusculas pone a 0 o a 1 los bits del
puerto P1.
Autor: Rafa Aranda
Fecha: 20-11-2009
Versión: 1.0
**********************************************************/
#include ‹reg52.h› // Incluir los registros genéricos del 8052
// Definición de bit del puesto P1, microcontroladores 8051
sbit Led_0 = P1^0; // Asignación del bit P1.0 al símbolo Led_0
sbit Led_1 = P1^1; // Asignación del bit P1.1 al símbolo Led_1
sbit Led_2 = P1^2; // Asignación del bit P1.2 al símbolo Led_2
sbit Led_3 = P1^3; // Asignación del bit P1.3 al símbolo Led_3
sbit Led_4 = P1^4; // Asignación del bit P1.4 al símbolo Led_4
sbit Led_5 = P1^5; // Asignación del bit P1.5 al símbolo Led_5
sbit Led_6 = P1^6; // Asignación del bit P1.6 al símbolo Led_6
sbit Led_7 = P1^7; // Asignación del bit P1.7 al símbolo Led_7
// Declaración de las funciones prototipo
void InitSerial(void); // Iniciar el puerto serie
void RecDat(void); // Función Recepción de datos
// Declaración de Variables globales
//----------------------------------------------------------
// Programa principal
//----------------------------------------------------------
void main(void){
// Tareas iníciales de preparación
P1 = 0; // Poner todos los bits del P1 a 0
InitSerial(); // Iniciar las comunicaciones
// Cuerpo del programa en un bucle infinito
while(1){
// Muestrear el indicador RI hasta la llegada de un nuevo Byte
if(RI){
RecDat();
}
}
}
//----------------------------------------------------------
// Función Recepción de datos
//----------------------------------------------------------
void RecDat(void){
unsigned char dat;
RI = 0; // Borrar el flag de recepción
dat = SBUF; // Recuperar el byte del buffer de recepción
SBUF = dat; // Hacer eco del dato recibido
// Analizar el dato recibido y en función del carácter
// poner a 0 o 1 el bit correspondiente
switch(dat){
// Poner a cero los bits de puerto 1
case 'a':
Led_0 = 0; //Bit P1.0 a 0
break;
case 'b':
Led_1 = 0; //Bit P1.1 a 0
break;
case 'c':
Led_2 = 0; //Bit P1.2 a 0
break;
case 'd':
Led_3 = 0; //Bit P1.3 a 0
break;
case 'e':
Led_4 = 0; //Bit P1.4 a 0
break;
case 'f':
Led_5 = 0; //Bit P1.5 a 0
break;
case 'g':
Led_6 = 0; //Bit P1.6 a 0
break;
case 'h':
Led_7 = 0; //Bit P1.7 a 0
break;
// Poner a uno los bits de puerto 1
case 'A':
Led_0 = 1; //Bit P1.0 a 1
break;
case 'B':
Led_1 = 1; //Bit P1.1 a 1
break;
case 'C':
Led_2 = 1; //Bit P1.2 a 1
break;
case 'D':
Led_3 = 1; //Bit P1.3 a 1
break;
case 'E':
Led_4 = 1; //Bit P1.4 a 1
break;
case 'F':
Led_5 = 1; //Bit P1.5 a 1
break;
case 'G':
Led_6 = 1; //Bit P1.6 a 1
break;
case 'H':
Led_7 = 1; //Bit P1.7 a 1
break;
}
}
//----------------------------------------------------------
// Iniciar el puerto serie
//----------------------------------------------------------
void InitSerial(void){
TMOD |= 0x20; // Timer 1 en modo 2 (auto recarga)
TL1 = 0xFD; // Velocidad de 9600 Bauds
TH1 = 0xFD;
SCON = 0x50; // Configuración de la UART en modo 2
TR1 = 1; // Arrancar el Timer1 y la UART
}