Red de conocimiento informático - Espacio del host - Quiero usar un microcontrolador para controlar otro microcontrolador. ¿Cómo conectar y procesar los datos correspondientes?

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*/

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)

{

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