多机通信实验
原创代码,供参考。
编程控制单片机驱动多台单片机,实现多台单片机之间的通信。
具体要求为:
(1)主机设置有多个按钮,每个按钮对应一台通信的从机。
(2)按下主机中的按钮,表示与其对应的从机进行通信。主机将发送一个数字到该从机上,并在该从机的LED数码管上进行显示。
(3)为了便于观察效果,建议主机发送的数字呈一定规律。比如,依次增加。
主机代码
#include<reg51.h>
#include<intrins.h>
#define a_addr 20//设置接收机1的地址
#define b_addr 21//设置接收机2的地址
unsigned char num1=0;//发送给接收机1
unsigned char num2=0;//发送给接收机2
void send_a() interrupt 0
{
TB8=1;
SBUF=a_addr;
while(TI==0);
TI=0;
TB8=0;
num1=(num1+1)%16;
SBUF=num1;
while(TI==0);
TI=0;
}
void send_b() interrupt 2
{
TB8=1;
SBUF=b_addr;
while(TI==0);
TI=0;
TB8=0;
num2=(num2+1)%16;
SBUF=num2;
while(TI==0);
TI=0;
}
void main()
{
IT0=1;EX0=1;
IT1=1;EX1=1;
EA=1;//打开中断
TMOD=0x20;
SCON=0xe8;//方式3 SM2=1 不允许接
TH1=TL1=0xfd;//波特率9600
TR1=1;
while(1);
}
接收机1代码
#include<reg51.h>
#include<intrins.h>
unsigned char code key_code[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
#define a_addr 20
void play() interrupt 4
{
RI=0;
if(RB8==1)
{
if(SBUF==a_addr)
{
SM2=0;
}
}
else
{
P1=key_code[SBUF];
SM2=1;
}
}
void main()
{
SCON=0xf0;
TMOD=0x20;
TH1=TL1=0xfd;//波特率9600
TR1=1;
ES=1;
EA=1;
P1=key_code[0];
while(1);
}
接收机2代码
#include<reg51.h>
#include<intrins.h>
unsigned char code key_code[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
#define b_addr 21
void play() interrupt 4
{
RI=0;
if(RB8==1)
{
if(SBUF==b_addr)
{
SM2=0;
}
}
else
{
P1=key_code[SBUF];
SM2=1;
}
}
void main()
{
SCON=0xf0;
TMOD=0x20;
TH1=TL1=0xfd;//波特率9600
TR1=1;
ES=1;
EA=1;
P1=key_code[0];
while(1);
}
电路图