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

📄 comu485.lst

📁 单片机的多级通讯程序 包含有keil源程序 和proteus的仿真程序
💻 LST
字号:
C51 COMPILER V7.50   COMU485                                                               06/30/2008 23:36:27 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE COMU485
OBJECT MODULE PLACED IN .\comu485.obj
COMPILER INVOKED BY: D:\Edu\Software\Keil\C51\BIN\C51.EXE ..\common\comu485.c BROWSE NOAREGS INCDIR(..\common) DEBUG OBJ
                    -ECTEXTEND PRINT(.\comu485.lst) OBJECT(.\comu485.obj)

line level    source

   1          
   2          #include "reg52.H"
   3          #include "Typedef.H"
   4          #include "UserDef.H"
   5          #include "Comu485.H"
   6          
   7          #define BAUD    1200            
   8          #define T_Baud8_0       (256 - F_OSC/BAUD/12/32)        //SMOD=0
   9          #define T_Baud8_1       (256 - F_OSC/BAUD/12/16)        //SMOD=1
  10          
  11          /*
  12                  通讯协议:
  13                  BoF + 地址 + 数据(变长)+ EoF ; 支持ESC换码
  14          
  15                  因为本范例中数据及地址由主机的键盘输入,因此,只能产生‘0’~‘9’有限数字。
  16                  
  17          */
  18          
  19          /*  */
  20          #define CC_BOF '1'
  21          #define CC_EOF '2'
  22          #define CC_ESC '3'
  23          
  24          /*  全局变量 */
  25          INT8U comu_recv_len = 0;
  26          INT8U idata Rxbuf[32];
  27          static INT8U iRx=0;
  28          static INT8U idata Txbuf[32];
  29          static INT8U iTx=0;
  30          static INT8U myaddr;
  31          
  32          sbit P_Tx = P3^2;       /* RS485芯片的发送/接收工作状态控制 */
  33          
  34          /***************************************
  35          
  36                  串口初始化
  37                  入口参数:
  38                  返回值:
  39          
  40          ****************************************/
  41          void comu_init(INT8U addr)
  42                  {
  43   1              /* 串口通讯相关定时器设置  */
  44   1              TMOD &= 0x0F;                                           //定时器1 :自动再装入8位定时器
  45   1              TMOD |= 0x20;                                           
  46   1              TH1 = T_Baud8_0;TL1=T_Baud8_0;          //波特率
  47   1      
  48   1              /* 串口配置  */
  49   1              SCON = 0x50;                                            //方式1,SM2=0,8Bits,REN=1
  50   1              PCON = 0x00;                                            //SMOD=0
  51   1      //      PCON = 0x80;                                            //SMOD=1
  52   1      
  53   1              myaddr = addr;
  54   1              P_Tx = 0;
C51 COMPILER V7.50   COMU485                                                               06/30/2008 23:36:27 PAGE 2   

  55   1      
  56   1              ES = TRUE;                                                      //串口中断允许
  57   1              TR1 = TRUE;                                                     //启动波特率定时器
  58   1              }
  59          
  60          
  61          /* 对发送内容进行格式化,加上BoF,EoF,以及在需要时换码,并发送头一个字符,以启动发送序列 */
  62          void comu485_send_packet(INT8U * send_data,INT8U len)
  63          {
  64   1              INT8U c,i;
  65   1      
  66   1              Txbuf[0] = CC_BOF;
  67   1              i = 1;
  68   1              while (len!=0)
  69   1              {
  70   2                      c = *send_data;         
  71   2                      if ((c==CC_BOF) || (c==CC_EOF) || (c==CC_ESC))
  72   2                      {
  73   3                              Txbuf[i] = CC_ESC;
  74   3                              i ++;
  75   3                              Txbuf[i] = ~c;
  76   3                              i ++;   
  77   3                      }
  78   2                      else
  79   2                      {
  80   3                              Txbuf[i] = c;
  81   3                              i ++;   
  82   3                      }
  83   2                      
  84   2                      send_data ++;
  85   2                      len --;
  86   2              }               
  87   1              Txbuf[i] = CC_EOF;
  88   1      
  89   1              P_Tx = 1;
  90   1              iTx = 0;
  91   1              SBUF = CC_BOF;
  92   1      }
  93          
  94          /* 对接收到的内容进行处理,去除可能存在的换码,返回接收到的字节数 */
  95          INT8U comu485_recv_packet(INT8U len)
  96          {
  97   1              INT8U i,n;
  98   1      
  99   1              i = 0;
 100   1              n = 0;
 101   1      
 102   1              while (i<len)
 103   1              {
 104   2                      if (Rxbuf[i] == CC_ESC)
 105   2                      {
 106   3                              i ++;
 107   3                              Rxbuf[n] = ~Rxbuf[i];
 108   3                      }
 109   2                      else
 110   2                      {
 111   3                              Rxbuf[n] = Rxbuf[i];
 112   3                      }
 113   2                      n ++;
 114   2                      i ++;
 115   2              }
 116   1      
C51 COMPILER V7.50   COMU485                                                               06/30/2008 23:36:27 PAGE 3   

 117   1              return n;
 118   1      }
 119          
 120          //-------------------------------------
 121          //       串口中断
 122          //-------------------------------------
 123          void int_comu(void) interrupt 4 using 2
 124          {
 125   1              INT8U c;
 126   1      
 127   1              /* 发送中断  */
 128   1              if (TI)
 129   1              {
 130   2                      TI = FALSE;
 131   2                      if (Txbuf[iTx] == CC_EOF)
 132   2                      {
 133   3                              P_Tx = 0;
 134   3                      }
 135   2                      else
 136   2                      {
 137   3                              iTx ++;
 138   3                              SBUF = Txbuf[iTx];
 139   3                      }
 140   2              }
 141   1      
 142   1              /* 接收中断  */
 143   1              if (RI)
 144   1              {
 145   2                      RI = FALSE;
 146   2                      c = SBUF;
 147   2                      if (c == CC_BOF)
 148   2                      {
 149   3                              iRx = 0;
 150   3                      }
 151   2                      else if (c == CC_EOF)
 152   2                      {
 153   3                              comu_recv_len = comu485_recv_packet(iRx);       
 154   3                              if (Rxbuf[0] != myaddr)
 155   3                              {
 156   4                                      comu_recv_len = 0;
 157   4                              }
 158   3                      }
 159   2                      else
 160   2                      {
 161   3                              Rxbuf[iRx] = c;
 162   3                              iRx ++;
 163   3                      }
 164   2              }
 165   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    229    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4    ----
   IDATA SIZE       =     64    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -