Lenguaje C de comunicación multicomputadora de un solo chip C51
/*
Los pasos básicos de la comunicación maestro-esclavo:
1.? El maestro y el esclavo se inicializan en el modo 2 o 3, y ambos esclavos se configuran en SM2=1, lo que permite interrupciones.
2.? El maestro establece TB8=1 y envía la dirección del esclavo.
3.? Todos los esclavos reciben la dirección del esclavo a ser direccionada enviada por el maestro.
4.? Después de que el esclavo direccionado confirma la dirección, establece SM2 = 0 local y devuelve la dirección al host para que el host la verifique.
5.? Después de la verificación, el maestro envía un comando al esclavo direccionado para notificarle que acepte o envíe datos.
6.? Después de la comunicación, el maestro y el esclavo restablecen SM2=1 y el maestro puede direccionar otros esclavos.
*/
************************************ ** **********************************
Moderador a:
************************************************* *******************
¿#Contiene? & ltreg 51 . h & gt;
#¿Definición? ¿Uchar? ¿No firmado? Té
#Definición? uint? ¿No firmado? (Igual que las organizaciones internacionales) Organizaciones internacionales
Uchar? leddata[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x 00};
¿Uchar? Modo;
sbit? ¿P10? =?p1^0;
bit? ¿P13? =?p1^3;
un poco? ¿P17? =?p1^7;
un poco? ¿P20? =?p2^0;
bit? ¿P21? =?p2^1;
¿No válido? UART_init()
{
¿TMOD? =?0x20
TH1? =?0xfd
TL1? =?0xfd
TR1? =?1;
SCON? =?0xd0
ES? =?1;
EX0? =?1;
IT0? =?1;? //Activador de salto INT0
EA? =?1;
TI? =?0;
}
¿Anulado? DelayMs(int? milisegundos)
{
Uchar? Yo;
mientras(ms -)?
for(I = 0;?i<120;?i++);
}
¿No es válido? putc_to_SerialPort(uchar?c)
{
SBUF? =?c;
Y (TI?==?0);
TI? =?0;
}
¿Anulado? MasterControl(¿Sin firmar? ¿Comarca? ¿Dirección? ¿Sin firmar? ¿Comarca? Comd)
{
TB8? =?1;
putc _ a _ puerto serie(Addr);
Daremus(50);
TB8? =?0;
putc _ a _ puerto serie(Comd);
Daremus(50);
}
Ex0_int( vacío)? ¿interrumpir? 0
{
P0? =?datos led[modo];
P20? =?0;
Si (modo?==?0)
{
P2? =?datos led[10];
P10? =?0;
P13? =?0;
Daremus(500);
P10? =?1;
P13? =?1;
//MasterControl('b','C');
//MasterControl('c','C');
}
¿Y si? if(modo?==?1)
{
P10? =?1;
P13? =?1;
Control principal(' b ', ' O ');?
/
/MasterControl('c ', ' C ');
}
¿Y si? if(modo?==?2)
{
P10? =?1;
P13? =?1;
//MasterControl('b','C');
MasterControl('c','O');
}
¿Modo? =?(Modo?+?1)?%?3;
}?
com_int(void)? ¿interrumpir? Cuatro
{
Frecuencia intermedia (RI)
{
¿RI? =?0;
Si (SBUF?==?b’)
{
P2? =?datos led[11];
}
Si (SBUF?==?c’)
{
P2? =?datos LED[12];
}
}
}
¿No válido? Principal (no válido)
{
¿P0? =?0x00
P1? =?0xff
P2? =?0x00
UART _ init();
¿Modo? =?0;
mientras(1);
}
********************* ***** ********************************************** ****
Esclavo b:
****************************** ************ **********************************
#¿Incluir? & ltreg 51 . h & gt;
#¿Definición? ¿Uchar? ¿No firmado? Té
Uchar? RecData
sbit? ¿P10? =?p1^0;
bit? ¿P13? =?p1^3;
¿No válido? UART_init()
{
¿TMOD? =?0x 21;
TH1? =?0xfd
TL1? =?0xfd
TR1? =?1;
SCON? =?0xf0
ES? =?1;
¿PD? =?1;
EA? =?1;
}
¿Anulado? DelayMs(int? milisegundos)
{
Uchar? Yo;
mientras(ms -)?
for(I = 0;?i<120;?i++);
}
¿No es válido? putc_to_SerialPort(uchar?c)
{
SBUF? =?c;
Y (TI?==?0);
TI? =?0;
}
com_int(void)? ¿interrumpir? Cuatro
{
IF (RI)
{
RecData? =?SBUF
RI? =?0;
if (RB8?==?1)//dirección
{
if(RecData?==?b')// Es su propia dirección, configure SM2=0 y prepárese para recibir datos.
{
¿SM2? =?0;?
putc_a_puerto serie('b');?
}
Else//no es tu propia dirección.
{
¿SM2? =?1;
}?
}?
Si (RB8?==?0)//datos
{?
if(RecData=='O ')
{
P10? =?0;
P13? =?0;
Daremus(500);
P10? =?1;
P13? =?1;
}
if(RecData=='C ')
{
P10? =?1;
P13? =?1;
}
SM2? =?1;
}?
}?
}
¿No válido? Principal (no válido)
{
¿P0? =?0xff
P1? =?0xff
UART _ init();
mientras(1);
}
******* ************************************************** * *********
Esclavo c:
************************ ***** ******************************************* p>
#¿Incluir? & ltreg 51 . h & gt;
#¿Definición? ¿Uchar? ¿No firmado? Té
Uchar? RecData
sbit? ¿P10? =?p1^0;
bit? ¿P13? =?p1^3;
¿No válido? UART_init()
{
¿TMOD? =?0x 21;
TH1? =?0xfd
TL1? =?0xfd
TR1? =?1;
SCON? =?0xf0
ES? =?1;
¿PD? =?1;
EA? =?1;
}
¿Anulado? DelayMs(int? milisegundos)
{
Uchar? Yo;
mientras(ms -)?
for(I = 0;?i<120;?i++);
}
¿No es válido? putc_to_SerialPort(uchar?c)
{
SBUF? =?c;
Y (TI?==?0);
TI? =?0;
}
com_int(void)? ¿interrumpir? Cuatro
{
IF (RI)
{
RecData? =?SBUF
RI? =?0;
if (RB8?==?1)//dirección
{
if(RecData?==?c')// Es su propia dirección, configure SM2=0 y prepárese para recibir datos.
{
¿SM2? =?0;?
putc _ to _ serial port(' c ');
}
Else//no es su propia dirección.
{
¿SM2? =?1;
}?
}?
Si (RB8?==?0)//datos
{?
if(RecData=='O ')
{
P10? =?0;
P13? =?0;
Daremus(500);
P10? =?1;
P13? =?1;
SM2? =?1;
}
if(RecData=='C ')
{
P10? =?1;
P13? =?1;
SM2? =?1;
}?
}?
}
}
¿Anulado? Principal (no válido)
{
¿P0? =?0xff
P1? =?0xff
UART _ init();
mientras(1);