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

📄 io_soft_uart_use_timer.lst

📁 监控行业车辆检测器源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 235   1          TCON_ENABLE_TIMER = 1;             //启动定时器
 236   1      }
 237          extern unsigned char Receivesize;                          // 模拟串口接收多少字节
 238          void soft_rs232_interrupt( void )
 239          {
 240   1          /************************ 接收 ****************************/
 241   1          if (rs_f_RI_enable == 1)
C51 COMPILER V8.05a   IO_SOFT_UART_USE_TIMER                                               10/20/2008 11:07:22 PAGE 5   

 242   1          {
 243   2              if (rs_shift_count == 0)        //移位计数器==0, 表示检测到起始位的起点   
 244   2              {
 245   3                  if ( rs_RXD == 1 )
 246   3                  {
 247   4                      soft_receive_enable (); //起始位错, 从新开始   
 248   4                  }
 249   3                  else
 250   3                  {
 251   4                      //下次中断在数据位或停止位中的某时刻发生    
 252   4                      rs_timerL += rs_FULL_BIT_L + 0x08; 
 253   4                      rs_timerH = rs_FULL_BIT_H;
 254   4                      rs_shift_count++;              
 255   4                      rs_BUF = 0;             //清移位缓冲变量   
 256   4                  }
 257   3              }
 258   2              else
 259   2              {
 260   3                  rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生    
 261   3                  rs_timerH = rs_FULL_BIT_H;
 262   3                                             
 263   3                  rs_shift_count++;           //2--9:数据位 10:停止位 
 264   3                                             
 265   3                  if ( rs_shift_count == 9)
 266   3                  {
 267   4                      rs_BUF = rs_BUF >> 1;   //接收第8位   
 268   4                      rs_BUF_bit7 = rs_RXD;
 269   4                      if( ReceivePoint < rs_RECEIVE_MAX)
 270   4                      {                       //保存收到的字节    
 271   5                          rs232buffer[ReceivePoint] = rs_BUF;
 272   5                                              if( (   rs232buffer[ReceivePoint] == 0x0a)&&(   rs232buffer[ReceivePoint-1] == 0x0d) )
 273   5                                                 {
 274   6                                                         RED_LED = ~RED_LED;
 275   6                                                              
 276   6                                                         phone_flag = 1;              // 接收到一帧电话号码标志
 277   6      
 278   6                                                         Receivesize =  ReceivePoint;
 279   6                                                         ReceivePoint =0;
 280   6                                                 }
 281   5                                              else
 282   5                                                 {
 283   6                                                 ReceivePoint++;
 284   6                                                 }
 285   5                      }
 286   4                      else
 287   4                      {
 288   5                          rs_f_RI_enable = 0; //缓冲区满, 禁止接收   
 289   5                      }
 290   4                  }
 291   3                  else
 292   3                  {
 293   4                      if (rs_shift_count < 9 ) //收到的是数据位 1 -- 7  
 294   4                      {
 295   5                          rs_BUF = rs_BUF >> 1;
 296   5                          rs_BUF_bit7 = rs_RXD;
 297   5                      }
 298   4                      else
 299   4                      {   //收到停止位,继续检测 PC 机发出的下一个起始位    
 300   5                          soft_receive_init(); 
 301   5                      }
 302   4                  }
 303   3              }
C51 COMPILER V8.05a   IO_SOFT_UART_USE_TIMER                                               10/20/2008 11:07:22 PAGE 6   

 304   2              TCON_TFx = 0;                  //清定时器中断标志   
 305   2          }
 306   1          else
 307   1          {
 308   2              /************************ 发送 ****************************/  
 309   2              if (rs_f_TI_enable == 1)
 310   2              {
 311   3                  rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻   
 312   3                  rs_timerH = rs_FULL_BIT_H;
 313   3      
 314   3                  rs_shift_count--;          //0:停止位末尾时刻到  
 315   3                                             //1:发送停止位  
 316   3                                             //2--9:发送数据位  
 317   3                  if (rs_shift_count > 9)    //错误状态  
 318   3                  {
 319   4                      rs_shift_count = 9;
 320   4                      rs_BUF = 0xFF;
 321   4                  }
 322   3      
 323   3                  if (rs_shift_count > 1)    //2--9:发送数据位  
 324   3                  {
 325   4                      ACC = rs_BUF;
 326   4                      ACC = ACC >> 1;
 327   4                      rs_TXD = CY;
 328   4                      rs_BUF = ACC;
 329   4                  }
 330   3                  else
 331   3                  {
 332   4                      if (rs_shift_count == 0) //0:停止位末尾时刻到  
 333   4                      {
 334   5                          rs_TXD = 1;
 335   5                          rs_f_TI = 1;       //已发送完毕一个字节  
 336   5                      }
 337   4                      else
 338   4                      {
 339   5                          rs_TXD = 1;        //1:发送停止位  
 340   5                      }
 341   4                  }
 342   3              }
 343   2          }
 344   1      }
 345          
 346          //由收转到发时,要先调用 soft_send_enable ()  
 347          void rs_send_byte(INT8U SendByte)      //发送一个字节  
 348          {
 349   1          while ( rs_f_TI == 0);             //等待发送完毕前一个字节  
 350   1          rs_TXD = 1;
 351   1          rs_timerL = rs_START_BIT_L;        //下次中断在起始位的末尾时刻   
 352   1          rs_timerH = rs_START_BIT_H;
 353   1          rs_BUF = SendByte;
 354   1          rs_shift_count = 10;
 355   1          rs_TXD = 0;                        //发送起始位  
 356   1          rs_f_TI = 0;                       //清已发送完毕一个字节的标志   
 357   1      }
 358          
 359          void initiate_MCU (void)               //系统初始化  
 360          {
 361   1          soft_rs232_init();                 //串口初始化  
 362   1          EA = 1;                            //开中断  
 363   1      }
 364          
 365          
