📄 slave.c
字号:
#include<c8051f020.h>
#define uchar unsigned char
#define SLAVE0 0x02 //从机地址
#define BN0 16
uchar trbuf[16];
uchar rebuf[16];
bit tready;
bit rready;
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TR1=1;
SADDR0=SLAVE0; //从机地址
SADEN0=0xff;
SCON0=0xf0; //UART0方式3,SM20=1,REN0=1,TB80=0
ES0=1;
EA=1; //开中断
while(1){tready=1;rready=1;} //等待中断
}
void ssio(void) interrupt 4 using 1 //中断函数
{
void str(void); //函数声明
void sre(void);
uchar a;
RI0=0;
ES0=0;
if(SBUF0!=SLAVE0){ES0=1;goto reti;} //非本机地址,继续监听,因c8051f内部
//可自动判断,因此这句可省
SM20=0;
SBUF0=SLAVE0; //回送从机地址
while(!TI0);TI0=0;
while(!RI0);RI0=0; //接收命令
if(RB80==1){SM20=1;ES0=1;goto reti;} //是复位命令,继续监听
a=SBUF0;
if(a==0x01) //接收主机数据命令
{
if(rready==1) SBUF0=0x01; //发准备好接收状态字
else SBUF0=0x00; //发未准备好接收状态字
while(!TI0);TI0=0;
sre();
}
else
{
if(a==0x02) //向主机发送数据的命令
{
if(tready==1) SBUF0=0x02; //发准备好接收状态字
else SBUF0=0x00; //发未准备好接收状态字
while(!TI0);TI0=0;
str();
}
else
{
SBUF0=0x08; //发送非法命令状态字
while(!TI0);TI0=0;
SM20=1;ES0=1; //恢复监听
}
}
reti: ;
}
void str(void) //发送数据块
{
uchar p0,i0;
tready=0;
do
{
p0=0;
for(i0=0;i0<BN0;i0++) //发送BN字节数据
{
SBUF0=trbuf[i0];
p0+=trbuf[i0];
while(!TI0);TI0=0;
}
SBUF0=p0; //发送校验和
while(!TI0);TI0=0;
while(!RI0);RI0=0; //接收主机应答
}while(SBUF0!=0);
SM20=1;
ES0=1;
}
void sre(void) //接收数据块
{
uchar p0,i0;
rready=0;
while(1)
{
p0=0;
for(i0=0;i0<BN0;i0++)
{
while(!RI0);RI0=0;
rebuf[i0]=SBUF0;
p0+=SBUF0;
}
while(!RI0);RI0=0;
if(SBUF0==p0)
{ SBUF0=0x00;
while(!TI0);TI0=0;
break;
}
else
{
SBUF0=0xff;
while(!TI0);TI0=0;
}
}
SM20=1;
ES0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -