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

📄 soft_rs232.lst

📁 51系列单片机的软件串口模拟程序代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 223          {
 224   1          TCON_ENABLE_TIMER = 0;             //停止定时器  
 225   1          rs_f_TI_enable = 1;                //允许发送  
 226   1          rs_f_RI_enable = 0;                //禁止接收  
 227   1      
 228   1          rs_shift_count = 0;                //清移位计数器  
 229   1          rs_f_TI   = 1;                     //发送一个字符完毕标志  
 230   1          TCON_ENABLE_TIMER = 1;             //启动定时器
 231   1      }
 232          
 233          void soft_rs232_interrupt( void )
 234          {
 235   1          /************************ 接收 ****************************/
 236   1          if (rs_f_RI_enable == 1)
 237   1          {
 238   2              if (rs_shift_count == 0)        //移位计数器==0, 表示检测到起始位的起点   
 239   2              {
 240   3                  if ( rs_RXD == 1 )
 241   3                  {
C51 COMPILER V7.50   SOFT_RS232                                                            08/22/2006 15:15:24 PAGE 5   

 242   4                      soft_receive_enable (); //起始位错, 从新开始   
 243   4                  }
 244   3                  else
 245   3                  {
 246   4                      //下次中断在数据位或停止位中的某时刻发生    
 247   4                      rs_timerL += rs_FULL_BIT_L + 0x10; 
 248   4                      rs_timerH = rs_FULL_BIT_H;
 249   4                      rs_shift_count++;              
 250   4                      rs_BUF = 0;             //清移位缓冲变量   
 251   4                  }
 252   3              }
 253   2              else
 254   2              {
 255   3                  rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生    
 256   3                  rs_timerH = rs_FULL_BIT_H;
 257   3                                             
 258   3                  rs_shift_count++;           //2--9:数据位 10:停止位 
 259   3                                             
 260   3                  if ( rs_shift_count == 9)
 261   3                  {
 262   4                      rs_BUF = rs_BUF >> 1;   //接收第8位   
 263   4                      rs_BUF_bit7 = rs_RXD;
 264   4      //                if( ReceivePoint < rs_RECEIVE_MAX)
 265   4      //                {                       //保存收到的字节    
 266   4                          rs232buffer[ReceivePoint++] = rs_BUF;
 267   4      //                }
 268   4      //                else
 269   4      //                {
 270   4      //                    rs_f_RI_enable = 0; //缓冲区满, 禁止接收   
 271   4      //                }
 272   4                  }
 273   3                  else
 274   3                  {
 275   4                      if (rs_shift_count < 9 ) //收到的是数据位 1 -- 7  
 276   4                      {
 277   5                          rs_BUF = rs_BUF >> 1;
 278   5                          rs_BUF_bit7 = rs_RXD;
 279   5                      }
 280   4                      else
 281   4                      {   //收到停止位,继续检测 PC 机发出的下一个起始位    
 282   5                          soft_receive_init(); 
 283   5                      }
 284   4                  }
 285   3              }
 286   2              TCON_TFx = 0;                  //清定时器中断标志   
 287   2          }
 288   1          else
 289   1          {
 290   2              /************************ 发送 ****************************/  
 291   2              if (rs_f_TI_enable == 1)
 292   2              {
 293   3                  rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻   
 294   3                  rs_timerH = rs_FULL_BIT_H;
 295   3      
 296   3                  rs_shift_count--;          //0:停止位末尾时刻到  
 297   3                                             //1:发送停止位  
 298   3                                             //2--9:发送数据位  
 299   3                  if (rs_shift_count > 9)    //错误状态  
 300   3                  {
 301   4                      rs_shift_count = 9;
 302   4                      rs_BUF = 0xFF;
 303   4                  }
C51 COMPILER V7.50   SOFT_RS232                                                            08/22/2006 15:15:24 PAGE 6   

 304   3      
 305   3                  if (rs_shift_count > 1)    //2--9:发送数据位  
 306   3                  {
 307   4                      ACC = rs_BUF;
 308   4                      ACC = ACC >> 1;
 309   4                      rs_TXD = CY;
 310   4                      rs_BUF = ACC;
 311   4                  }
 312   3                  else
 313   3                  {
 314   4                      if (rs_shift_count == 0) //0:停止位末尾时刻到  
 315   4                      {
 316   5                          rs_TXD = 1;
 317   5                          rs_f_TI = 1;       //已发送完毕一个字节  
 318   5                      }
 319   4                      else
 320   4                      {
 321   5                          rs_TXD = 1;        //1:发送停止位  
 322   5                      }
 323   4                  }
 324   3              }
 325   2          }
 326   1      }
 327          
 328          //由收转到发时,要先调用 soft_send_enable ()  
 329          void rs_send_byte(INT8U SendByte)      //发送一个字节  
 330          {
 331   1          while ( rs_f_TI == 0);             //等待发送完毕前一个字节  
 332   1          rs_TXD = 1;
 333   1          rs_timerL = rs_START_BIT_L;        //下次中断在起始位的末尾时刻   
 334   1          rs_timerH = rs_START_BIT_H;
 335   1          rs_BUF = SendByte;
 336   1          rs_shift_count = 10;
 337   1          rs_TXD = 0;                        //发送起始位  
 338   1          rs_f_TI = 0;                       //清已发送完毕一个字节的标志   
 339   1      }
 340          
 341          void initiate_MCU (void)               //系统初始化  
 342          {
 343   1          soft_rs232_init();                 //串口初始化  
 344   1          EA = 1;                            //开中断  
 345   1      }
 346          
 347          void delay (INT16U useconds)
 348          {
 349   1              for(;useconds>0;useconds--);
 350   1      }
 351          
 352          void send(uint8_t *temp,char j)
 353          {
 354   1              char i=0;
 355   1              for (i=0;i<=j-1;i++)          //按发送数据的长度来发送数据
 356   1              {
 357   2                      ACC=*(temp+i);
 358   2                      SBUF=ACC;                 //发送数据
 359   2                      while(TI==0);            //发送数据完毕时,TI会自动置高
 360   2                      TI=0;                  //发送数据完毕,将TI清零,准备下一次发送
 361   2              }
 362   1      }
 363          
 364          
 365          GsmSend(char * CmdTmp)
