新手求教 rs485通信问题
时间:10-02
整理:3721RD
点击:
以下是我的双机通信程序#include<reg51.h>
#include<delays_100ms.h>
#include<delays_500ms.h>
#include<delays_10ms.h>
#include<delays_5ms.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit k4=P1^4;
sbit RT=P3^7;
#define txd P3^1;
u8 a;
u8 du;
u8 du2;
u8 flag;
u8 jian;
u16 he;
void man2();
void main();
void send();
void anjian();
u8 code d[]={0xFF,0x01,0x01,0x00,0xaa,0x01};
//串口初始化//
void int1()
{
TMOD=0x20;
TH1=0xfd;
TL1=TH1;
SCON=0x50;
PCON=0x00;
TR1=1;
delays_100ms();
EA=1;
ES=0;
}
void man1()
{
int1();
while(1)
{
a=1;
RT=1;
if(k1==0) //按键判断
{
delays_100ms(); //去抖
if(k1==0)
{
a=0; //按键标志
jian=0x01; //按键地址
}
else a=1;
}
if(k2==0)
{
delays_100ms();
if(k2==0)
{
a=0;
jian=0x02;
}
else a=1;
}
if(k3==0)
{
delays_100ms();
if(k3==0)
{
a=0;
jian=0x03;
}
else a=1;
}
if(k4==0)
{
delays_100ms();
if(k4==0)
{
a=0;
jian=0x04;
}
else a=1;
}
//发送数据
if(a==0 && (k1==0||k2==0||k2==0||k3==0||k4==0))
{
TI=1;
SBUF=d[0]; //同步字节
while(!TI);
TI=0;
he=0x00;
delays_500ms();
SBUF=d[1]; //地址
delays_100ms();
he=he+d[1];
while(!TI);
TI=0;
delays_500ms();
SBUF=jian; //按键
delays_100ms();
he=he+jian;
while(!TI);
TI=0;
delays_500ms();
SBUF=d[3]; //工作模式
delays_100ms();
he=he+d[3];
while(!TI);
TI=0;
delays_500ms();
SBUF=d[4]; //读 写
delays_100ms();
he=he+d[4];
while(!TI);
TI=0;
delays_500ms();
SBUF=d[5]; //数据1
delays_100ms();
he=he+d[5];
while(!TI);
TI=0;
delays_500ms();
SBUF=he; //校验和
while(!TI);
TI=0;
}
delays_100ms();
RT=~txd;
delays_100ms();
if(RI)
{
man2();
}
}
}
/* main.2 */
void int2()
{
TMOD=0x20;
TH1=0xfd;
TL1=TH1;
SCON=0x50;
PCON=0x00;
delays_100ms();
TR1=1;
EA=1;
ES=1;
}
void ser() interrupt 4 using 1 //中断接收
{
if(RI)
{
flag=flag+1;
RI=0;
du2=SBUF;
RT=1;
delays_10ms();
P2=du2;
delays_5ms();
RT=0;
}
else
TI=0;
}
void man2()
{
int2();
delays_100ms();
RT=0;
delays_100ms();
while(flag<6);
flag=1;
if(P1==0xff)
{
man1();
}
}
void main(void)
{
if(P1!=0xff)
{
man2();
}
else
man1();
}
两个单片机接收和发送都可以,只不过在接收和发送切换时的一帧数据会少接收一位。
弄了很久都没搞定。
#include<delays_100ms.h>
#include<delays_500ms.h>
#include<delays_10ms.h>
#include<delays_5ms.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit k4=P1^4;
sbit RT=P3^7;
#define txd P3^1;
u8 a;
u8 du;
u8 du2;
u8 flag;
u8 jian;
u16 he;
void man2();
void main();
void send();
void anjian();
u8 code d[]={0xFF,0x01,0x01,0x00,0xaa,0x01};
//串口初始化//
void int1()
{
TMOD=0x20;
TH1=0xfd;
TL1=TH1;
SCON=0x50;
PCON=0x00;
TR1=1;
delays_100ms();
EA=1;
ES=0;
}
void man1()
{
int1();
while(1)
{
a=1;
RT=1;
if(k1==0) //按键判断
{
delays_100ms(); //去抖
if(k1==0)
{
a=0; //按键标志
jian=0x01; //按键地址
}
else a=1;
}
if(k2==0)
{
delays_100ms();
if(k2==0)
{
a=0;
jian=0x02;
}
else a=1;
}
if(k3==0)
{
delays_100ms();
if(k3==0)
{
a=0;
jian=0x03;
}
else a=1;
}
if(k4==0)
{
delays_100ms();
if(k4==0)
{
a=0;
jian=0x04;
}
else a=1;
}
//发送数据
if(a==0 && (k1==0||k2==0||k2==0||k3==0||k4==0))
{
TI=1;
SBUF=d[0]; //同步字节
while(!TI);
TI=0;
he=0x00;
delays_500ms();
SBUF=d[1]; //地址
delays_100ms();
he=he+d[1];
while(!TI);
TI=0;
delays_500ms();
SBUF=jian; //按键
delays_100ms();
he=he+jian;
while(!TI);
TI=0;
delays_500ms();
SBUF=d[3]; //工作模式
delays_100ms();
he=he+d[3];
while(!TI);
TI=0;
delays_500ms();
SBUF=d[4]; //读 写
delays_100ms();
he=he+d[4];
while(!TI);
TI=0;
delays_500ms();
SBUF=d[5]; //数据1
delays_100ms();
he=he+d[5];
while(!TI);
TI=0;
delays_500ms();
SBUF=he; //校验和
while(!TI);
TI=0;
}
delays_100ms();
RT=~txd;
delays_100ms();
if(RI)
{
man2();
}
}
}
/* main.2 */
void int2()
{
TMOD=0x20;
TH1=0xfd;
TL1=TH1;
SCON=0x50;
PCON=0x00;
delays_100ms();
TR1=1;
EA=1;
ES=1;
}
void ser() interrupt 4 using 1 //中断接收
{
if(RI)
{
flag=flag+1;
RI=0;
du2=SBUF;
RT=1;
delays_10ms();
P2=du2;
delays_5ms();
RT=0;
}
else
TI=0;
}
void man2()
{
int2();
delays_100ms();
RT=0;
delays_100ms();
while(flag<6);
flag=1;
if(P1==0xff)
{
man1();
}
}
void main(void)
{
if(P1!=0xff)
{
man2();
}
else
man1();
}
两个单片机接收和发送都可以,只不过在接收和发送切换时的一帧数据会少接收一位。
弄了很久都没搞定。
中断里面没有处理一下啊
刚学,不是很懂,能讲讲该怎么处理吗?