两个AT89C51单片机之间如何进行串行通信

求高手用C写个简单的程序来解析它!
2024-11-06 17:53:23
推荐回答(1个)
回答1:

  #define T1MS_1200bps 0xD8; /* (e8,-24,SMOD=0) @4800bps pcon&=0x7f @11.0592MHz*/
  #define T1MS_2400bps 0xEC; /* (f4,-12,SMOD=0) @4800bps pcon&=0x7f */
  #define T1MS_4800bps 0xfa; /* (fa, -6,SMOD=0) @4800bps pcon&=0x7f */
  #define T1MS_9600bps 0xFB; /* (fd, -3,SMOD=0) @9600bps pcon&=0x7f */
  #define T1MS_19k2bps 0xfd; /* (fd, -3,SMOD=1) @19.2kbps pcon|=0x80 */

  unsigned char z;

  /*********************************
  函数名:sel_bps(select bps)
  功能:设置串口波特率
  sel为选择通讯速率:
  0=1200,1=2400,2=4800,3=9600,4=19.2k
  作者:于振南
  日期:06.02.25
  *********************************/
  void sel_bps(unsigned char sel)
  {
  switch(sel)
  {
  case 0:PCON&=0x7f;
  TH1=T1MS_1200bps; /* T1 use sio */
  TL1=T1MS_1200bps;
  break;
  case 1:PCON&=0x7f;
  TH1=T1MS_2400bps; /* T1 use sio */
  TL1=T1MS_2400bps;
  break;
  case 2:PCON&=0x7f;
  TH1=T1MS_4800bps; /* T1 use sio */
  TL1=T1MS_4800bps;
  break;
  case 3:PCON&=0x7f;
  TH1=T1MS_9600bps; /* T1 use sio */
  TL1=T1MS_9600bps;
  break;
  case 4:PCON|=0x80;
  TH1=0xfd; /* T1 use sio */
  TL1=0xfd;
  break;
  }

  }

  /*********************************
  函数名:tran_init()(tranmit initialize)
  功能:串口初始化
  通讯有关参数初始化
  作者:于振南
  日期:06.02.25
  包含子函数:sel_bps
  *********************************/
  void tran_init() /* 通讯有关参数初始化 */
  {
  sel_bps(3); /* 选择通讯速率:0=1200,1=2400,2=4800,3=9600,4=19.2k */
  /* T1 use sio */
  TMOD=0x21; /* T1=MODE2,sio; T0=MODE1,16bit,use time */
  PS=1; /* SIO int high 优先级 */
  EA=1;
  ET1=0;

  SM0=0;
  SM1=1; /* SM0=0 SM1=1,mode1,10bit */
  SM2=0; /* data int,无校验(TB8=bit_duble偶) */

  TR1=1;
  REN=1;
  RI=0;
  TI=0;
  ES=1;

  }

  /*********************************
  函数名:sio_int(sio interrupt)
  功能:中断方式接收串口数据 把收到的一个字节放在z中
  通讯有关参数初始化
  作者:于振南
  日期:06.02.25
  *********************************/
  void sio_int() interrupt 4 using 2
  {
  ES=0;
  if(RI) /* RI==1 */
  { z=SBUF;
  RI=0;
  }
  ES=1;
  }

  void trans(unsigned char dat)
  {
  SBUF=dat;
  while(!TI);
  TI=0;
  }