?? 11.2.c
字號:
#include<reg51.h>
#define uchar unsigned char
#define BN 16 //傳送一次的字節數
uchar master(uchar addrs,uchar comnd);
uchar SLAVE=0x00; //從機地址
uchar idata rdata[16];
uchar idata tdata[16]={"abcdefghijklmnop"};
void main(void)
{
uchar i;
for(i=0;i<10;i++)
TMOD=0x20; //定時器T1定義為模式2
TL1=0xfd;TH1=0xfd; //置初值
PCON=0x00;
TR1=1;
SCON=0xD0; //設置串行口控制字,方式3,允許接收
master(SLAVE,0x01);
master(SLAVE,0x02);
SLAVE++;
}
void error(void)
{
SBUF=0xFF; //發給從機數據出錯標志
while(TI!=1); //等待發送完
TI=0;
}
uchar master(uchar addrs,uchar comnd)
{ uchar a,i,p;
while(1)
{
SBUF=SLAVE; //發呼叫地址
while(TI!=1); //等待發送完
TI=0;
while(RI!=1); //等待從機應答
RI=0;
if(SBUF!=addrs)
error(); //若地址出錯,發出錯標志,從機復位
else{
TB8=0; //清地址標志位,準備接收數據
SBUF=comnd; //發命令幀
while(TI!=1);TI=0;
while(RI!=1);RI=0;
a=SBUF; //接收從機的返回地址幀
if((a&0x80)==0x80){TB8=1;error();} //若主機命令非法,發復位信號給從機
else
{
if(comnd==0x01) //主機發送的命令是請求從機接收數據
{if((a&0x01)==0x01) //從機準備接收就緒
{do{
p=0; //清校驗和
for(i=0;i<BN;i++)
{SBUF=tdata[i]; //發送數據
p=p+tdata; //計算校驗和
while(TI!=1);TI=0;
}
SBUF=p; //發送校驗和給從機
while(TI!=1);TI=0;
while(RI!=1);RI=0;
}while(SBUF!=0); //從機接收不正確,主機重新發送
TB8=1; //重置地址標志位
return(0);
}
}
else{
if(comnd==0x02) //主機發送的是接收命令,從機發送數據
{if((a&0x02)==0x02) //從機準備發送就緒
{while(1)
{p=0;
for(i=0;i<BN;i++)
{while(RI!=1);RI=0;
rdata[i]=SBUF; //主機接收數據
p+=rdata[i];
}
while(RI==0);RI=0;
if(SBUF==p)
{
SBUF=0x00; //校驗和相同,發0x00給從機
while(TI!=1);TI=0;
}
else
{SBUF=0x0F; //校驗和不同,發0x0F給從機
while(TI!=1);TI=0;
}
}
TB8=1; //重置地址標志位
return(0);
}
}
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -