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

📄 main.c

📁 用单片机实现(载波监听/冲突检测)的功能
💻 C
📖 第 1 页 / 共 5 页
字号:
           }
           else if((Flag & SwitchOff) == SwitchOff)                   //异常开关解除
           {
              SendData(SwitchOffCode , 6);                                
           }
           WatchTransTimeOut = 0;
           ConflictFlag |= TXDTIMEOUT;                           //设置发送超时标志
           CommunicationErr |= STATESENDERR;                         //设置状态发送错误标志   
         }
      }
      else                                        
      {
          UartFlag = 0X00;
          UartCount = 2;
          while((ReceviceBuff[UartCount] == CodeTable[1][UartCount])  //接收到自PLC的安静指令
                && (UartCount < 9) && (UartFlag == 0X00))
          {
            if(UartCount == 7) 
            {
               UartFlag     &= ~BUSENABLEFLG;                            //总线申请允许                             
               ConflictFlag &= ~SENDENABLE;                              //不允许发送总线申请  
               ConflictFlag |= SENDDISABLE; 
               UartFlag     &= ~CONFLICTFLG;                              //无总线冲突
               
               SecIndex   = 0;                                        //当前延时值副本
               TimerCount = 0;                                        //总线空闲值                
               Index      = 0;                                        //当前延时
               break;
            }
            else 
            {
              UartCount++;                                          
            }
          }
          
          
          UartCount = 2;
          while((ReceviceBuff[UartCount] == CodeTable[7][UartCount])  //接收到自其他子台的总线申请
                && (UartCount < 9) && (UartFlag == 0X00))
          {
            if(UartCount == 7) 
            {
               UartFlag     &= ~BUSENABLEFLG;                            //总线申请允许                             
               ConflictFlag &= ~SENDENABLE;                              //不允许发送总线申请  
               ConflictFlag |= SENDDISABLE; 
               UartFlag     &= ~CONFLICTFLG;                             //无总线冲突
               
               SecIndex   = 0;                                           //当前延时值副本
               TimerCount = 0;                                           //总线空闲值                
               Index      = 0;                                           //当前延时
               break;
            }
            else 
            {
              UartCount++;                                          
            }
          } 
      }
   }
   
   
     if((WatchRecevice >= 5) && (UartCounter > 9))   //接收到总线上的乱码                               //接收到总线上的乱码    
     {     
        TBCCTL0 &= ~CCIE;                                    //不允许定时器A中断
        WatchRecevice = 0;                                   //延时变量为0 
        UartCounter = 0;  
        //SendData(CodeTable[0], 6);                  
        //CommunicationErr = ReSendErr;
        ConflictFlag |= TIMEOUTFLG;                        //定时超时标志
        //_EINT();
        //return;
      }
     ConflictFlag |= TIMEOUTFLG;                           //定时超时标志
     _EINT();
  }
   
    /*if((P6IN & P6IN_4) != P6IN_4)                          //如果掉电进入掉电处理        
   {
     Flag |= LowPowerFlg;
     DisplayFlg &= ~FirstFlg; 
     if((DisplayFlg & FirstFlg) == FirstFlg)
     {
        TACCTL0 &= ~CCIE;                                   //不允许定时器A中断
        TBCTL   = TBSSEL_1 + MC_1;                          //定时器B 32768HZ 中断
        TBCCTL0 = CCIE;                                     //定时器B 中断允许
        TBCCR0  = 32768;                                    //定时时间1s
        LPM3;
     }
   }*/
   
  
    
   /* if((Flag & ReceiveDataFlg) == ReceiveDataFlg)                        //接受上位机数据后,解包的处理
    {
      _DINT();
      unsigned char Counter;
      unsigned char ii=0;
      signed   char j=0;
      unsigned int  k=0;
      unsigned int  digital=0;
      CheckSum=0;
      for(ii=0; ii<9; ii++)
      {
        for(j=0; j<4; j++)
        {
          TotalProTemp[ii][j]=0;                                          //临时数组初始化
        }
      }
      while(ReceviceBuff[ii++] != '~') ;                                  //获取接收数据指令的长度
      j = 0;
      for(Counter=4; Counter<(ii-4); Counter++)                           //截取数据字符
      {
        CheckSum += ReceviceBuff[Counter];
        if((ReceviceBuff[Counter] != ','))                                //获取ASCII数据
        {            
          {
            TotalProTemp[k][j++] = ReceviceBuff[Counter];
          }
        }
        else
        {
          k++;
          j = 0;
        }
      }
      CheckSum += ReceviceBuff[3]; 
      CheckSum = CheckSum & 0X0F;                                             //校验和
      CheckSum |= 0X20;
      if(CheckSum == ReceviceBuff[ii-2])                                      //发送正确数据指令接收完毕
      {
        while((IFG1 & UTXIFG0) == 0);
        TXBUF0 = AddressIndex[SelfAddress];
        while((IFG1 & UTXIFG0) == 0);
        TXBUF0 = AddressIndex[SelfAddress];
        SendData(CorrectCode,2);
        UartCount = 0;
        Flag &= ~ReceiveDataFlg;
        for(ii=0; ii<10; ii++)
        {
          TotalPro[ii]=0;
        }
        
        for(ii=0; ii<9; ii++)                                                 //将ASCII数据转换成数值数据
        {
          Counter = 0;
          for(j=3; j>=0; j--)
          {
             switch(TotalProTemp[ii][j])
             {
                case '0':
                  Counter++;
                  digital = 0;
                  break;
                case '1':
                  Counter++;
                  digital = 1;
                  break;
                case '2':
                  Counter++;
                  digital = 2;
                  break;
                case '3':
                  Counter++;
                  digital = 3;
                  break;
                case '4':
                  Counter++;
                  digital = 4;
                  break;
                case '5':
                  Counter++;
                  digital = 5;
                  break;
                case '6':
                  Counter++;
                  digital = 6;
                  break;
                case '7':
                  Counter++;
                  digital = 7;
                  break;
                case '8':
                  Counter++;
                  digital=8;
                  break;
                case '9':
                  Counter++;
                  digital = 9;
                  break;
              }
          
              switch(Counter)
              {
                case 1:
                  k = 1;
                  TotalPro[ii+1] += digital * k;
                  break;
                case 2:
                 k = 10;
                 TotalPro[ii+1] += digital * k;
                 break;
                case 3:
                 k = 100;
                 TotalPro[ii+1] += digital * k;
                 break;
                case 4:
                 k = 1000;
                 TotalPro[ii+1] += digital * k;
                 break;
              }
            }
          }
          if(ReceviceBuff[3] == 'k')
            Plan = TotalPro[1];
          else if(ReceviceBuff[3] == 'l')
            Target = TotalPro[1];
          else if(ReceviceBuff[3] == 'm')
            Real = TotalPro[1]; 
      }
      else 
      {
          while((IFG1 & UTXIFG0) == 0);  
          TXBUF0 = AddressIndex[SelfAddress];
          while((IFG1 & UTXIFG0) == 0); 
          TXBUF0 = AddressIndex[SelfAddress];
          SendData(ReTxdData,2);                                            //要求重新发送
          UartCount = 0;
          Flag &= ~ReceiveDataFlg;
          CommunicationErr = ReSendErr;                                      //记录发送指令
      } 
       _EINT();
    }*/
    _NOP();
    _NOP();
    _NOP();
  }
  
}

