C51单片机多机通信C语言
/*
主从通信的基本步骤:
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);
}