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

📄 pca_uart_device.lst

📁 STC单片机基本程序和模块的介绍和源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   PCA_UART_DEVICE                                                       02/25/2009 10:34:59 PAGE 5   

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

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

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

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


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