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

📄 hdlc_st30.c

📁 C51实现HDLC数据链路协议的源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
            mData_Reg=0;
            mHdlc_LoopCounter=3;               /*地址计数器*/
            mBit_Counter=0x1;                  /*地址位*/
            mTask_ID++;
            break;
    case 1:                                    /*接收地址*/
            if(f_HDLCStat){
                mData_Reg|=mBit_Counter;
             }
            mHdlc_LoopCounter--;
            mBit_Counter<<=1;
            if(mHdlc_LoopCounter==0)
            {
              if(mData_Reg==HDLCADDR){
                mBit_Counter=0x1;              /*地址位*/
                mData_Reg=0;
                mHdlc_LoopCounter=5;
                mTask_ID++;
              }
              else {
                 TR0=0;
                 EX0=1;
                 mTask_ID=0;                   /*重新开始*/
              }
            }
            break;
    case 2:                                    /*命令 0ccccxxx0*/
            if(f_HDLCStat){
               mData_Reg|=mBit_Counter;
            }
            mHdlc_LoopCounter--;
            mBit_Counter<<=1;
            if(mHdlc_LoopCounter==0)
            {
              mHDLC_Cmd=mData_Reg;             /*0ccccxxx0   <-*/
              mData_Reg=0;

              if(mHDLC_Cmd>0xf){
                TR0=0;
                EX0=1;
                mTask_ID=0;
              }
              else 
              {
                mBit_Counter=0x1;              /*地址位*/
                mHdlc_LoopCounter=8;
                mTask_ID++;                    /*命令效验和接收*/
              }
            }
            break;
    case 3:                                    /*效验和*/
            if(f_HDLCStat){
               mData_Reg|=mBit_Counter;
            }
            mHdlc_LoopCounter--;
            mBit_Counter<<=1;
            if(mHdlc_LoopCounter==0)
            {
              if(Con_Crc[HDLCADDR+mHDLC_Cmd]==mData_Reg){
                 HDLC_ReciStat=COMMAND;
                 LEDOUT=~LEDOUT;
              }
              TR0=0;
              EX0=1;
              mTask_ID=0;
            }
            break;

/******************************************************************************
发送命令
*******************************************************************************/
    case 5:                                    /*发送HDLC_HEADHIGH个1*/
            mHdlc_LoopCounter=HDLC_HEADHIGH;   /*准备*/
            mTask_ID++;
            break;
    case 6:
            mHdlc_LoopCounter--;
            if(mHdlc_LoopCounter==0)
            {
              HDLCOUT=0;
              mHdlc_LoopCounter=3;
              mData_Reg=HDLCADDR;
              mTask_ID++;
            }
            break;
    case 7:                                    /*发送地址*/
            if(mData_Reg&1)HDLCOUT=1;
            else HDLCOUT=0;
            mData_Reg>>=1;
            mHdlc_LoopCounter--;
            if(mHdlc_LoopCounter==0)
            {
              mHdlc_LoopCounter=5;
              mData_Reg=mHDLC_Cmd;
              mTask_ID++;
            }
            break;
    case 8:                                    /*发送命令*/
            if(mData_Reg&1)HDLCOUT=1;
            else HDLCOUT=0;
            mData_Reg>>=1;
            mHdlc_LoopCounter--;
            if(mHdlc_LoopCounter==0)
            {
              mHdlc_LoopCounter=8;
              mData_Reg=Con_Crc[mHDLC_Cmd+mHDLC_Addr];
              mTask_ID++;
            }
            break;
    case 9:                                    /*发送效验和*/
            if(mData_Reg&1)HDLCOUT=1;
            else HDLCOUT=0;
            mData_Reg>>=1;
            mHdlc_LoopCounter--;
            if(mHdlc_LoopCounter==0){
                f_SendBusy=0;
                TR0=0;
                EX0=1;
                mTask_ID=0;                    /*接收方式*/
                INMODE();
            }
            break;


/*******************************************************************************
发送数据
*******************************************************************************/
    case 10:                                   /*发送HDLC_HEADHIGH个1*/
            HDLCOUT=1;
            mHdlc_LoopCounter=HDLC_HEADHIGH;   /*准备*/
            mTask_ID++;
            break;
    case 11:
            mHdlc_LoopCounter--;
            if(mHdlc_LoopCounter==0)
            {
              HDLCOUT=0;
              mHdlc_LoopCounter=3;
              mData_Reg=HDLCADDR;
              mTask_ID++;
            }
            break;
    case 12:                                   /*发送地址*/
            if(mData_Reg&1)HDLCOUT=1;
            else HDLCOUT=0;
            mData_Reg>>=1;
            mHdlc_LoopCounter--;
            if(mHdlc_LoopCounter==0)
            {
              mHdlc_LoopCounter=5;
              mData_Reg=mHDLC_Cmd;
              mTask_ID++;
            }
            break;
    case 13:                                   /*发送命令0*/
            if(mData_Reg&1)HDLCOUT=1;
            else HDLCOUT=0;
            mData_Reg>>=1;
            mHdlc_LoopCounter--;
            if(mHdlc_LoopCounter==0)
            {
              mData_Reg=Send_Buf[0];
              mByte_Counter=0;
              mBit_Counter=1;
              mTask_ID++;
            }
            break;
            
    case 14:                                   /*发送数据 */
            if(mData_Reg&1)HDLCOUT=1;
            else HDLCOUT=0;
            mData_Reg>>=1;
            mBit_Counter<<=1;
            if(mBit_Counter==0){
               mBit_Counter=1;
               mByte_Counter++;
               mData_Reg=Send_Buf[mByte_Counter];
            }

            if(mByte_Counter==SendByte_Counter)
            {
              if(mBit_Counter==SendBit_Counter)
              {
                f_SendBusy=0;
                TR0=0;
                EX0=1;
                mTask_ID=0;                    /*接收方式*/
                INMODE();
              }
            }
            break;
            
    default:
            TR0=0;
            EX0=1;            
            mTask_ID=0;
            INMODE();
            break;
  }
}


/*******************************************************************************
HDLC初始化
*******************************************************************************/
void HDLC_Init(void)
{
  INMODE();                                    /*输出方式*/
  mTask_ID=0;                                  /*停止*/
}

/***************************************************************************
检查接收的命令情况
***************************************************************************/
void ReciCmd_CheckState()
{
  if(HDLC_ReciStat==COMMAND){
    HDLC_ReciStat=NONE;	                /* */
    return;
    EX0=0;
    switch(mHDLC_Cmd&0x7){
      case CMD_DATA:
               if(mHDLC_Cmd&0x8){
                      f_SendBufFlow=1;
                      mHDLC_Cmd&=0xf7;
                      return;
               }
               if(SENSORSTAT){
                 if(f_SendBufFlow){
                      OUTMODE();
                      HDLC_ReciStat=NONE;
					  f_SendBufFlow=0;
                      f_SendBusy=1;
                      mTask_ID=10;             /*数据发送*/
                      TR0=1;
                 }
               }
               else {
                  mHDLC_Cmd=CMD_OUTLINE;
                  OUTMODE();
                  HDLC_ReciStat=NONE;
                  f_SendBusy=1;
                  mTask_ID=5;                  /*命令发送*/                  
                  TR0=1;
               }
               break;
      case 1:
               HDLC_ReciStat=NONE;
               break;
      case 2:
               HDLC_ReciStat=NONE;
               break;

      default:
               HDLC_ReciStat=NONE;
               break;
    }
  }
}


main()
{
  IP=0x3;

  Timer0_Init();
  Timer1_Init();

  
  ExtInt0_Init();

  HDLC_Init();
  Task_Init();

  EA=1;

  while(1)
  {
    AD_CheckState();
    Tran_ADToSend();
    ReciCmd_CheckState();
  }
}


⌨️ 快捷键说明

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