Quiero usar un microcontrolador para controlar otro microcontrolador. ¿Cómo conectar y procesar los datos correspondientes?
Un determinado sistema de adquisición de datos de temperatura tiene un maestro y un esclavo para la comunicación en serie. Supongamos que la frecuencia del reloj del sistema fosc de las máquinas duales es de 11,0592 MHz y la velocidad de comunicación es de 9600 bps. de los datos de temperatura al esclavo cada vez. La máquina esclava enviará los datos recibidos al monitor para su visualización e intentará completar el diseño del programa de comunicación de la máquina dual.
Análisis: Configure el temporizador 1 para que funcione en modo 2, TMOD=00100000b=0x20.
Cálculo del valor inicial del temporizador: 9600=K*fosc/[32*12*(256-TH1)], suponiendo aquí SMOD=0, luego K=1. fosc=11.0592MHz, calculado: TH1=253=0x0fd.
Determinación de SCON: El puerto serie funciona en modo 1, permitiendo la recepción. ?Entonces: SCON=01010000b=0x50.
El programa de referencia para que el host recopile datos y los envíe al esclavo es el siguiente (aquí no se considera el protocolo de comunicación):
#includelt;reg51.hgt;
# define?uchar?unsigned?char
#define?uint?unsigned?int?
uchar?Temperatura;
void? InitSystem(void);
p>
void?CollectData(void);
void?Delay(void);
/*Inicialización del sistema* /
void?InitSystem( void)
{
TMOD=0x20; /*?T1 funciona en modo 2*/
TH1=0xfd; /*?Velocidad de comunicación 2400bps*/
TL1=0xfd;
PCON=0x00;/*?SMOD=0*/
SCON =0x50;/*?Permitir recepción*/ p>
ES=0;/*?Habilitar interrupción del puerto serie*/
ET1=0;
TR1= 1;?/*?Iniciar temporizador 1*/
RI=0;
TI=0 }
void?CollectData(void)?/* Programa de recopilación de datos*/ {;
//?Este programa envía los datos de temperatura recopilados a la variable Temperatura. Debido a limitaciones de espacio, este código de programa se omite.
}
void?Delay()?/*Retraso de subrutina*/ {
int?i;
for(i=0;ilt; 10000; i ); }
void?main(void) {
InitSystem();
mientras(1)
{ p>
Retraso();
SBUF=Temperatura; /*Enviar datos de temperatura*/
while(!TI);
TI =0 ;
CollectData();?/*?Recopilar datos de temperatura*/
} }
El programa esclavo es el siguiente:
#includelt;reg51.hgt;
#define?uchar?unsigned?char
#define?uint?unsigned?int?
uchar?Temperatura;
void?InitSystem(void);
void?Comm(void)?;
void?Display(void);
void?InitSystem(void)?/*Programa de inicialización del sistema*/
{
TMOD=0x20; /*?T1 funciona en modo 2*/
TH1=0xfd;/*?Velocidad de comunicación 2400bps*/
TL1=0xfd;
PCON=0x00;/*?SMOD=0*/
SCON =0x50;/*?Permitir recepción*/
EA=1;
ES=1;/*?Habilitar interrupción del puerto serie*/
ET1= 0 ;
TR1=1;?/*?Iniciar temporizador 1*/
RI=0;
TI=0 }
void?Comm(void)?interrupt?4?using?0?/*Rutina de servicio de interrupción en serie*/ { Temperature=SBUF;?/*?Guardar datos*/ RI=0;/*Borrar indicador de interrupción*/ }
void?Display(void)/*Mostrar programa*/ {
;
/*Este programa mostrará la temperatura recibida en el monitor */ }
void?main(void) {
InitSystem();
mientras(1)
{
Display();
;
} }
Nota: El oscilador de cristal y la velocidad en baudios deben configurarse como se indica en el programa; de lo contrario, habrá Habrá una gran tasa de error de bits que provocará un fallo en la comunicación. . . Si el programa usa 11.0592, no uses 12M, de lo contrario te arrepentirás