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

📄 serial1.lst

📁 c8051f020实现4个 产UART 口
💻 LST
📖 第 1 页 / 共 3 页
字号:
 205   3                                                         F76_RX_Sta=2;
 206   3                                                         F76_RX_Buff[0]=Uart1RBuf;
 207   3                                                          F76_RX_cnt=1;
 208   3                                                }        
 209   3      
 210   3                                        break;
 211   3                                           case 2:
 212   3                                                       F76_RX_Buff[F76_RX_cnt++]=Uart1RBuf;
 213   3                                                       if( F76_RX_cnt>=F76_BUFF_MAX)  {
 214   3                                                               F76_RX_Sta=0;
 215   3      
 216   3                                                       }
 217   3                                                       if(Uart1RBuf==0xab)  {    //  over byte  flag
 218   3                                                               Xin_F76_RX_B=1;
 219   3                                                                       F76_RX_Sta=0;
 220   3      
 221   3                                                       }
 222   3      
 223   3                                        break;
 224   3                                      
 225   3                                        default:
 226   3                                                 F76_RX_Sta=0;
 227   3      
 228   3                                        break;
 229   3                                      
 230   3                              }
 231   3                              */
 232   3                         
 233   3                                               
 234   3                      }
 235   2                      else {                                  //子串口0接收到一个字节
 236   3                                                //子串口0 来自DiZh  的数据
 237   3                                  // if(Xin_DiZh_RX_B==0)   {            //未处理不能接收防止覆盖             
 238   3                                                         Uart0RBuf=SBUF1;             //缓存子串口0收到的数据,以便接收后续数据
 239   3                                                      DiZh_Rx_Buff[DiZh_RX_cnt++]=Uart0RBuf;
 240   3                                                         DiZh_Es_jie_cnt=16;                     //80ms 时限到认为接收结束in: 
C51 COMPILER V7.50   SERIAL1                                                               06/10/2007 23:11:20 PAGE 5   

 241   3                                                          if(DiZh_RX_cnt>=DiZh_BUFF_MAX)
 242   3                                                                        DiZh_RX_cnt=0;
 243   3                                      //}     
 244   3                      }
 245   2              }
 246   1      
 247   1      
 248   1      
 249   1      
 250   1             //以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
 251   1              //以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
 252   1              //以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
 253   1               //以下是发送数据==以下是发送数据===以下是发送数据==以下是发送数据
 254   1              if (SCON1&0x02)   //-->_testbit_(TI_1))
 255   1              {
 256   2                      //TI=0;                                                 //已经产生发送中断,准备解析下一个需要发送的数据
 257   2                      switch(UartPointer){                    //判断即将向哪个子串口发送数据?
 258   3                              case 0:{                                        //准备向子串口0发送数据
 259   4                                                     //    子串口0      fa   DiZh  的数据
 260   4                                          if( DiZh_TX_Len>DiZh_BUFF_MAX)
 261   4                                                               DiZh_TX_Len= DiZh_BUFF_MAX;
 262   4                                              UartPointer++;                  //下一次发送中断准备向子串口1发送数据
 263   4                                              if(DiZh_TX_Len){                        //串口0发送缓存区是否有数据需要发送?
 264   5                                                              AdrOut0_0;                      //有数据需要发送,则选通子串口0的地址
 265   5                                                              AdrOut1_0;
 266   5                                                              _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 267   5                                                              _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 268   5                                                              DiZh_TX_Len--;
 269   5                                                              DiZh_TX_is_over_B=0; 
 270   5                                                              if(DiZh_TX_Len==0)  {
 271   6                                                                  DiZh_TX_is_over_B=1; 
 272   6                                                              }
 273   5                                                              SBUF1=DiZh_Tx_Buff[DiZh_TX_cnt++];//将串口0发送缓存中的一个字节
 274   5                                                              break;                                          //由子串口0发送到下位机
 275   5                                              }
 276   4                                              else  
 277   4                                                      goto T_NopInstruction;  //若子串口0没有数据发送则准备发送空指令
 278   4                              }
 279   3      
 280   3                              case 1:{                                        //准备向子串口1发送数据
 281   4                                            //子串口1 来自报警板的数据
 282   4                                               if( F76_TX_Len>F76_BUFF_MAX)
 283   4                                                               F76_TX_Len= F76_BUFF_MAX;
 284   4                                                               
 285   4                                              UartPointer++;                  //下一次发送中断准备向子串口2发送数据
 286   4                                              if(F76_TX_Len){                 //串口1发送缓存区是否有数据需要发送?
 287   5                                                              AdrOut0_1;                      //有数据需要发送,则选通子串口2的地址
 288   5                                                              AdrOut1_0;
 289   5                                                              _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 290   5                                                              _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 291   5                                                              F76_TX_Len--;
 292   5                                                              F76_TX_is_over_B=0; 
 293   5                                                              if(F76_TX_Len==0)  {
 294   6                                                                        F76_TX_is_over_B=1; 
 295   6                                                                        //Dis_FA_485shou;  //为推完,要上拉电阻 
 296   6                                                              }
 297   5                                                              SBUF1=F76_TX_Buff[F76_TX_cnt++];//将串口1发送缓存中的一个字节
 298   5                                                              break;                                          //由子串口1发送到下位机
 299   5                                              }
 300   4                                              else 
 301   4                                                        goto T_NopInstruction;        //若子串口1没有数据发送则准备发送空指令
 302   4                      
C51 COMPILER V7.50   SERIAL1                                                               06/10/2007 23:11:20 PAGE 6   

 303   4                              }
 304   3                              case 2:{                        //准备向子串口2发送数据
 305   4      
 306   4                                          //子串口2 发给键盘的数据
 307   4                                           if( KEY_TX_Len>KEY_BUFF_MAX)
 308   4                                                               KEY_TX_Len= KEY_BUFF_MAX;
 309   4                                              UartPointer++;                  //下一次发送中断准备向子串口2发送数据
 310   4                                              if(KEY_TX_Len){                 //串口2发送缓存区是否有数据需要发送?
 311   5                                                              AdrOut0_0;                      //有数据需要发送,则选通子串口0的地址
 312   5                                                              AdrOut1_1;
 313   5                                                              _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 314   5                                                              _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 315   5                                                              KEY_TX_Len--;
 316   5                                                              KEY_TX_is_over_B=0; 
 317   5                                                              if(KEY_TX_Len==0)  {
 318   6                                                                         KEY_TX_is_over_B=1; 
 319   6                                                                          KEY_TX_is_over_Start_cnt_B=1;    // 帧间隔计时位
 320   6                                                                         KEY_TX_is_over_Start_cnt=0;     // 帧间隔计时计数器
 321   6                                                                      
 322   6                                                              }
 323   5                                                              SBUF1=KEY_TX_Buff[KEY_TX_cnt++];//将串口2发送缓存中的一个字节
 324   5                                                              break;                                          //由子串口2发送到下位机
 325   5                                              }
 326   4                                              else  
 327   4                                                      goto T_NopInstruction;  //若子串口2没有数据发送则准备发送空指令
 328   4                        
 329   4      
 330   4                             }                                                                //而只能够发送一条空指令用于时序配合
 331   3      
 332   3                              default:{
 333   4                                            UartPointer=0;                    //下一次发送中断准备向串口0发送数据
 334   4       T_NopInstruction:
 335   4                                              AdrOut0_1;                              //选通目串口准备发送空指令或者其他指令
 336   4                                              AdrOut1_1;
 337   4                                              if(bInstructFlag){              //判断是否需要发送其他指令?
 338   5                                                      bInstructFlag=0;        //清除指令发送标志
 339   5                                                      SBUF1=InstructBuf;      //将需要发送的指令发送到串口扩展IC
 340   5                                                      break;
 341   5                                              }
 342   4                                              //else if(Uart0TNum|Uart1TNum|Uart2TNum){//判断所有子串口的数据是否
 343   4                                              else if(F76_TX_Len|KEY_TX_Len|DiZh_TX_Len){//判断所有子串口的数据是否
 344   5                                                      SBUF1=0;                                //都已经全部发送完毕?若没有完毕则发送空指令
 345   5                                                      break;
 346   5                                              }
 347   4                                              else {bUartBusy=0;break;}//若所有子串口数据都已经发送完毕,则立即
 348   4                              }       //清除"串口忙"标志(主程序将根据该标志来决定是否执行"TI=1"这条指令)
 349   3                      }
 350   2              }
 351   1             
 352   1              
 353   1              SCON1&=0xfc;   //CKR  TI, RI
 354   1      
 355   1              
 356   1       }
 357          
 358          
 359          
 360          /*****************************************************************
 361          Function: OpenComm
 362          Description: Sets the serial port up for debug use and resets
 363          the ring buffer pointers to 0.
 364          Parameters: None.
C51 COMPILER V7.50   SERIAL1                                                               06/10/2007 23:11:20 PAGE 7   

 365          Returns: Nothing.
 366          *****************************************************************/
 367          //                0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
 368          
 369          void Open_URRA_1(void) 
 370          {
 371   1      //      SCON1=0xf0;             /*设置串行口1工作于方式3,主从式*/
 372   1                                      /*SM0_1  SM1_1 SM2_1 REN_1  TB8_1 RB8_1 TI_1 RI_1*/
 373   1                                      /* 1       1     1     1      0     0     0    0 */
 374   1                                      /*when SM2_1=1 receice addr    */       
 375   1              TMOD |= 0x20;   /* timer 1 mode 2: 8-Bit reload          */
 376   1              PCON|=0x10;//-->SMOD_1=1;       /*bps double*/                                  
 377   1              CKCON |= 0x10;          // Timer 1 derived from SYSCLK
 378   1              TH1 = -(SYSCLK/BAUDRATE1/16);  //11.0592  ->4800-115200
 379   1              TR1 = 1;                        // Start Timer 1
 380   1              SCON1 = 0x50;                   // Configure UART1 for mode 1, receiver enabled.
 381   1              SCON1|=0x10;//-->   REN1=1; 
 382   1              EIE2|=0x40; //-->       ES1=1;                  // allow the serial interrupt
 383   1              
 384   1      }
 385          
 386          
 387          /**********************************************************************
 388          **函数原型:   void     FA_DiZhen_Buff()  
 389          **入口参数:   
 390          **出口参数:   无
 391          **返 回 值:   无
 392          **说    明: 对地震仪发数据子程序
 393          *************************************************************************/
 394          void     FA_DiZhen_Buff()  {
 395   1      
 396   1                       DiZh_TX_Len= DiZh_Tx_Buff[3]+6;                
 397   1                       DiZh_TX_cnt=0;                
 398   1                       if(bUartBusy==0){      //判断发送中断是否处于激活状态,若没有激活则:
 399   2                                      SCON1|=2;  //TI=1;                      //激活MCU的串口发送程序                 
 400   2                                      bUartBusy=1;    //置发送程序已经激活的标志
 401   2                       }
 402   1      
 403   1      }
 404          
 405          
 406          
 407          
 408          //等待得到控制权
 409          //等待得到控制权
 410          //只有得到权限才能更新缓冲区数据
 411          /*
 412          void  Get_Fa_DiZh_buffer_Right( )
 413                {      xdata uchar ttt=0;
 414          
 415                          while(DiZh_TX_is_over_B==0)   {     //TX所完标志位,没发完再发时要等待                  
 416                                   os_wait2(K_TMO, 50);   //100ms
 417                                   if(ttt++>100)               //延时5秒  到也认为发送有空
 418                                           break;

⌨️ 快捷键说明

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