📄 tongx3.c
字号:
/*********************************************************************
文件名: tongx3.c
功 能:AT89C52与N台AT89C2051通讯(这里N取64),双方均有RS485接口,
AT89C52用T2作波特率发生器, 波特率为9600,配套AT89C2051
程序为EYE124.C
**********************************************************************/
#include <reg52.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit p14=P1^4;
uchar idata kc1,kc2,aa,iii;
uchar idata rbut2[36];
uchar idata tbut[12];
uchar idata rbut[16];
uint idata r;
void timedelay(uint timess);
sio0() interrupt 4 //通讯中断服务程序
{
one:if (SM2==0) goto noar;
if (SBUF!=aa) goto noads;
SM2=0;
noads:RI=0;
TI=0;
return;
noar:;
rbut[kc2]=SBUF;
kc2++;
if (kc2!=16) goto noads;
SM2=1;
goto noads;
}
void timedelay(uint timess) //延时程序
{
uint tj;
for (tj=timess;tj>0;tj--){;}
}
void intrbut(void) //通讯数据区初始化
{
uchar coni;
for (coni=0;coni<3;coni++)
{
rbut[coni]=0;
}
rbut[2]=0x87; //8888888
rbut[3]=0xa2;
rbut[4]=0x38;
rbut[5]=0x87; //8888888
rbut[6]=0xa2;
rbut[7]=0x38;
rbut[8]=0x87; //8888888
rbut[9]=0xa2;
rbut[10]=0x38;
rbut[11]=0x87; //8888888
rbut[12]=0xa2;
rbut[13]=0x38;
}
/*注:前面3个字节十六进制数0x87,0xa2,0x38的对应十进制数为“8888888”,它在通讯系统中的作用是,如果通讯失败,取固定数8888888作为传来数。这样便于识别通讯是成功还是失败。当然,用别的固定数来作标志也可以。*/
void communi(void) /* RS-485 通讯 */
{
uchar coni;
kc1=0;
kc2=0;
aa=0;
intrbut();
for (coni=0;coni<10;coni++)//发送数据区初始化
{
tbut[coni]=0x00;
}
tbut[2]=01;
tbut[3]=02;
tbut[4]=03;
tbut[5]=tbut[2]+tbut[3]+tbut[4];//发送数据设定
TR2=1;
for (coni=0;coni<64;coni++) //共与64台分站通讯
{
aa=coni+1;
p14=1; //准备发送
timedelay(20000);
SCON=0xe8; //第9位为1
ES=0;
EA=0;
SBUF=aa; //发送地址
loo1:while(TI==0);
TI=0;
SCON=0xe0; //第9位为0
SBUF=tbut[kc1]; //发送数据
kc1++;
if (kc1!=11) goto loo1; //发送未完,转
kc1=0;
p14=0; //准备接收
SCON=0xf0;
ES=1;
EA=1;
r=0;
loo:;
if (kc2!=16) {r++; if(r>65530) {goto sss;} else {goto loo;}}
sss:; //接收完,退出;未接收完,等待时间到,也退出
kc2=0;
if(r>65530) {intrbut();} //如果通讯失败,取固定数作为传来数
for (iii=0;iii<12;iii++) //保存通讯数据
{
rbut2[(aa-1)*12+iii]=rbut[2+iii];
}
}
TR2=0;
EA=1;
}
void main(void) //主程序
{
SP=0xdf;
timedelay(10000);
EA=0;
kc1=0;
kc2=0;
T2CON=0; //通讯波特率设定:11.0592mhz,9600=ffdc;
T2IE=1; //定时器T2作为波特率发生器
T2RSE=1;
RCAP2H=0xff;
RCAP2L=0xdc;
EA=1;
communi(); //调用RS-485 通讯程序
while(1); //等待
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -