从机第一次可以进入中断接收数据,第二次没有进入中断。经过测试,中断确实进入过一次。中断程序如下,求助
void ssio(void) interrupt 4 //串行口中断函数,选择1组工作寄存器
{
uchar a;
RI=0;
ES=0; //准备接收
if(SBUF!=SLAVE){ES=1;goto reti;} //接收地址不是本机地址,则返回
SM2=0; //是本机地址,sm2清零,为接收数据命令做准备
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(rrdy==1) //判断从机是否接收就绪
{SBUF=0X01; //就绪,则发送接收就绪命令
while(TI!=1);TI=0;
sre(); //接收数据
}
else
{SBUF=0X00;SM2=1;ES=1;goto reti;} //未就绪,则发送未就绪信号,返回
}
//从机发送命令,则准备发送就绪
else
{if(a==0x02)
{
if(trdy==1) //判断从机是否发送就绪
{SBUF=0X02; //就绪,则发送发送就绪标志
while(TI!=1);TI=0;
str();
}
else
{SBUF=0X00;SM2=1;ES=1;goto reti;} //未就绪,则发送未就绪信号,返回
}
else //不是合法命令,则发ERR=1标志
{SBUF=0x80;
while(TI!=1);TI=0;
SM2=1;ES=1;
}
}
ES=1; //开中断
reti:;
}
void str(void) //发送函数
{
trdy=0;
SBUF=0x01;
while(TI!=1);TI=0;
SM2=1;
ES=1;
}
void sre(void) //接收函数
{
rrdy=0;
while(RI!=1);RI=0;
receiv=SBUF;
dis(); //显示接收到的数据
while(RI!=1);RI=0;
SM2=1;
ES=1;
}
|