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

📄 pca_uart_host.lst

📁 STC单片机基本程序和模块的介绍和源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 245   1          {
 246   2              Tx_time = (uint16)CL + (uint16)( CH << 8 );//读出计数器的值
 247   2              Tx_time += TX_FULL_BIT;//加入一个位的时间
 248   2              CCAP1L = (uint8)Tx_time;//放入模块1中
 249   2              CCAP1H = (uint8)( Tx_time >> 8 ); 
 250   2              CCAPM1 = TIMER_INI;//设置为定时模式
 251   2              Tx_timer_en = 1;//设为1,即下次准备
 252   2          }
 253   1      } 
 254          
 255          
 256          /****************************************************************************** 
 257          函数:Rx_enable()
 258          功能:接收使能
 259          说明:设置接收状态及PCA模块0低电平触发以允许使能接收 
 260          ******************************************************************************/ 
 261          
 262          void    Rx_enable(void)
 263          {
 264   1          Rx_state = S_RX_START_EDGE;//开始使能接收
 265   1          CCAPM0 = NEG_CAP_INT;//设置为下降沿捕获
 266   1      } 
 267          
 268          /****************************************************************************** 
 269          函数:Rx_disable()
 270          功能:禁止接收
 271          说明:在程序开始时进行的状态初始化,禁止接收,之后通过接收使能函数开始 
 272          ******************************************************************************/ 
 273          
 274          void    Rx_disable(void)
 275          {
 276   1          Rx_state = S_RX_START_EDGE;//开始接收状态
 277   1          CCAPM0 = DISABLED_MODE;//禁止模式
 278   1      } 
 279          
 280          /****************************************************************************** 
 281          函数:Receive()
 282          功能:接收函数
 283          说明:接收函数对应的模块为PCA模块0 
 284          ******************************************************************************/ 
 285          void    Receive(void)
 286          {
 287   1          if(Rx_state != S_RX_START_EDGE)  //检测 起始下降沿 判断
 288   1          {
 289   2              if(Rx_state != S_RX_START_BIT)  //检测 起始位 判断
 290   2              {
 291   3                  if(Rx_state != S_RX_DATA_BIT )  //检测 数据位 判断
 292   3                  {
 293   4                      if( Rx_state != S_RX_STOP_BIT )  //检测 停止位 判断
 294   4                      {
 295   5                          Rx_state = S_RX_START_EDGE;//恢复初始状态
 296   5                          CCAPM0 = NEG_CAP_INT;//下降沿捕获
 297   5                      }
 298   4                      else
 299   4                      {
 300   5                          Rx_buffer = Rx_shift;//将接收到的数据存入变量中
 301   5                          CCAPM0 = NEG_CAP_INT;//恢复为下降沿捕获
 302   5                          Rx_state = S_RX_START_EDGE;//恢复初始状态
 303   5                          Rx_data_error = RXD_PIN;//可不用这句,但为了得到正确的状态加以描述
C51 COMPILER V7.06   PCA_UART_HOST                                                         02/25/2009 10:35:51 PAGE 6   

 304   5                          Rx_data_ready = 1;//开始准备
 305   5                                              Send_UART(Rx_buffer);//将得到的数据发送到串口中观察结果
 306   5                                              Display_LED();
 307   5                      }
 308   4                  }
 309   3                  else
 310   3                  {  //接收数据
 311   4                      Rx_shift >>= 1;//接收数据,向右移动
 312   4                      if( RXD_PIN == 1 )//接收数据
 313   4                      {
 314   5                          Rx_shift |= 0x80;
 315   5                      }
 316   4                      else
 317   4                      {
 318   5                          Rx_shift &= 0x7f;
 319   5                      }
 320   4                      Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
 321   4                      Rx_time += RX_FULL_BIT;
 322   4                      CCAP0L = (uint8)(Rx_time);      //低8位重新放入寄存器中
 323   4                      CCAP0H = (uint8)( Rx_time >> 8 );//高8位重新放入寄存器中
 324   4                      Rx_count--;                                     //状态递减,也就是发送位一位一位的进行
 325   4                      if( Rx_count == 0 )
 326   4                      {
 327   5                          Rx_state = S_RX_STOP_BIT;
 328   5                      }
 329   4                  }
 330   3              }
 331   2              else
 332   2              {  //接收起始位
 333   3                  if( RXD_PIN != 1 )
 334   3                  {
 335   4                      Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
 336   4                      Rx_time += RX_FULL_BIT;
 337   4                      CCAP0L = (uint8)(Rx_time);
 338   4                      CCAP0H = (uint8)( Rx_time >> 8 );
 339   4                      Rx_state = S_RX_DATA_BIT;
 340   4                      Rx_count = 0x08;
 341   4                  }
 342   3                  else
 343   3                  {
 344   4                      Rx_data_error = 1;//错误状态
 345   4                      Rx_state = S_RX_START_BIT;
 346   4                  }
 347   3              }
 348   2          }
 349   1          else
 350   1          {  //接收起始位初始化
 351   2              Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
 352   2              Rx_time += RX_HALF_BIT;//这里延时半个位,以便之后进行采样
 353   2              CCAP0L = (uint8)(Rx_time);
 354   2              CCAP0H = (uint8)( Rx_time >> 8 );
 355   2              CCAPM0 = TIMER_INI;
 356   2              Rx_state = S_RX_START_BIT;
 357   2          }
 358   1      } 
 359          
 360          
 361          /****************************************************************************** 
 362          函数:Transmit()
 363          功能:发送函数
 364          说明:发送函数对应的模块为PCA模块1 
 365          ******************************************************************************/ 
