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

📄 comm485.lst

📁 STC12C5410AD模拟串口再现多串口通讯
💻 LST
📖 第 1 页 / 共 2 页
字号:
 168   1          TCON_ENABLE_TIMER = 0;             //停止定时器  
 169   1          rs_f_TI_enable = 1;                //允许发送  
 170   1          rs_f_RI_enable = 0;                //禁止接收  
 171   1      
 172   1          rs_shift_count = 0;                //清移位计数器  
 173   1          rs_f_TI   = 1;                     //发送一个字符完毕标志  
 174   1          TCON_ENABLE_TIMER = 1;             //启动定时器
 175   1      }
 176          
 177          void soft_rs232_interrupt( void )
 178          {
 179   1          /************************ 接收 ****************************/
C51 COMPILER V7.06   COMM485                                                               12/15/2008 11:34:39 PAGE 4   

 180   1          if (rs_f_RI_enable == 1)
 181   1          {
 182   2              if (rs_shift_count == 0)        //移位计数器==0, 表示检测到起始位的起点   
 183   2              {
 184   3                  if ( rs_RXD == 1 )
 185   3                  {
 186   4                      soft_receive_enable (); //起始位错, 从新开始   
 187   4                  }
 188   3                  else
 189   3                  {
 190   4                      //下次中断在数据位或停止位中的某时刻发生 
 191   4                                      rs_timerL += rs_FULL_BIT_L;// + 0x10;
 192   4                      rs_timerH  = rs_FULL_BIT_H;
 193   4                      rs_shift_count++;              
 194   4                      rs_BUF = 0;             //清移位缓冲变量   
 195   4                  }
 196   3              }
 197   2              else
 198   2              {
 199   3                  rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生    
 200   3                  rs_timerH = rs_FULL_BIT_H;
 201   3                                             
 202   3                  rs_shift_count++;           //2--9:数据位 10:停止位 
 203   3                                             
 204   3                  if ( rs_shift_count == 9)
 205   3                  {
 206   4                      rs_BUF = rs_BUF >> 1;   //接收第8位   
 207   4                      rs_BUF_bit7 = rs_RXD;
 208   4                      if( ReceivePoint < rs_RECEIVE_MAX)
 209   4                      {                       //保存收到的字节    
 210   5                          rs232buffer[ReceivePoint++] = rs_BUF;
 211   5                      }
 212   4                      else
 213   4                      {
 214   5                          rs_f_RI_enable = 0; //缓冲区满, 禁止接收   
 215   5                      }
 216   4                  }
 217   3                  else
 218   3                  {
 219   4                      if (rs_shift_count < 9 ) //收到的是数据位 1 -- 7  
 220   4                      {
 221   5                          rs_BUF = rs_BUF >> 1;
 222   5                          rs_BUF_bit7 = rs_RXD;
 223   5                      }
 224   4                      else
 225   4                      {   //收到停止位,继续检测 PC 机发出的下一个起始位    
 226   5                          soft_receive_init(); 
 227   5                      }
 228   4                  }
 229   3              }
 230   2              TCON_TFx = 0;                  //清定时器中断标志   
 231   2          }
 232   1          else
 233   1          {
 234   2              /************************ 发送 ****************************/  
 235   2              if (rs_f_TI_enable == 1)
 236   2              {
 237   3                  rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻   
 238   3                  rs_timerH  = rs_FULL_BIT_H;
 239   3      
 240   3                  rs_shift_count--;          //0:停止位末尾时刻到  
 241   3                                             //1:发送停止位  
C51 COMPILER V7.06   COMM485                                                               12/15/2008 11:34:39 PAGE 5   

 242   3                                             //2--9:发送数据位  
 243   3                  if (rs_shift_count > 9)    //错误状态  
 244   3                  {
 245   4                      rs_shift_count = 9;
 246   4                      rs_BUF = 0xFF;
 247   4                  }
 248   3      
 249   3                  if (rs_shift_count > 1)    //2--9:发送数据位  
 250   3                  {
 251   4                      ACC = rs_BUF;
 252   4                      ACC = ACC >> 1;
 253   4                      rs_TXD = CY;
 254   4                      rs_BUF = ACC;
 255   4                  }
 256   3                  else
 257   3                  {
 258   4                      if (rs_shift_count == 0) //0:停止位末尾时刻到  
 259   4                      {
 260   5                          rs_TXD = 1;
 261   5                          rs_f_TI = 1;       //已发送完毕一个字节  
 262   5                      }
 263   4                      else
 264   4                      {
 265   5                          rs_TXD = 1;        //1:发送停止位  
 266   5                      }
 267   4                  }
 268   3              }
 269   2          }
 270   1      }
 271          
 272          //由收转到发时,要先调用 soft_send_enable ()  
 273          void rs_send_byte(uint8 SendByte)      //发送一个字节  
 274          {
 275   1          while ( rs_f_TI == 0);             //等待发送完毕前一个字节  
 276   1          rs_TXD = 1;
 277   1          rs_timerL = rs_START_BIT_L;        //下次中断在起始位的末尾时刻   
 278   1          rs_timerH = rs_START_BIT_H;
 279   1          rs_BUF = SendByte;
 280   1          rs_shift_count = 10;
 281   1          rs_TXD = 0;                        //发送起始位  
 282   1          rs_f_TI = 0;                       //清已发送完毕一个字节的标志   
 283   1      }
 284          
 285          void initiate_MCU (void)               //系统初始化  
 286          {
 287   1          soft_rs232_init();                 //串口初始化  
 288   1          EA = 1;                            //开中断  
 289   1      }
 290          
 291          void main (void)
 292          {
 293   1      //首先发送 128 个字节 00H--7FH, 然后等待 PC 机发送的数据。当收到 128
 294   1      //个字节后,立刻将收到的 128 个数据回发送给 PC 机,然后继续等待下一个
 295   1      //数据块。
 296   1        
 297   1          uint8 i;
 298   1          initiate_MCU();                    //系统初始化 
 299   1      
 300   1          soft_send_enable ();               //允许发送,禁止接收  
 301   1          for (i=0; i < rs_RECEIVE_MAX; i++ )
 302   1          {
 303   2                  COMEN = 0;
C51 COMPILER V7.06   COMM485                                                               12/15/2008 11:34:39 PAGE 6   

 304   2              rs_send_byte(i);
 305   2          }
 306   1          while ( rs_f_TI == 0)  ;           // 等待最后一个字节发送完毕   
 307   1      
 308   1          while(1)
 309   1          {
 310   2                  COMEN = 1;
 311   2              soft_receive_enable ();        //启动并开始接收,禁止发送  
 312   2              while (ReceivePoint < rs_RECEIVE_MAX); // 等待接收缓冲区满  
 313   2      
 314   2              soft_send_enable ();           //允许发送,禁止接收  
 315   2              for (i=0; i < rs_RECEIVE_MAX; i++ )
 316   2              {
 317   3                              COMEN = 0;
 318   3                  rs_send_byte(rs232buffer[i]);
 319   3              }
 320   2              while ( rs_f_TI == 0)  ;       //等待最后一个字节发送完毕
 321   2              ReceivePoint = 0;
 322   2                      COMEN = 1;
 323   2          }
 324   1      }
 325          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    380    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     15    ----
   IDATA SIZE       =   ----    ----
   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 + -