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

📄 uart.lst

📁 KEIL C上的门禁控制器源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 571   6                                                      checksum=0;
 572   6                                                      while(SPIbuf[i]!=ETX)
 573   6                                                      {
 574   7                                                              checksum+=SPIbuf[i];
 575   7                                                              i++;
 576   7                                                      }
 577   6                                                      checksum+=SPIbuf[i];    // ETX
 578   6              
 579   6                                                      checksum=~checksum+1;
 580   6                              
 581   6                                                      temp=(checksum&0xF0)>>4;
 582   6                                                      i++;
 583   6                                                      SPIbuf[i]=Hex_ascii(temp);
 584   6                              
 585   6                                                      temp=checksum&0x0F;
 586   6                                                      i++;
 587   6                                                      SPIbuf[i]=Hex_ascii(temp);
 588   6                                                      i++;
 589   6      
 590   6                                                      COMENABLE;                      // 允许串口中断
 591   6                                                      Dir=1;                          // 485发送
 592   6                                                      time_out=120;           // 1.2s转发完所有数据
 593   6                                                      trans_ctr=0;            // 发送指针
 594   6                                                      trans_size=i+1;         // 发送数据大小
 595   6                                                      SBUF=SPIbuf[0];         // 发送数据
 596   6                                                      comm_ok=TRUE;           // 串口通信正常
 597   6                                                      while(trans_size)
 598   6                                                      {
 599   7                                                              if(time_out==0)
 600   7                                                              {
 601   8                                                                      comm_ok=FALSE;  // 串口通信失败
 602   8                                                                      break;
 603   8                                                              }
 604   7                                                      }                                       // 直到数据传输完毕
 605   6                                                      Dir=0;                          // 关闭485发送
 606   6                      
 607   6                                                      if(comm_ok)                     // 通信正常
 608   6                                                      {
 609   7                                                              if(SPIbuf[7]=='D'&&SPIbuf[8]=='U'&&SPIbuf[9]=='T'&&SPIbuf[10]=='S')
 610   7                                                              {
 611   8                                                                      pulse=1;
 612   8                                                                      if(wieformat==1)                // 自定义门禁方式
 613   8                                                                              white_bill_reg();       // 注册白名单
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 11  

 614   8                                                              }
 615   7      
 616   7                                                              if(SPIbuf[7]=='U'&&SPIbuf[8]=='U'&&SPIbuf[9]=='T'&&SPIbuf[10]=='S')
 617   7                                                                      pulse=1;
 618   7                                                      }
 619   6      
 620   6                                                      ClearRcvBuf();          // 清接收缓冲区
 621   6                                              }
 622   5                                              else
 623   5                                                      sendmessage(NAK);       // SPI发送超时失败
 624   5                                      }
 625   4                              }
 626   3                              else            // 小数据量命令模式
 627   3                              {
 628   4                                      if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='M')&&(recv_buf[COMMAND_PTR+2]=='T'))
 629   4                                      {
 630   5                                              for(i=0;i<15;i++)
 631   5                                              {
 632   6                                                      cur_time[i]=recv_buf[COMMAND_PTR+3+i];
 633   6                                                      set_time();                     // 设置系统时间
 634   6                                              }
 635   5      
 636   5                                              sendmessage(ACK);               // 发送ACK,告诉主机正常执行
 637   5                                      }
 638   4                                      else if((recv_buf[COMMAND_PTR]=='G')&&(recv_buf[COMMAND_PTR+1]=='R')&&(recv_buf[COMMAND_PTR+2]=='R'))
 639   4                                      {
 640   5                                              sendmessage(RTL);               // 发送实时信息
 641   5                                      }
 642   4                                      else if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='C')
 643   4                                                      &&(recv_buf[COMMAND_PTR+2]=='S')&&(recv_buf[COMMAND_PTR+3]=='S'))
 644   4                                      {
 645   5                                              sendmessage(ACK);               // 发送ACK,告诉主机正常执行
 646   5      
 647   5                                              if(comm_ok)                             // 通信正常
 648   5                                                      maxtrans=FALSE;         // 切换为小数据量传输
 649   5                                      }
 650   4                                      else if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='C')
 651   4                                                      &&(recv_buf[COMMAND_PTR+2]=='S')&&(recv_buf[COMMAND_PTR+3]=='L'))
 652   4                                      {
 653   5                                              sendmessage(ACK);               // 发送ACK,告诉主机正常执行
 654   5      
 655   5                                              if(comm_ok)                             // 通信正常
 656   5                                                      maxtrans=TRUE;          // 切换为大数据量传输
 657   5                                      }
 658   4                                      else
 659   4                                              sendmessage(NAK);               // 命令不支持
 660   4                              }
 661   3                      }
 662   2              }
 663   1      }
 664          
 665          ///////////////////////////////////////////////////////////////////////////////
 666          // 设置波特率
 667          ///////////////////////////////////////////////////////////////////////////////
 668          void Baud_Init()
 669          {
 670   1              switch(baudrate)
 671   1              {
 672   2              case 0:
 673   2                      TR2=0;                  // 关闭T2定时器
 674   2                  TH2 = 0xff ;                  
 675   2                  TL2 = 0x70;         // 波特率设为4800bps
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 12  

 676   2                  RCAP2H=0xff;
 677   2                  RCAP2L=0x70;
 678   2                  TR2 = 1;            // 允许T2中断
 679   2                      break;
 680   2              case 1:
 681   2                      TR2=0;                  // 关闭T2定时器
 682   2                  TH2 = 0xff ;                  
 683   2                  TL2 = 0xb8;         // 波特率设为9600bps
 684   2                  RCAP2H=0xff;
 685   2                  RCAP2L=0xb8;
 686   2                  TR2 = 1;            // 允许T2中断
 687   2                      break;
 688   2              case 2:
 689   2                      TR2=0;                  // 关闭T2定时器
 690   2                  TH2 = 0xff ;                  
 691   2                  TL2 = 0xdc;         // 波特率设为19200bps
 692   2                  RCAP2H=0xff;
 693   2                  RCAP2L=0xdc;
 694   2                  TR2 = 1;            // 允许T2中断
 695   2                      break;
 696   2              case 3:
 697   2                      TR2=0;                  // 关闭T2定时器
 698   2                  TH2 = 0xff ;                  
 699   2                  TL2 = 0xee;         // 波特率设为38400bps
 700   2                  RCAP2H=0xff;
 701   2                  RCAP2L=0xee;
 702   2                  TR2 = 1;            // 允许T2中断
 703   2                      break;
 704   2              case 4:
 705   2                      TR2=0;                  // 关闭T2定时器
 706   2                  TH2 = 0xff ;                  
 707   2                  TL2 = 0xf4;         // 波特率设为57600bps
 708   2                  RCAP2H=0xff;
 709   2                  RCAP2L=0xf4;
 710   2                  TR2 = 1;            // 允许T2中断
 711   2                      break;
 712   2              case 5:
 713   2                      TR2=0;                  // 关闭T2定时器
 714   2                  TH2 = 0xff ;                  
 715   2                  TL2 = 0xfa;         // 波特率设为115200bps
 716   2                  RCAP2H=0xff;
 717   2                  RCAP2L=0xfa;
 718   2                  TR2 = 1;            // 允许T2中断
 719   2                      break;
 720   2              default:
 721   2                      break;
 722   2              }
 723   1      }
 724          
 725          ///////////////////////////////////////////////////////////////////////////////
 726          // 清接收缓冲区
 727          ///////////////////////////////////////////////////////////////////////////////
 728          void ClearRcvBuf()
 729          {
 730   1              idata uint i;
 731   1      
 732   1              COMDISABLE;                             // 不允许串口再接收数据
 733   1              if(maxtrans)
 734   1              {
 735   2                      for(i=0; i<BUFSIZE; i++)
 736   2                              SPIbuf[i]=0x00;
 737   2              }
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 13  

 738   1              else
 739   1              {
 740   2                      for(i=0; i<RCVBUFSIZE; i++)
 741   2                              recv_buf[i]=0x00;
 742   2              }
 743   1      
 744   1              recv_ctr=0;
 745   1              COMENABLE;                              // 允许串口接收数据
 746   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2296    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----      18
   BIT SIZE         =   ----       5
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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