C51 COMPILER V7.50   SOFT_RS232                                                            08/22/2006 15:15:24 PAGE 7   

 366          {
 367   1              char i;
 368   1              for(i=0;i<strlen(CmdTmp);i++)
 369   1                      send(&CmdTmp[i],1);
 370   1      }
 371          
 372          void initial()
 373          {
 374   1              PCON= PCON & 0X7F;
 375   1              TR1=0;
 376   1              TMOD=TMOD | 0x20;                    //定时器1为自动装入方式 模式2、自动再装入8位计数器
 377   1              ET1 = 0;
 378   1              SCON=0x40;                  //串行口工作方式1:10位URAT,数据传输率可变
 379   1              TH1=0xFD;       
 380   1              TL1=0xFD;         
 381   1              //设置数据格式
 382   1              //低位在前
 383   1              SM0=0;
 384   1              SM1=1;
 385   1              RI=0;
 386   1              TI=0;
 387   1              REN=1;
 388   1              ES=1;
 389   1              TR1=1;
 390   1      }
 391          
 392          
 393          
 394          void main (void)
 395          {
 396   1      //首先发送 128 个字节 00H--7FH, 然后等待 PC 机发送的数据。当收到 128
 397   1      //个字节后,立刻将收到的 128 个数据回发送给 PC 机,然后继续等待下一个
 398   1      //数据块。
 399   1        
 400   1          word i;
 401   1              initial();
 402   1      //      initiate_MCU();                    //系统初始化:定时器模式1、  
 403   1      
 404   1          while(1)
 405   1          {/*
 406   2                      soft_send_enable ();               //允许发送,禁止接收  
 407   2                  rs_send_byte('P');
 408   2                  while ( rs_f_TI == 0)  ;           // 等待最后一个字节发送完毕   
 409   2      
 410   2              soft_receive_enable ();        //启动并开始接收,禁止发送 
 411   2                  for(i=0;i<4000;i++)
 412   2                      {
 413   2                      if (rs_BUF==0x0D) break ; 
 414   2                              delay(10);
 415   2                      }
 416   2                      rs_f_RI_enable = 0;
 417   2                      ReceivePoint = 0;
 418   2                      if(i>=4000) 
 419   2                      {
 420   2                              rs232buffer[0]='\0';
 421   2                              strcpy(rs232buffer,"ERROR!");
 422   2                      }
 423   2      */
 424   2                      rs232buffer[0]='\0';
 425   2                      strcat(rs232buffer,"ERROR!");
 426   2                      rs232buffer[sizeof(rs232buffer)]='\0';
 427   2                      EA=0;
C51 COMPILER V7.50   SOFT_RS232                                                            08/22/2006 15:15:24 PAGE 8   

 428   2                      GsmSend(rs232buffer);
 429   2                      EA=1;
 430   2                      delay(60000);
 431   2      
 432   2          }
 433   1      }
*** WARNING C280 IN LINE 400 OF SOFT_RS232.C: 'i': unreferenced local variable
 434          
 435          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    505    ----
   CONSTANT SIZE    =      7    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5       9
   IDATA SIZE       =     32    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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