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

📄 uart0.lst

📁 F020集成以太网接口核心模块串口通信例程源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 271   1              ES0 = 1;        // 使能串口中断
 272   1              
 273   1      
 274   1      }
 275          
 276          //-------------------------------
 277          // 功能:    初始化单片机内部资源
 278          // 输入参数:无
 279          // 输出参数:无
 280          //-------------------------------
 281          void Init_Device(void)
 282          {
 283   1          Timer_Init();
 284   1      
 285   1          Port_IO_Init();
 286   1      
 287   1          Oscillator_Init();
 288   1              
 289   1              UART0_Init();
 290   1      
 291   1          Interrupts_Init();
 292   1      }
 293          
 294          //------------------------------------------------
 295          // 函数名称:InitVariable()
 296          // 函数功能:初始化系统全局变量
 297          //------------------------------------------------
 298          void InitVariable()
 299          {
 300   1              g_cMainSignal = 0;
 301   1      
 302   1              g_sTime.base  = 0;
C51 COMPILER V7.05   UART0                                                                 08/18/2007 20:00:10 PAGE 6   

 303   1              g_sTime.second= 0;
 304   1              g_sTime.minute= 0;
 305   1              
 306   1              g_cRecvPointer =0;
 307   1              g_cRecvLength  =0;
 308   1      
 309   1      
 310   1      }
 311          
 312          //-------------------------------------------------------------
 313          // 函数名称:定时器0中断入口函数,完成计时功能,定时时间为25ms
 314          // 输入参数: 无
 315          // 输出参数: 无
 316          //-------------------------------------------------------------
 317          
 318          void timer0() interrupt 1
 319          {
 320   1              TH0=TMR0H;
 321   1              TL0=TMR0L;
 322   1      
 323   1              // 程序时基信号
 324   1              if(++g_sTime.base>=TICKS_PER_SEC)
 325   1              {// 1s到
 326   2                      g_sTime.base = 0;
 327   2      
 328   2                      g_cMainSignal|=SECD_SIGNAL;      // 产生秒信号
 329   2      
 330   2                      if(++g_sTime.second>59)
 331   2                      {// 1分钟到
 332   3                              g_sTime.second = 0;
 333   3      
 334   3                              g_cMainSignal|=MINU_SIGNAL;  // 产生分信号
 335   3      
 336   3                              if(++g_sTime.minute>59) g_sTime.minute=0;
 337   3                      }
 338   2              }
 339   1      
 340   1      
 341   1      
 342   1      }
 343          
 344          //..................................................
 345          // 串口0中断服务程序
 346          // 
 347          //.................................................
 348          void Uart0() interrupt 4
 349          {
 350   1              BYTE cRecvData;
 351   1      
 352   1              if(RI0)                                                         // 如果收到数据
 353   1              {
 354   2                      RI0=0;                                                  // 清除收到数据标志
 355   2                      
 356   2                      cRecvData = SBUF0;                      // 读取数据
 357   2                      SBUF0 = cRecvData;              // 回显
 358   2      
 359   2                      if(cRecvData=='\r')
 360   2                      {// 回车符作为结束标志
 361   3                              g_cRecvBuffer[g_cRecvPointer]=0; // 接收结束
 362   3                              g_cRecvPointer = 0;
 363   3      
 364   3                              g_cMainSignal|=UART0RECV_SIGNAL; // 接收完成信号
C51 COMPILER V7.05   UART0                                                                 08/18/2007 20:00:10 PAGE 7   

 365   3                              
 366   3                      }
 367   2                      else if(cRecvData==0x08)
 368   2                      {// CTRL+H控制键,退格
 369   3                              if(g_cRecvPointer>0) g_cRecvPointer--;
 370   3                      }
 371   2                      else                    
 372   2                      {
 373   3                              if(g_cRecvPointer<RECVBUF_LEN)
 374   3                              {
 375   4                                      if(isupper(cRecvData))
 376   4                                      {// 大写字符转换为小写
 377   5                                              cRecvData = _tolower(cRecvData);
 378   5                                      }
 379   4                                      g_cRecvBuffer[g_cRecvPointer++]=cRecvData;
 380   4                              }
 381   3                              else
 382   3                              {// 数据长度错误
 383   4                                      g_cRecvPointer = 0;
 384   4                              }
 385   3                      }
 386   2                      
 387   2      
 388   2              }
 389   1      
 390   1              if(TI0)                                                         // 如果数据发送结束
 391   1              {
 392   2                      TI0=0;          
 393   2              }
 394   1              
 395   1      }
 396          
 397          
 398          //------------------------------------------------------------------
 399          // 主函数开始
 400          //-------------------------------------------------------------------
 401          void main()
 402          {
 403   1              Init_Device();        // 初始化系统
 404   1              InitVariable();       // 初始化变量
 405   1              
 406   1              EA=0;                             // 禁止看门狗
 407   1              WDTCN = 0xDE;         // 实验中不使用看门狗
 408   1              WDTCN = 0xAD;   
 409   1      
 410   1              EA = 1;               // 
 411   1               
 412   1          TR0  = 1;             // 启动定时器0
 413   1      
 414   1              SendString("C8051F02x core Module EC1,v1.0\r\n");
 415   1      
 416   1              while(1)
 417   1              {
 418   2      
 419   2                      if(g_cMainSignal&SECD_SIGNAL)
 420   2                      {// 秒信号
 421   3                              g_cMainSignal&=~SECD_SIGNAL;
 422   3                      
 423   3                      }
 424   2      
 425   2                      if(g_cMainSignal&MINU_SIGNAL)
 426   2                      {// 分信号
C51 COMPILER V7.05   UART0                                                                 08/18/2007 20:00:10 PAGE 8   

 427   3                              g_cMainSignal&=~MINU_SIGNAL;
 428   3      
 429   3                              
 430   3                      }
 431   2      
 432   2                      if(g_cMainSignal&UART0RECV_SIGNAL)
 433   2                      {// UART0接收完成信号
 434   3                              g_cMainSignal&=~UART0RECV_SIGNAL;
 435   3                              
 436   3                              // 确保接收缓冲区内的字符串有结尾
 437   3                              g_cRecvBuffer[RECVBUF_LEN-1] = 0;
 438   3                              // 分析接收的命令
 439   3                              CommandProc(g_cRecvBuffer);
 440   3      
 441   3                      }
 442   2      
 443   2              }
 444   1      
 445   1      }
 446          
 447          //......................................
 448          // 功能:分析接收的命令
 449          // 输入参数:
 450          //    pRecvString,char *:输入字符串
 451          // 输出参数:无
 452          // 命令格式说明:
 453          // setled=灯序号,开关状态 \r
 454          // 灯序号:   1,LED1;2,LED2
 455          // 开关状态:ON,打开灯;OFF,关闭灯
 456          // 命令字符不区分大小写
 457          //.......................................
 458          void CommandProc(char *pRecvString)
 459          {
 460   1              BYTE cRet=0;
 461   1              int  iPos;
 462   1      
 463   1              
 464   1              if(strncmp(pRecvString,"setled=",7)==0)
 465   1              {// 设置LED状态命令
 466   2                      
 467   2                      pRecvString+=7;
 468   2                      
 469   2                      iPos=strpos(pRecvString,',');
 470   2      
 471   2                      if(iPos==-1)
 472   2                      {// 无效命令
 473   3                              cRet = 0;
 474   3                      }
 475   2                      else
 476   2                      {
 477   3                      
 478   3                  if(strncmp(pRecvString,"2",1)==0)
 479   3                              {// 控制LED2
 480   4                                      pRecvString+=2;
 481   4      
 482   4                                      if(strcmp(pRecvString,"on")==0)
 483   4                                      {// 打开LED
 484   5                                              P_LED2 = 1;
 485   5      
 486   5                                              cRet = 1;
 487   5                                      }
 488   4                                      else if(strcmp(pRecvString,"off")==0)
C51 COMPILER V7.05   UART0                                                                 08/18/2007 20:00:10 PAGE 9   

 489   4                                      {// 关闭LED
 490   5                                              P_LED2 = 0;
 491   5      
 492   5                                              cRet = 1;
 493   5                                      }
 494   4                                      else
 495   4                                      {
 496   5                                              cRet = 0;
 497   5                                      }
 498   4                              }
 499   3                      }
 500   2      
 501   2              }
 502   1              else
 503   1              {// 无效命令
 504   2                      cRet = 0;
 505   2              }
 506   1              
 507   1              // 向主机发送应答
 508   1              if(cRet)
 509   1              {
 510   2                      SendString("\r\nOK\r\n");
 511   2              }
 512   1              else SendString("\r\nError\r\n");
 513   1      
 514   1      }
 515          
 516          //-----------------------------------------------------
 517          // 函数功能:循环方式发送字符串
 518          // 输出参数:pSendString,char*:欲发送的字符串的缓冲区
 519          // 输出:无
 520          //-----------------------------------------------------
 521          void SendString(char *pSendString)
 522          {
 523   1              
 524   1              // 循环发送,首先关闭中断
 525   1              ES0 =0;
 526   1              
 527   1              while(*pSendString!=0)
 528   1              {
 529   2                      SBUF0 = *pSendString++;
 530   2                      while(TI0==0);
 531   2                      TI0=0;
 532   2              }
 533   1      
 534   1              ES0 = 1;
 535   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    621    ----
   CONSTANT SIZE    =     67    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6       8
   IDATA SIZE       =     20    ----
   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 + -