多机通信(主从机程序成功)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//---------------------------------------------------------------------------------------
主机程序
//---------------------------------------------------------------------------------------
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define slave 0x03
#define BN 4
uchar code tbuf[BN]={0x3f,0x5b,0x66,0x7d};
//uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void init() //初始化
{
TR1=1;
TH1=0xf3;
TL1=0xf3;
TMOD=0x20;
SM0=0;
SM1=1;
SM2=1;
REN=1;
}
void error() //错误
{
TB8=1;
SBUF=0xf0;
while(TI!=1);
TI=0;
}
void send_date(unsigned char data1)
{
SBUF = data1; //将待发送的字符送入发送缓冲器
while(!TI); //等待发送完成
TI = 0; //发送中断标志请0
}
/*
//向串口发送一个字符串,strlen为该字符串长度
void send(uchar *str,uint strlen)
{
uchar p=0;
uint k;
do
{
for(k=0;k<strlen;k++)
{
send_date(*(str + k));
p+=*(str + k);
}
send_date(p);
while(!RI);
RI=0;
} while(SBUF!=0);
}
*/
void send() //发送数据并校验和
{
uchar i;
uint p;
do
{
p=0;
for(i=0;i<BN;i++)
{
send_date(tbuf[i]);
p+=tbuf[i]; P1=0xf0;
while(!RI);
RI=0;
}
send_date(p); P1=0x00;
while(!RI);
RI=0;
}
while(SBUF!=0);
}
void chuankou(uchar add,uchar command) //串口函数(地址,命令) {
uchar a;
while(1)
{
send_date(add);
while(!RI);
RI=0;
if(SBUF!=add)
error();
else
{
TB8=0;
send_date(command);
while(!RI);
RI=0;
a=SBUF;
if((a&0x80)==0x80)
error();
else
{
if((a&0x01)==0x01) //从机准备好接收并主机发送数据
{ P1=0xef;
send(/*tbuf,BN*/);
TB8=1;
}
}
}
}
}
void main()
{
init();
chuankou(slave,0x01);
while(1);
}
//-------------------------------------------------------------------------------------------------
从机程序
//-------------------------------------------------------------------------------------------------- #include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define slave 0x03
#define BN 4
uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; uchar rbuf[BN];
bit rready;
void delay(void) //误差0us
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
}
void init() //初始化
{
TR1=1;
TH1=0xf3;
TL1=0xf3;
TMOD=0x20;
SM0=0;
SM1=1;
SM2=1;
REN=1;
EA =1;
ES =1;
P2=0xff;
}
void error() //错误
{
SM2=1;
ES=1;
}
void send_date(unsigned char data1) //发送字符
{
SBUF = data1; //将待发送的字符送入发送缓冲器while(!TI); //等待发送完成
TI = 0; //发送中断标志请0
}
void receive() //接收并校验和
{
uchar a,i,p;
rready=0;
while(1)
{
p=0;
for(i=0;i<BN;i++)
{
while(!RI);
RI=0;
rbuf[i]=SBUF;
a=SBUF;
P2=a;
p+=rbuf[i];
delay();
send_date(0);
} P2=tab[9];
while(!RI);
RI=0;
if(SBUF==p)
{
send_date(0x00);
break;
}
else
send_date(0xff);
}
}
void main()
{
init();
while(1)
{
rready=1;
}
}
void ssio()interrupt 4
{
uchar a;
ES=0;
RI=0;
if(SBUF!=slave)
{
error();
goto reti;
}
else
{
send_date(slave);
while(!RI);
RI=0;
a=SBUF;
SM2=0;
if((a!=0x01)&&(RB8==1))
{
send_date(0x80);
error();
goto reti;
}
else
{
if((a==0x01)&&(rready==1))
{
send_date(0x01);
receive();
}
}
}
reti:;
}。

相关文档
最新文档