C51 COMPILER V8.05a   IO_SOFT_UART_USE_TIMER                                               10/20/2008 11:07:22 PAGE 7   

 366          extern  void delay_n_ms( unsigned int n_milisecond) ; /* mS delay */
 367          
 368          void  phone_init(void);
 369          
 370          void  phone_init(void)
 371          {
 372   1              initiate_MCU();                    //系统初始化  
 373   1        /*
 374   1              P1 = 0xff;                // 1.0,1.3,1.6,1.7设置为输入 
 375   1      
 376   1              P1M0 = 0x00;      // 1.1,1.2,1.4,1.5设置为输出
 377   1              P1M1 = 0x00;
 378   1        */
 379   1         
 380   1              delay_n_ms(200);
 381   1      
 382   1              PHONE_RESET = 0;
 383   1              delay_n_ms(200);
 384   1              PHONE_RESET = 1;
 385   1              delay_n_ms(200);
 386   1              PHONE_RESET = 0;
 387   1      
 388   1              WDT_CONTR = 0x3d;      //使能看门狗
 389   1      
 390   1              delay_n_ms(200);
 391   1        
 392   1              soft_receive_enable ();        //启动并开始接收,禁止发送  
 393   1      
 394   1         // 电话模块复位成功
 395   1         do{
 396   2      
 397   2      
 398   2              PHONE_RESET = 0;
 399   2              delay_n_ms(200);
 400   2              PHONE_RESET = 1;
 401   2              delay_n_ms(300);
 402   2              PHONE_RESET = 0;
 403   2              WDT_CONTR = 0x3d;      //使能看门狗
 404   2              delay_n_ms(700);         // 延时
 405   2      
 406   2              WDT_CONTR = 0x3d;      //使能看门狗
 407   2      
 408   2          }while(     !phone_flag);
 409   1              /*
 410   1              UartPrintOut(rs232buffer,ReceivePoint);
 411   1              ES = 0; TI = 1;enable_485_tx;
 412   1              printf("!\n");
 413   1              TI=0;ES = 1;enable_485_rx;
 414   1              */
 415   1          phone_flag =0;
 416   1              ReceivePoint =0;
 417   1      }
 418          /*
 419          
 420          void main (void)
 421          {
 422          //首先发送 128 个字节 00H--7FH, 然后等待 PC 机发送的数据。当收到 128
 423          //个字节后,立刻将收到的 128 个数据回发送给 PC 机,然后继续等待下一个
 424          //数据块。
 425            
 426              INT8U i;
 427            
C51 COMPILER V8.05a   IO_SOFT_UART_USE_TIMER                                               10/20/2008 11:07:22 PAGE 8   

 428            
 429              soft_send_enable ();               //允许发送,禁止接收  
 430              for (i=0; i < rs_RECEIVE_MAX; i++ )
 431              {
 432                  rs_send_byte(i);
 433              }
 434              while ( rs_f_TI == 0)  ;           // 等待最后一个字节发送完毕   
 435           
 436          
 437                  phone_init();
 438          
 439              while(1)
 440              {
 441                
 442                  /*
 443                   
 444                  while (ReceivePoint < rs_RECEIVE_MAX); // 等待接收缓冲区满  
 445                   
 446                  soft_send_enable ();           //允许发送,禁止接收  
 447                   
 448                  for (i=0; i < rs_RECEIVE_MAX; i++ )
 449                  {
 450                      rs_send_byte(rs232buffer[i]);
 451                  }
 452                    
 453                  while ( rs_f_TI == 0)  ;       //等待最后一个字节发送完毕
 454                   
 455                  ReceivePoint = 0;
 456                    
 457              }
 458          }
 459          */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    404    ----
   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 + -