C51 COMPILER V7.06   PCA_UART_HOST                                                         02/25/2009 10:35:51 PAGE 7   

 366          
 367          void    Transmit(void)
 368          {
 369   1          if( Tx_state != S_TX_START_BIT )  //是否发送起始位 状态
 370   1          {
 371   2              if( Tx_state != S_TX_DATA_BIT)  //是否发送数据位 状态
 372   2              {
 373   3                  if( Tx_state != S_TX_STOP_BIT )  //是否发送停止位 状态
 374   3                  {
 375   4                      if( Tx_state != S_TX_STOP_END )  //是否发送结束 状态
 376   4                      {   //不是
 377   5                          Tx_state = S_TX_START_BIT;
 378   5                          Tx_data_ready = 1;
 379   5                          CCAPM1 = DISABLED_MODE;
 380   5                      }
 381   4                      else
 382   4                      {  //是
 383   5                          Tx_state = S_TX_START_BIT;
 384   5                          if( Tx_data_ready != 1 )  //是否成功发送停止位
 385   5                          {   //没有
 386   6                              Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
 387   6                              Tx_time += TX_FULL_BIT;
 388   6                              CCAP1L = (uint8)Tx_time;
 389   6                              CCAP1H = (uint8)( Tx_time >> 8 );
 390   6                          }
 391   5                          else
 392   5                          {  //有
 393   6                              CCAPM1 = DISABLED_MODE;
 394   6                              Tx_timer_en = 0;      //使能发送定时器标志位,0为禁止
 395   6                          }
 396   5                      }
 397   4                  }
 398   3                  else
 399   3                  {
 400   4                      TXD_PIN = 1;
 401   4                      Tx_state = S_TX_STOP_END;
 402   4                      Tx_data_ready = 1;
 403   4                      Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
 404   4                      Tx_time += TX_FULL_BIT;
 405   4                      CCAP1L = (uint8)Tx_time;
 406   4                      CCAP1H = (uint8)( Tx_time >> 8 );
 407   4                  }
 408   3              }
 409   2              else
 410   2              {  //发送数据位
 411   3                  if( ( Tx_shift & 0x01) == 0x01 )
 412   3                  {
 413   4                      TXD_PIN = 1;
 414   4                  }
 415   3                  else
 416   3                  {
 417   4                      TXD_PIN = 0;
 418   4                  }
 419   3                  Tx_shift >>= 1;
 420   3                  Tx_count--;
 421   3                  if( Tx_count == 0 )
 422   3                  {
 423   4                      Tx_state = S_TX_STOP_BIT;
 424   4                  }
 425   3                  Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
 426   3                  Tx_time += TX_FULL_BIT;
 427   3                  CCAP1L = (uint8)Tx_time;
C51 COMPILER V7.06   PCA_UART_HOST                                                         02/25/2009 10:35:51 PAGE 8   

 428   3                  CCAP1H = (uint8)( Tx_time >> 8 );
 429   3              }
 430   2          }
 431   1          else
 432   1          {  //发送起始位
 433   2              TXD_PIN = 0;
 434   2              Tx_state = S_TX_DATA_BIT;
 435   2              Tx_count = 0x08;
 436   2              Tx_shift = Tx_buffer;
 437   2              Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
 438   2              Tx_time += TX_FULL_BIT;
 439   2              CCAP1L = (uint8)Tx_time;
 440   2              CCAP1H = (uint8)( Tx_time >> 8 );
 441   2          }
 442   1      } 
 443          
 444          /****************************************************************************** 
 445          函数:delay()
 446          功能:延时函数
 447          说明:这里采用的是软件延时 ,延时一点时间
 448          ******************************************************************************/ 
 449          
 450          void   delay(uint16 idata In,uint16 idata Out)
 451          {
 452   1          uint16 idata i,j;
 453   1          for( i = 0;i < In;i++ )
 454   1          {
 455   2              for( j = 0;j < Out;j++ )
 456   2              {
 457   3                  ;
 458   3              }
 459   2          }
 460   1      } 
 461          
 462          /****************************************************************************** 
 463          函数:PCA_IRQ()
 464          功能:PCA串口中断服务程序
 465          说明:采用PCA作串口时,模块1作发送端,模块0作接收端 
 466          ******************************************************************************/
 467          
 468          void    PCA_IRQ(void) interrupt 7
 469          {
 470   1          if( CCF0 == 1 )//模块0作为接收端
 471   1          {
 472   2              CCF0 = 0;
 473   2              Receive();//接收函数
 474   2          }
 475   1          if( CCF1 == 1 )//模块1作发送端
 476   1          {
 477   2              CCF1 = 0;
 478   2              Transmit();//发送函数
 479   2          }
 480   1      }
 481          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    803    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       1
C51 COMPILER V7.06   PCA_UART_HOST                                                         02/25/2009 10:35:51 PAGE 9   

   IDATA SIZE       =     16       4
   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 + -