C51单片机多机通信C语言

单片机a,b,c?a为主,bc为从。A上有一个外部中断0输入,第一次按A的两个LED 500 ms,然后按B机的LED 500 ms,第三次按C机的LED 500 ms,然后重复这个过程。两个数码管分别显示0/1/2。和abc(bc由从机反馈)

/*

主从通信的基本步骤:

1.?主机和从机初始化为模式2或3,两个从机均设置为SM2=1,允许中断。

2.?主机设置TB8=1,并发送从机地址。

3.?所有从机接收主机发送的要寻址的从机地址。

4.?被寻址的从机确认地址后,设置本地SM2=0,并将地址返回给主机供主机检查。

5.?验证后,主机向被寻址的从机发送命令,通知从机接受或发送数据。

6.?通信后,主机和从机复位SM2=1,主机可以寻址其它从机。

*/

******************************************************************

主持人a:

******************************************************************

#包含?& ltreg 51 . h & gt;

#定义?乌恰尔?未签名?茶

#定义?uint?未签名?(同Internationalorganizations)国际组织

乌恰尔?leddata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x 00 };

乌恰尔?模式;

sbit?P10?=?p1^0;

sbit?P13?=?p1^3;

sbit?P17?=?p1^7;

sbit?P20?=?p2^0;

sbit?P21?=?p2^1;

作废?UART_init()

{

TMOD?=?0x20

TH1?=?0xfd

TL1?=?0xfd

TR1?=?1;

SCON?=?0xd0

ES?=?1;

EX0?=?1;

IT0?=?1;?//INT0跳转触发器

EA?=?1;

TI?=?0;

}

作废?DelayMs(int?毫秒)

{

乌恰尔?我;

while(ms -)?

for(I = 0;?我& lt120;?i++);

}

作废?putc_to_SerialPort(uchar?c)

{

SBUF?=?c;

而(TI?==?0);

TI?=?0;

}

作废?MasterControl(无符号?夏尔?Addr?未签名?夏尔?Comd)

{

TB8?=?1;

putc _ to _ serial port(Addr);

戴莱姆斯(50);

TB8?=?0;

putc _ to _ serial port(Comd);

戴莱姆斯(50);

}

Ex0_int(void)?打断?0

{

P0?=?led data[模式];

P20?=?0;

如果(模式?==?0)

{

P2?=?led data[10];

P10?=?0;

P13?=?0;

戴莱姆斯(500);

P10?=?1;

P13?=?1;

//MasterControl('b ',' C ');

//MasterControl('c ',' C ');

}

不然呢?如果(模式?==?1)

{

P10?=?1;

P13?=?1;

主控制(' b ',' O ');?

//MasterControl('c ',' C ');

}

不然呢?如果(模式?==?2)

{

P10?=?1;

P13?=?1;

//MasterControl('b ',' C ');

主控制(' c ',' O ');

}

Mode?=?(模式?+?1)?%?3;

}?

com_int(void)?打断?四

{

中频(RI)

{

RI?=?0;

如果(SBUF?==?b’)

{

P2?=?led data[11];

}

如果(SBUF?==?c’)

{

P2?=?led data[12];

}

}

}

作废?主要(无效)

{

P0?=?0x00

P1?=?0xff

P2?=?0x00

UART _ init();

Mode?=?0;

while(1);

}

******************************************************************

从机b:

******************************************************************

#包含?& ltreg 51 . h & gt;

#定义?乌恰尔?未签名?茶

乌恰尔?RecData

sbit?P10?=?p1^0;

sbit?P13?=?p1^3;

作废?UART_init()

{

TMOD?=?0x 21;

TH1?=?0xfd

TL1?=?0xfd

TR1?=?1;

SCON?=?0xf0

ES?=?1;

PS?=?1;

EA?=?1;

}

作废?DelayMs(int?毫秒)

{

乌恰尔?我;

while(ms -)?

for(I = 0;?我& lt120;?i++);

}

作废?putc_to_SerialPort(uchar?c)

{

SBUF?=?c;

而(TI?==?0);

TI?=?0;

}

com_int(void)?打断?四

{

中频(RI)

{

RecData?=?SBUF

RI?=?0;

如果(RB8?==?1)//地址

{

if(RecData?==?b’)//是自己的地址,设置SM2=0,准备接收数据。

{

SM2?=?0;?

putc _ to _ serial port(' b ');?

}

Else//不是自己的地址。

{

SM2?=?1;

}?

}?

如果(RB8?==?0)//数据

{?

if(RecData=='O ')

{

P10?=?0;

P13?=?0;

戴莱姆斯(500);

P10?=?1;

P13?=?1;

}

if(RecData=='C ')

{

P10?=?1;

P13?=?1;

}

SM2?=?1;

}?

}?

}

作废?主要(无效)

{

P0?=?0xff

P1?=?0xff

UART _ init();

while(1);

}

******************************************************************

从机c:

******************************************************************

#包含?& ltreg 51 . h & gt;

#定义?乌恰尔?未签名?茶

乌恰尔?RecData

sbit?P10?=?p1^0;

sbit?P13?=?p1^3;

作废?UART_init()

{

TMOD?=?0x 21;

TH1?=?0xfd

TL1?=?0xfd

TR1?=?1;

SCON?=?0xf0

ES?=?1;

PS?=?1;

EA?=?1;

}

作废?DelayMs(int?毫秒)

{

乌恰尔?我;

while(ms -)?

for(I = 0;?我& lt120;?i++);

}

作废?putc_to_SerialPort(uchar?c)

{

SBUF?=?c;

而(TI?==?0);

TI?=?0;

}

com_int(void)?打断?四

{

中频(RI)

{

RecData?=?SBUF

RI?=?0;

如果(RB8?==?1)//地址

{

if(RecData?==?c’)//是自己的地址,设置SM2=0,准备接收数据。

{

SM2?=?0;?

putc _ to _ serial port(' c ');

}

Else//不是自己的地址。

{

SM2?=?1;

}?

}?

如果(RB8?==?0)//数据

{?

if(RecData=='O ')

{

P10?=?0;

P13?=?0;

戴莱姆斯(500);

P10?=?1;

P13?=?1;

SM2?=?1;

}

if(RecData=='C ')

{

P10?=?1;

P13?=?1;

SM2?=?1;

}?

}?

}

}

作废?主要(无效)

{

P0?=?0xff

P1?=?0xff

UART _ init();

while(1);

}