|
思路是 主机通过扫描按键 在数码管上显示1,要与1号通信,1号机收到主机发来的地址若相同则led灯由亮变灭,回传地址给主机,主机收到地址后数码管显示2,下载到开发板上时,从机接收到主机发的地址led灯变灭,但是主机收不到从机发来的地址数码管还是显示1,没有变化。求大神指点程序如下:
主机
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define addr1 0x01
void master_addr(uchar addr); //发送地址
uchar code table[]={
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 //显示数字
};
void delay(uint x)
{
uint i,j; / /延时函数
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num)
{
//显示数码管
P0=table[num];
delay(10);
P1=0xfe;
}
void err()
{
SBUF=0xff;
while(TI==0); //发送错误
TI=0;
}
uchar key_scan()
{
uchar temp,temp2;
P2=0xf0; //P2输出11110000
temp=P2; //扫描按键
if(temp!=0xf0)
{
delay(5); //若有按键按下则延时5毫秒消抖
temp=P2; //再次扫描
if(temp!=0xf0)
{
temp2=temp&0xf0; //保留高四位含有按键列的值
P2=0x0f; //P2输出00001111
delay(1); //延时1毫秒确保temp能读到输出值
temp=P2;
temp2|=temp; //扫描按键将按键值所在的列与行合在一起
}
// while(P2!=0x0f); //如果按键未松掉,则不等于0x0f则程序在此等待按键松
}
return temp2;
}
void master_addr(uchar addr)
{
SBUF=addr; //发送呼叫地址
while(TI==0);
TI=0;
while(RI==0);
RI=0;
display(2);
if(SBUF!=addr)
err();
}
void main()
{
uchar keyval;
TMOD=0x20;
TL1=0xfd;
TH1=TL1;
PCON=0x00;
TR1=1;
SCON=0xf8;
EA=1;
while(1)
{
keyval=key_scan();
switch(keyval)
{
case 0x7b:
display(1);
master_addr(addr1);
break;
default:
break;
}
}
}
从机程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define addr1 0x01
sbit led1=P0^0;
bit tready;
bit rready;
void main()
{
TMOD=0x20;
TL1=0xfd;
TH1=TL1;
PCON=0x00;
TR1=1;
SCON=0xf0;
ES=1;
EA=1;
while(1)
{
tready=1;
rready=1;
}
}
void ssio()interrupt 4
{
while(RI==0);
RI=0;
ES=0;
if(SBUF!=addr1)
{
ES=1;
goto reti;
}
SM2=0;
led1=~led1;
SBUF=0x01;
while(TI==0);
TI=0;
reti:;
}
|
|