我在程序里定義一個循環(huán)來重復(fù)呼叫從機(jī)一和從機(jī)二;但程序只循環(huán)了一次主機(jī)呼叫就不知道在哪卡住了;
主機(jī)程序:
void main()
{
int t=0;
int key,b,m,j,s;
init();
ES=0;
Uart_Init();
while(1)
{
SM2=0;
send_addr(addr1);
send_data(0x02);
while(!RI);RI=0;m=SBUF;
if(m!=addr1)
{
m=m*2;
write_com(0x80);
write_data(m/100%10+'0');
write_data(m/10%10+'0');
write_data(m%10+'0');
}
TB8=1;
P13=0;
delay_ms(600);
P13=1;
send_addr(addr2);
send_data(0x02);
while(!RI);RI=0;m=SBUF;
if(m!=addr2)
{
m=m*2;
write_com(0x80+0x40);
write_data(m/100%10+'0');
write_data(m/10%10+'0');
write_data(m%10+'0');
}
TB8=1;
P13=0;
delay_ms(300);
P13=1;
}
}
void Uart_Init(void)
{
TMOD=0x20; //定時器T1使用工作方式2
TH1=250;
TH0=250;
TR1=1; //開始計時
PCON=0x80; //SMOD=1;
SCON=0xd0; //工作方式3,9位數(shù)據(jù)位,波特率9600bit/s,允許接收
TI=1;
RI=1;
}
uchar Receive(void) //接收數(shù)據(jù)程序
{
uchar Data;
while(!RI); //等待接受完畢
Data=SBUF; //接收數(shù)據(jù)
RI=0;
return Data;
}
void recieve()
{
while(RI==0);
RI=0;
temp_data=SBUF;
}
void send_addr(uchar addr) //發(fā)送地址
{
uchar tem;
while(addr!=tem) //如果發(fā)送的地址與從機(jī)應(yīng)答的地址不一樣,則一直發(fā)送地址
{
while(!TI); //等待發(fā)送完畢
TI=0; //軟件復(fù)位TI
TB8=1; //發(fā)送地址幀
SBUF=addr; //發(fā)送地址
tem=Receive();
}
}
void send_data(uchar ddata) //發(fā)送數(shù)據(jù),但此處由于與從機(jī)的協(xié)議,禁止發(fā)送0xff
{
while(!TI); //等待發(fā)送完畢
TI=0; //軟件復(fù)位TI
TB8=0; //發(fā)送數(shù)據(jù)幀
SBUF=ddata; //發(fā)送數(shù)據(jù)
while(!TI);
}
從機(jī)程序:
void main()
{
uchar b;
uchar tem,Data;
P11=0;/*使能LED*/
Uart_Init();
ES=0;
while(1)
{
loop: SM2=1; //只接收地址幀
//如果接收到的地址幀不是本機(jī)地址,則繼續(xù)等待
while(tem!=addr)
{
while(!RI);
RI=0;
tem=SBUF;
}
//如果是本機(jī)地址,發(fā)送應(yīng)答信號,并做好接受數(shù)據(jù)的準(zhǔn)備
TB8=0; //主機(jī)不檢測該位
send(addr);
SM2=0; //允許接受數(shù)據(jù)信息
//接收數(shù)據(jù)
Data=recv_data();
if(Data==0xff)
continue;
switch(Data)
{
case 0x01:
P13=0;
RI=0;TI=0;
dsreset();
write(0xcc);
write(0x44);
get_temp();
b=temp/2;
SBUF=b;
while(!TI);TI=0;
TI=1;RI=1;
P13=1;
break;
case 0x33:
P1=0xaa; //為方便其間,賦值給P1口,測P1口電平來檢測該程序
break;
case 0x02:
P13=0;
RI=0;TI=0;
dsreset();
write(0xcc);
write(0x44);
get_temp();
b=temp/2;
SBUF=b;
while(!TI);TI=0;
TI=1;RI=1;
P13=1;
break;
case 0x03:
break;
default:
break;
}
Data=0x00;
}
}
void Uart_Init(void)
{
TMOD=0x20; //定時器T1使用工作方式2
TH1=250;
TH0=250;
TR1=1; //開始計時
PCON=0x80; //SMOD=1;
SCON=0xd0; //工作方式3,9位數(shù)據(jù)位,波特率9600bit/s,允許接收
TI=1;
RI=1;
}
void send(uchar Data) //發(fā)送數(shù)據(jù)程序
{
while(!TI); //等待發(fā)送完畢
SBUF=Data;
TI=0;
while(!TI);
}
void Send1(uchar a)
{
SBUF=a;
while(!TI);
TI=0;
while(RI==0);
RI=0;
}
int scan()
{
int a;
P2=0xF0;
while(P2==0xF0);
delay_ms(10);
while(P2==0xF0);
{
switch(P2)
{
case 0x70:a=1;break;
case 0xB0:a=5;break;
case 0xD0:a=9;break;
case 0xE0:a=13;break;
}
P2=0x0f;
switch(P2)
{
case 0x0E:a=a;break;
case 0x0D:a=a+1;break;
case 0x0B:a=a+2;break;
case 0x07:a=a+3;break;
}
}
while(P2!=0x0f);
P21=0;/*復(fù)位*/
return a;
}
uchar recv_data(void) //接收數(shù)據(jù)
{
uchar date;
while(!RI); //等待接受完畢
RI=0;
if(RB8==1) //若當(dāng)前接收為地址幀則返回0xff
return 0xff;
date=SBUF;
while(!RI);
return date;
} |