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

📄 com.lst

📁 基于C51的通用人机界面程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.08   COM                                                                   02/27/2006 16:50:28 PAGE 1   


C51 COMPILER V7.08, COMPILATION OF MODULE COM
OBJECT MODULE PLACED IN .\output\com.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE com.c BROWSE DEBUG OBJECTEXTEND OBJECT(.\output\com.obj)

line level    source

   1          #define _com_ 
   2          #include "general.h"
   3          #include "state.h"
   4          #include "protocol.h"
   5          
   6          #define INLEN   0x32                                    //40,固定帧长10 的倍数为宜
   7          uchar idata r_buf[INLEN/*+0x0a*/];              //接收缓冲区
   8          uchar *p_wrecibuf=r_buf;                                //接收时缓冲区写入指针
   9          uchar *p_rrecibuf=r_buf;                                //解析时缓冲区读出指针                          
  10          
  11          uchar cnt_reci;
  12          //uchar idata t_buf[32];
  13          uchar *pSTX,*pETX;                                              //定位帧头、帧尾指针
  14          //uchar r_in,r_out,t_in,t_out;                  //FIFO
  15          bit r_full,r_notempty;                                  //标志:接收缓冲满、缓冲不空
  16          bit f_stx_ok=0;                                                 //
  17          bit f_etx_ok=0;
  18          //f_rxbit f_etx=0;
  19          
  20          ///////////////////初始化///////////////////////////////////////////////////////
  21          void init_com(void)
  22          {               
  23   1              //Timer1
  24   1              TMOD=0x20;      /*定时器1工作方式2*/   
  25   1              TH1=0xfd;       /*装253,波特率=9600bit/s*@11.0592MHz*/
  26   1              TCON=0x40;              //启动Timer1
  27   1              //COM
  28   1              //EA=0;
  29   1              //TI=0;
  30   1              SCON=0x50;      //0101,串口工作方式1 SM2=0,REN=1,允许接收
  31   1              //PCON=0x00;
  32   1              //PS=1;         //串口优先级
  33   1              //buf
  34   1              r_notempty=0;
  35   1              r_full=0;
  36   1              //r_out=t_in=t_out=0;
  37   1              //r_in=1;
  38   1              //IE
  39   1              //ES=1;//开串口中断
  40   1              //EA=1;//开中断
  41   1              IE=0x90;
  42   1      }
  43          ////////////////////////发送部分(非中断)////////////////////////////////////////// 
  44          void put_char(uchar ch){//发送一个字符,非中断方式
  45   1          SBUF=ch;
  46   1          while(TI==0);
  47   1              TI=0;                           //查询硬件置位,发送完毕
  48   1      }
  49          
  50          void put_string(uchar *str,uchar strlen){//发送一个字符串,非中断方式,strlen长度,注意本案中是从数组 高位 
             -开始送 
  51   1          uchar k=strlen;
  52   1          do {
  53   2              if(*(str+k-1)>=0&&*(str+k-1)<=9)        put_char(*(str+k-1)+'0');       //数字码
  54   2                      else                                                            put_char(*(str+k-1));           //非数字
C51 COMPILER V7.08   COM                                                                   02/27/2006 16:50:28 PAGE 2   

  55   2              k--;
  56   2          } while(k>0);
  57   1      }
  58          
  59          
  60          
  61          /////////////////////////////////////////////////////////////////////////////////////////////////////////
  62          /*
  63          void loadmsg(uchar *msg){                                                               // 将字符串装入缓冲区子程序发 
  64                  while((*msg!=0)&&((((t_in+1)^t_out)&0x1f)!=0)){ // 检查缓冲区满  
  65                          t_buf[t_in]=*msg;
  66                          msg++;
  67                          t_in=++t_in&0x1f;                                       // if t_in+1大于缓冲区0x1f,t_in=0 
  68                          if (t_done){                                            // 启动发送 
  69                                  TI=1;
  70                                          t_empty=0;
  71                                          t_done=0;
  72                                          
  73                          }
  74                  }
  75          }
  76          */ 
  77          ///////////////////////////接收部分(中断)///////////////////////////////////////
  78          void serial_int() interrupt 4 using 1{ 
  79   1              
  80   1              if (RI&~r_full){                        // 接收并且接收缓冲区未满 ,full就不再收了
  81   2                      //uchar ch;
  82   2                      //ch=SBUF;
  83   2                      RI=0;
  84   2                      //if(SBUF=FR_STX){              
  85   2              *p_wrecibuf=SBUF;                       // 接收数据写入 
  86   2                      r_notempty=1;                                           
  87   2      
  88   2                      if(p_wrecibuf==(r_buf+INLEN-1)) p_wrecibuf=r_buf;//循环
  89   2                      else                                                    p_wrecibuf++;
  90   2                      //cnt_reci++;
  91   2                     
  92   2              if (p_wrecibuf==p_rrecibuf)     r_full=1;        // 置缓冲区满标志
  93   2                      //if(*(p_wrecibuf-1)==FR_ETX) f_etx=1; 
  94   2                      //}     
  95   2              }
  96   1              /*else if (TI&&~t_empty){                       // 发送并且发送缓冲区未空 
  97   1               
  98   1               SBUF=t_buf[t_out]; TI=0;
  99   1               t_out=++t_out&0x1f;                                    // t_out+1大于缓冲区,则t_out=0 
 100   1               if (t_out==t_in) t_empty=1;                            // 要发送的数据还未送入缓冲区数据,缓冲区空 
 101   1          }
 102   1              else if (t_empty){                             // 等待缓冲区装入数据 
 103   1               TI=0;
 104   1               t_done=1;
 105   1              }*/
 106   1      }
 107          
 108          
 109          /*
 110          void process(uchar ch)                     
 111          {
 112             return;
 113          }
 114          */
 115          /*
 116          void processmsg(void){
C51 COMPILER V7.08   COM                                                                   02/27/2006 16:50:28 PAGE 3   

 117          /*                                                              // 处理接收缓冲区字符子程序
 118                  while (((r_out+1)^r_in)!=0){                                    // 不空即可处理   
 119                                          
 120                          if(r_buf[r_out+1]=='@'){                                        //定位帧头
 121                                  pSTX=&(r_buf[r_out+1]);
 122                                  f_stx_ok=1;                                                             //帧定位开始,可以unwrap
 123                          }
 124                          if((r_buf[r_out+1]=='\n')&&(f_stx_ok=1)){       //定位帧尾
 125                                  pETX=&(r_buf[r_out+1]);
 126                                  f_stx_ok=0;
 127                                  f_etx_ok=1;                                                             //帧定位好,可以应答(同时f_stx=1)
 128                          }
 129          
 130                          r_out=++r_out&0x1f;                                                     //取缓冲计数            
 131                  }
 132          */
 133          /*      uchar i;
 134                  i=*p_rrecibuf;
 135          
 136                  if(i==FR_STX){                                                          //定位帧头
 137                          pSTX=p_rrecibuf;
 138                          f_stx_ok=1;
 139                  }

⌨️ 快捷键说明

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