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

📄 scominterrupt.lst

📁 带时钟功能温度和湿度测量的仪器
💻 LST
📖 第 1 页 / 共 2 页
字号:
  93   1              uchar  UartReg;                                         //UartReg读端口暂存变量Count:临时计数器变量
  94   1              uchar Count;
  95   1              if(RI)                                                                  //检测是否是因为接收到数据产生中断
  96   1              {
  97   2                      CloseScom();
  98   2                      RI=0;                                                           //清除中断标志
  99   2                      UartReg=SBUF;                                           //接收一个字符
 100   2                      if(RecUpFlg<7)                                  //当帧结构标志RecUpFlg<10时收到数据才有可能为帧头
 101   2                      {       
 102   3                              if(UartReg==UartHead)                   //比较是否为帧头,如果此时帧结构标志为0则认为是头否则忽略
 103   3                              {                                                               //eb 90 eb 90 eb 90 ... 7e
 104   4                                      RecUpFlg++;                                     //接收数据各部分标志字节<0x10表示头=0x10表示主机地址0x20表示数据
 105   4                                      Count=(RecUpFlg&0x0f);          
 106   4                                      if(Count==0x06)                         //检测是否收到六个字节的头
 107   4                                      {               
 108   5                                              RecUpFlg=0x10;                  //设定帧数据标志为接收主机地址
 109   5                                      }
 110   4                                      if (UartHead==0x90)                     //收到0x90就准备接收0xeb
 111   4                                              UartHead=0xeb;
 112   4                                      else
 113   4                                              UartHead=0x90;
 114   4                              }
 115   3                              else                                                    //不等表示该数据不是头数据而是控制数据
 116   3                              {
C51 COMPILER V7.20   SCOMINTERRUPT                                                         11/09/2002 21:11:17 PAGE 3   

 117   4                                      RecUpFlg=RecUpFlg&0xf0;         //把低位清0
 118   4                                      UartHead=0xeb;                          //恢复通讯模式到初始化模式
 119   4                              }
 120   3                      }
 121   2                      else                                                            //0x10之后接收的数据全部为合法数据
 122   2                      {
 123   3                              //检测接收通讯有效数据
 124   3                              switch(RecUpFlg&0xf0)                   //根据计数器值来判断当前帧的数据类型
 125   3                              {
 126   4                              case 0x10:                                              //RecUpFlg=0x10接收主机地址并初始化好接收缓冲器UartRecBuf
 127   4                                      UartRecBuf[0]=UartReg;  //UartRecBuf将获取有效数据的第一个字节
 128   4                                      RecUpFlg=0x20;                  //下一个字节开始为有效数据RecUpFlg=0x20即切换到case 0x20
 129   4                              break;
 130   4      
 131   4                              case 0x20:                                              //RecUpFlg=0x10接收主机地址并初始化好接收缓冲器UartRecBuf
 132   4                                      UartRecBuf[1]=UartReg;  //UartRecBuf将获取有效数据的第一个字节
 133   4                                      DataBlockCount=2;               //DataBlockCount有效数据计数器初始化为1
 134   4                                      UpLeng=0xff;                    //数据长度初始化为255
 135   4                                      RecUpFlg=0x30;                  //下一个字节开始为有效数据RecUpFlg=0x20即切换到case 0x20
 136   4                              break;
 137   4      
 138   4                              case 0x30:                                              //接收真正的通讯数据到缓冲器UartRecBuf[]
 139   4                                      UartRecBuf[DataBlockCount]=UartReg;
 140   4                                      DataBlockCount++;               //对有效数据进行计数
 141   4                                      UpLeng=UpLeng-1;
 142   4                                      switch(UpLeng)                          //根据UpLeng的值确定数据是否收完
 143   4                      {
 144   5                              case 0:                                 //当UpLeng为0时表示数据帧接收完毕可以对当前帧响应
 145   5                                                      if( ( ( UartRecBuf[0]==MasterAddr )&&( UartRecBuf[1]==SlaveAddr ) )
 146   5                                                              ||( ( UartRecBuf[0]==_DEFAULT_PC_IP )&&( UartRecBuf[1]==_DEFAULT_MCU_IP ) ) )           
 147   5                                                       {              
 148   6                                                                      //if(CRCverify(UartRecBuf,UartRecBuf[3]+_F_RECV_ADD)==0)
 149   6                                                                              RecReady=1;
 150   6                                                                      //SendByte(0x30);
 151   6                                                       }
 152   5                                                       else
 153   5                                                       {
 154   6                                                                      RecReady=0;
 155   6                                                                      RecUpFlg=0;
 156   6                                                                      UartHead=0xeb;
 157   6                                                       }
 158   5                                              break;
 159   5                                              case 0xfd:                              //根据协议规定定位到数长字节并将其复制到UpLeng=UartReg;
 160   5                                                      UpLeng=UartReg;         //收到的第三个有效数据为实际数据长度Len=253+3+UartReg=UartReg
 161   5                                              break;
 162   5      
 163   5                                              default:
 164   5                                              break;
 165   5                                      }                                                       //switch(UpLeng)
 166   4                                      break;                                                  //case 0x30
 167   4      
 168   4                                      default:
 169   4                                      break;
 170   4                              }                                                               //switch(RecUpFlg&0xf0)
 171   3                      }                                                                       //if(RecUpFlg<10)
 172   2                      OpenScom();
 173   2              }
 174   1      }
 175          //#######################################################################################//
 176          //#######################################################################################//
 177          #endif                                                          //#ifdef _SCOM_EN

C51 COMPILER V7.20   SCOMINTERRUPT                                                         11/09/2002 21:11:17 PAGE 4   


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