该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//从机程序slave.c如下
#include
#define uchar unsigned char
#define SLAVE 0x02 //从机地址
#define BN 16
bit tready;
bit rready;
void main(void)
{
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
PCON=0x00;
TR1=1;
SCON=0xf0;
ES=1;
EA=1;
while(1){tready=1;rready=1;} //假定准备好发送和接收
}
void ssio(void)interrupt 4 using 1
{ void str(void);
void sre(void):
uchar a,i;
RI=0;
ES=0; //关串行口中断·
if(SBUF!=SLAVE){ES=1;goto reti;} //非本机地址、继续监听
SM2=0; //取消监听状态
SBUF=SLAVE; //从机地址发回
while(TI!=1);TI=0;
while(RI!=1);RI=0;
if(RB8==1){SM2=1;ES=1;goto reti;} //是复位信号,恢复监听
a=SBUF; //接收命令
if(a=0x01){ //从机接收主机的数据
if(rready==1)SBUf=0x01; //接受准备好发送状态
else SBUF=0x00;
while(TI!=1);TI=0;
while(RI!=1);RI=0;
fi(RB8==1){SM2=1;ES=1;goto reti;}
sre();
} //接收数据块
else{
if(a=0x02){ //从机向主机发数据
if(tready==1)SBUF=0x02; //发送准备好发送状态
else SBUF=0x00;
while(TI!=1);TI=0;
while(RI!=1);RI=0;
if(RB8==1){SM2=1;ES=1;goto reti;}
str(); } //发送数据块
else{
SBUF=0x80; //命令非法,发状态
while(TI!=1);TI=0;
SM2=1;
ES=1; //发送状态
}
}reti;
}
void str(void)// 发送数据块
{ uchar p.i;
tready=0;
do{p=0;// 清校验和
for(i=0;i
{SBUF=trbuf[i];// 发送一数据
p+=trbuf[i];
while(TI!=1);
TI=0;
}
SBUF=p;// 发送校验和
while(TI!=1);TI=0;
while(RI!=1);RI=0;
}while(SBUF!=0); //主机接受不正确,重新发送
SM2=1;
ES=1;
}
void ste(void) //接收数据块
{ uchar p,i;
rready=0;
while(1)
{ p=0; // 清校验和
for(i=0;i
{while(RI!=1);RI=0;
rebuf{i}=SBUF;
p+=rebuf[i]; // 接收一数据
}
while(RI!=1);RI=0;
if(SBUF==p){SBUF=0x00;break;} // 校验和相同发“00”
else{
SUBF=0xff;//校验和不同发“ff”重新接收
while(TI==0);TI=0;
}
}
SM2=1;
ES=1;
}