一、电路图
二、代码
这个程序有点问题,只能按一下,如果再按右边的乙机就没有反应,如果有会的话,评论区可以说一下。
甲机
#include<reg51.h>
unsigned int flag;
void main(){
//外部中断0定义
EA = 1;
EX0 = 1;
IT0 = 1;
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
while(1);
}
void one() interrupt 0{
//判断是哪个按下
if(P1 == 0xfe){ SBUF = 8;}
if(P1 == 0xfd){SBUF = 7;}
if(P1 == 0xfb){SBUF = 6;}
if(P1 == 0xf7){SBUF = 5;}
while(TI == 0);
TI = 0;
}
乙机
#include<reg51.h>
unsigned int temp;
// 延时函数
void delay(){
unsigned int i,j;
for(i = 0 ;i < 300;i++)
for(j = 0 ;j < 300;j++);
}
//绿灯到黄灯的时间
void green(){
unsigned int i;
for(i = 5 ;i>0;i--){
P2 = i;
delay();
}
}
// 黄灯到红灯的时间
void yellow(){
unsigned int i;
for(i = 3 ;i>0;i--){
P2 = i;
delay();
}
}
// 夜间通行
void light(){
unsigned int i;
for(i = 3 ;i>0;i--){
P2 = i;
P0 = 0x44;
delay();
P0 = 0x00;
delay();
}
}
void main(){
P0 = 0x00;
P2 = 0x00;
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
while(1){
while(RI == 0 ) // 接受完置为0
RI = 0;
temp = SBUF;
P2 = temp;
if(temp == 0x05 | temp == 0x08){ // 默认是南北通行
P0 = 0x28;
green();
P0 = 0x48;
yellow();
P0 = 0x82;
green();
P0 = 0x84;
yellow();
// 上下红灯
//P0 = 0x08;
// 上下黄灯
//P0 = 0x04;
// 上下绿灯
//P0 = 0x02;
//左右红灯
//P0 = 0x80;
//左右黄灯
//P0 = 0x40;
//左右绿灯
//P0 = 0x20;
}
if(temp == 0x06){ // 灯闪
light();
}
if(temp == 0x07){ // 东西通行
P0 = 0x82;
green();
P0 = 0x84;
yellow();
P0 = 0x28;
green();
P0 = 0x48;
yellow();
}
}
}