一、电路图:
二、实现效果:
想要通过按键检测是那一个按下,然后把甲机的数据通过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;}
}
}