⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tongx3.c

📁 《单片机应用系统开发实例详解》 光盘 程序
💻 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 + -