void Init(void)
{
  //利用P2、P3口实现按键扫描
     _DINT();
     SysInit();                        //打开主震荡器
     P1IE  = 0XE0;                     //允许P1.6中断
     P1SEL = 0X00;                     //无外部模块选择
     P1IES = 0XE0;                     //下降沿触发
     P1IFG = 0X00;                     //中断标志初始为0 
     P1DIR = 0X00;                     //P1口设置为输入口,p1.6可中断
     //P1DIR = 0X80;                     //P1口设置为键盘输入口,可中断
     //P1OUT |= P1OUT_7;                 //  八脚拉高。置位输出
      
     
     P3DIR = 0X1F;                     //输出端口驱动LED
     P3OUT = 0X10;
     P3SEL = 0X30;                     //使用外部模块用于UART串行口通信
   
     P5DIR = 0XFF;                     //输出端口驱动LED 
     P5OUT = 0X00;
     
     P6DIR = 0X00;                     //监测p6.4电源端状态
     
                           
     TACTL   = TASSEL_1 + MC_1;                          //定时器A 32768HZ 中断
     TACCTL0 = CCIE;                                     //允许定时器A中断
     TACCR0  = 819;                                     //定时时间为25ms  
     
     TBCTL   = TBSSEL_1 + MC_1;                          //定时器A 32768HZ 中断
     TBCCTL0 = CCIE;                                     //允许定时器A中断
     TBCCR0  = 165;   
     
     U0CTL  &= ~SWRST;                                   // Release USART
     ME1    |= UTXE0 + URXE0;                            //使能RX TX
     U0CTL   = 0; 
     U0CTL   = CHAR+PENA;                                //一位停止位\8位数据位\奇校验允许
     U0TCTL  = 0;
     U0TCTL  = SSEL1;                                    //主时钟选择MCLK, 4MHZ  
     U0RCTL  = URXEIE;                                   //发送错误允许中断
      
     IE1    |= URXIE0 ;                                  //允许RX TX中断

     U0BR0   = BaudRate[BaudDefault][0];                 //默认波特率为 9600
     U0BR1   = BaudRate[BaudDefault][1];
     UMCTL0  = BaudRate[BaudDefault][2];
     
     //Index = BaudDefault;                                //波特率索引
     DisplayFlg     |= FirstFlg;                 
     Flag            = SwitchOff;                                   //启动标志
     ConflictFlag   |= SENDENABLE;    
     Plan   =0;                                          //计划
     //Target =0;                                          //目标
     Real   =0;                                          //实绩
     CounterForNumber = 0;                         
     Counter = 0;
     WatchRecevice =0;
     ConflictTimer =0;                    
     ScaleClock= -1;                                    //标尺置位
     _EINT();  
}

⌨️ 快捷键说明

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