舍友仅仅打了一把游戏,我就学会了如何实现双机通信

一、电路图:

点击下载
在这里插入图片描述

二、实现效果:

想要通过按键检测是那一个按下,然后把甲机的数据通过SBUF进行发送到乙机,然后乙机接受到,就完成其对应的显示,完成的功能就是抢答器,只不过是通过串行发送。

三、代码:

甲机

// 甲机
#include<reg51.h>
int flag = 0 ; // 实现让它们重新开始抢答
void main(){
	//interrupt 0 
	EA = 1 ;
	IT0 = 1;
	EX0 = 1;
	
	//interrupt 2
	IT1 = 1;
	EX1 = 1;
	
	//send
	TMOD = 0x20;// 定时或者计数的工作方式
	TH1 = 0xfd;
	TL1 = 0xfd;
	SCON = 0x50;// 串口工作方式
	TR1 = 1; # 定时器1开始计数,为0时不计数。也就是定时
	while(1);
}

// 外部中断0
void key() interrupt 0{
	if(flag == 0){ // 刚开始 flag 的赋值为 0 可以进来,后面就不可以啦
	if(P1 == 0xfe){SBUF = 8;} // 判断是那一个按键按下,然后通过SBUF进行发送乙机
	if(P1 == 0xfd){SBUF = 7;}
	if(P1 == 0xfb){SBUF = 6;}
	if(P1 == 0xf7){SBUF = 5;}
	if(P1 == 0xef){SBUF = 4;}
	if(P1 == 0x6f){SBUF = 3;}
	if(P1 == 0xbf){SBUF = 2;}
	if(P1 == 0x7f){SBUF = 1;}
	while(TI == 0); 
	TI = 0;
	flag = 1; // 最后给flag 赋值为 1,只能进来一次
}else flag = 0x02;
}
// 外部中断 1 
void key1() interrupt 2{ // 通过外部中断1来给flag 重新赋值为0 然后发送a过去
	flag = 0;
	SBUF = 0x0a;
	while(TI == 0); // 判断发送是否完毕,如果完毕,给TI赋值为0;
	TI = 0;
}

乙机

#include<reg51.h>

void main(){
	int a; 
	SCON = 0x50;// 串口工作方式
	TMOD = 0x20; // 定时或者计数的工作方式
	TH1 = 0xfd; 
	TL1 = 0xfd;
	TR1 = 1; # 定时器1开始计数,为0时不计数。也就是定时
	while(1){
	while(RI == 0); // 判断发送是否完毕,如果完毕,给TI赋值为0;
	RI = 0;
	a = SBUF; // 接受发送过来的值,然后下面完成对应的显示
	P2 = a;
	if(P2 == 0x08){P0 = 0x80 ;}
	if(P2 == 0x07){P0 = 0x40 ;}
	if(P2 == 0x06){P0 = 0x20 ;}
	if(P2 == 0x05){P0 = 0x10 ;}
	if(P2 == 0x04){P0 = 0x08 ;}
	if(P2 == 0x03){P0 = 0x04 ;}
	if(P2 == 0x02){P0 = 0x02 ;}
	if(P2 == 0x01){P0 = 0x01;}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CPanMirai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值