本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
主机程序://#include<AT89X52.h>
#include<AT892051.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define SLAVE 0x78 //从机地址
#define BN 4
uchar idata rbuf[4];
uchar idata tbuf[4]={0x7f,0xfb,0x7b,0xff};
sbit P13=P1^3;
void delay(unsigned int N)
{
int i;
for(i=0;i<N;i++)
{
_nop_();
}
}
void err(void) //发复位FFH命令
{
SBUF=0xff;
while(!TI);
TI=0;
}
uchar master(uchar addr,uchar command) //主机函数
{
uchar aa,i,p;
while(1)
{
SBUF=SLAVE; //发呼叫地址
while(!TI);
TI=0;
while(!RI); //等待从机回答
RI=0;
P1=SBUF;
if(SBUF!=addr)
{
err(); //地址错,发复位命令
}
else
{ //地址相符
TB8=0; //清地址标志
SBUF=command; //发命令
while(!TI);
TI=0;
delay(200000000);
while(!RI);
RI=0; //等待从机命令答复
aa=SBUF;
P1=SBUF;
if((aa&0x80)==0x80)
{
TB8=1; //命令出错,发复位命令
err();
}
else
{
if(command==0xf0) //是发送命令
{
if((aa&0xf0)==0xf0) //从机准备好接收
{
do{
p=0; //清校验和
for(i=0;i<BN;i++)
{
SBUF=tbuf[i]; //发送一字节
p+=tbuf[i];
while(!TI);
TI=0;
delay(200000000);
}
SBUF=p; //发校验和
while(!TI);
TI=0;
while(!RI);
RI=0; //等待校验和的应答
}while(SBUF!=0); //接收出错,重发。00h为正确,ffh为错误
TB8=1; //接收正确,置地址标志
return(0);
}
}
else
{
if((aa&0x02)==0x02) //从机准备好发送
{
while(1)
{
p=0; //清校验和
for(i=0;i<BN;i++)
{
while(!RI);
RI=0;
rbuf[i]=SBUF; //接受一数据
p+=rbuf[i];
}
while(!RI);
RI=0;
if(SBUF==p)
{
SBUF=0x00; //校验和相同,发00h
while(!TI);TI=0;
break; //退出
}
else
{
SBUF=0xff; //校验和不同,发0FF,重新接收
while(!TI);TI=0;
}
}
TB8=1; //置地址标志
return(0);
}
}
}
}
}
}
void init()
{
//P0=0xff;
P1=0xff;
//P2=0xff;
P3=0xff;
TMOD=0x20; //T1方式3
TH1=0xf9;
TL1=0xf9; /*传输波特率4800,设SYSDCLK=12Mhz,T1M=0(按振荡器的12分频计数),SMOD0=0*/
PCON=0x00;
TR1=1;
SCON=0xf8;
}
char code SST516[3]_at_ 0x003b;
void main()
{
init();
delay(200000000);
P13=0; //UART0方式3,SM20=1,REN0=1,TB80=1
master(SLAVE,0xf0);
//master(SLAVE,0x02);
}
从机程序:#include<AT892051.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define SLAVE 0x78
#define BN 4
uchar idata trbuf[4];
uchar idata rebuf[4];
bit tready;
bit rready;
sbit P13=P1^3;
void str(void); //函数声明
void sre(void);
void inint()
{
P1=0xff;
P3=0xff;
TMOD=0x20;
TH1=0xf9;
TL1=0xf9;
PCON=0x00;
TR1=1;
SCON=0xf0;
//EA=1;
//PS=1;
//ES=1;
}
void delay(unsigned int N)
{
int i;
for(i=0;i<N;i++)
{
_nop_();
}
}
void serial()
//void serial () interrupt 4 using 3 //中断函数
{
uchar a;
RI=0;
//ES=0; //关串行口中断
P1=SBUF;
if(SBUF!=SLAVE)
{
//ES=1;
goto reti;
} //非本机地址,继续监听
SM2=0;
SBUF=SLAVE; //回送从机地址
while(!TI);
TI=0;
delay(200000000);
while(!RI);
RI=0; //接收命令
if(RB8==1)
{
SM2=1;
//ES=1;
goto reti;
} //是复位命令,继续监听
P1=SBUF;
a=SBUF;
if(a==0xf0) //接收主机数据命令
{
if(rready==1)
{
SBUF=0xf0; //发准备好接收状态字
}
else
{
SBUF=0x80; //发未准备好接收状态字
}
while(!TI);
TI=0;
delay(200000000);
while(!RI);
RI=0;
if(RB8==1)
{
SM2=1;
//ES=1;
goto reti;
}
sre();
}
else
{
if(a==0x02) //向主机发送数据的命令
{
if(tready==1)
{
SBUF=0x02; //发准备好接收状态字
}
else
{
SBUF=0x00; //发未准备好接收状态字
}
while(!TI);
TI=0;
str();
}
else
{
SBUF=0x08; //发送非法命令状态字
while(!TI);
TI=0;
SM2=1;
//ES=1; //恢复监听
}
}
reti: ;
}
//char code SST516[3]_at_ 0x003b;
void main()
{
inint();
P13=0;
delay(200000000);
while(1)
{
tready=1;
rready=1;
if(RI)
{
serial();
}
}
}
void sre(void) //接收数据块
{
uchar p,i;
rready=0;
while(1)
{
p=0;
for(i=0;i<BN;i++)
{
while(!RI);
RI=0;
P1=SBUF;
rebuf[i]=SBUF;
p+=rebuf[i];
}
while(!RI);
RI=0;
if(SBUF==p) //校验相同,发FF
{
SBUF=0x00;
while(!TI);
TI=0;
break;
}
else
{
SBUF=0xff;
while(!TI);TI=0;
}
}
}
void str(void) //发送数据块
{
uchar p,i;
tready=0;
do
{
p=0;
for(i=0;i<BN;i++) //发送BN字节数据
{
SBUF=trbuf[i];
p+=trbuf[i];
while(!TI);
TI=0;
}
SBUF=p; //发送校验和
while(!TI);
TI=0;
while(!RI);
RI=0; //接收主机应答
}while(SBUF!=0); //主机接受不正确,重新发送
SM2=1;
//ES=1;
}
不知道是不是程序有问题,总是的不到我想要的数据,请版主和各位大侠看看,指导! |