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

📄 main.c

📁 用单片机实现(载波监听/冲突检测)的功能
💻 C
📖 第 1 页 / 共 5 页
字号:
          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();
   
  }
}

void Init(void)
{
  //利用P2、P3口实现按键扫描
     _DINT();
     SysInit();                        //打开主震荡器
     P1IE  = 0X70;                     //允许P1.4中断
     P1SEL = 0X00;                 
     P1IES = 0X70;                     //下降沿触发
     P1IFG = 0X00;
     P1DIR = 0X80;                     //P1口设置为键盘输入口,可中断
     P1OUT |= P1OUT_7;                 //  八脚拉高。置位输出
     
     P3DIR = 0X1F;                     //输出端口驱动LED
     P3OUT = 0X1F;
     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  
     
    
     
     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  = StartFlg;                                   //启动标志
     //UartFlag |= FreeState;    
     ConflictFlag =FreeState;
     Plan   =0;                                          //计划
     Target =0;                                          //目标
     Real   =0;                                          //实绩
     CounterForNumber=0;                         
     Counter=0;
     ScaleClock= -1;                                    //标尺置位
     _EINT();  
}

void SysInit(void)
{
   unsigned int iq0;
   BCSCTL1 &= ~XT2OFF;     				//打开XT2振荡器
   do
   {
      IFG1 &= ~OFIFG;				        // 清除振荡器失效标志
      for(iq0=0xFF; iq0>0; iq0--);    	                // 延时,等待XT2起振
   }
   while((IFG1 & OFIFG) != 0);			        // 判断XT2是否起振
   BCSCTL2 = SELM_2 + SELS;		                //选择MCLK为XT2
} 


//*****************************************************************************
//  设置波特率程序,参数band为可以选择的波特率的编号
//  默认的波特率为119200bps
//
//*****************************************************************************
void SetBaud(int baud)
{
  UCTL0 |= SWRST;                               // USART held in reset
  UCTL0 &= ~SWRST;                              // Release USART

  ME1 &= ~(UTXE0 + URXE0);                      // Disable USART operation

  UBR00  = BaudRate[baud][0];                   // Set configuration for
  UBR10  = BaudRate[baud][1];                   // new baud rate
  UMCTL0 = BaudRate[baud][2];

  ME1 |= UTXE0 + URXE0;                         // Re-enable USART operation
  IE1 |= URXIE0;
  RXBUF0;                                       // Empty RX buffer and clear flags
}



#pragma vector = PORT1_VECTOR 
__interrupt void GetKeyCode(void)
{
  /*_DINT();                                                          //关闭中断
  if((P1IFG & P1IFG_4) == P1IFG_4)                                  //中断触发状态位
  {
    KeyTemp = P1IN & 0X0F;                                          //获取按键编码
    _NOP();                                                         //延迟处理
    _NOP();
    _NOP();
    _NOP();
    KeyTemp = P1IN & 0X0F;                                          //再次获取按键信息
    if((P1IN & 0X0F) == KeyTemp)
    {
      Key  =  KeyTemp;                                              //如果按键和上次的按键相同,确定按键
    }
  

  
  if(((Key == 0X0C) || (Key == 0X08) || (Key == 0X01) 
      || (Key == 0X0A) || (Key == 0X06) || (Key == 0X00)
      || (Key == 0X0B)) 
      && ((Flag & StartFlg) == StartFlg)
      && ((DisplayFlg & ErrFlg) !=ErrFlg))                          //0键和1.2键被按下
  {
     if(Key == 0X0C)                                                 //工数设定(0键)
     {
       Flag |= ResetFlg;                                              //设定状态
       Flag &= ~LCJ;
       Flag &= ~RUNFlg;
       
       if((DisplayFlg & ChangeWorkFlg) !=ChangeWorkFlg)
         DisplayFlg = DShrinkFlg;                                      //闪烁状态
       else 
       {
         DisplayFlg = DShrinkFlg;
         DisplayFlg |= ChangeWorkFlg;
       }
       DisplayFlg |= NumSetFlg;                                      //工数设
       ConvertData(Number);
     }
     else  if(Key == 0X08)                                           //计划设定 (1键)
     {
       Flag |= ResetFlg;                                    //设置状态
       Flag &= ~LCJ;
       Flag &= ~RUNFlg;
       if((DisplayFlg & ChangeWorkFlg) !=ChangeWorkFlg)
         DisplayFlg = DShrinkFlg;                                      //闪烁状态
       else 
       {
         DisplayFlg = DShrinkFlg;
         DisplayFlg |= ChangeWorkFlg;
       }
       DisplayFlg |= PlanSetFlg;                           //计划设定
       ConvertData(Plan);       
     }
     else if(Key == 0X01)                                  //按键2 时钟设定
     {
       Flag |= ResetFlg;                                    //设置状态
       Flag &= ~LCJ;
       Flag &= ~RUNFlg;
       if((DisplayFlg & ChangeWorkFlg) !=ChangeWorkFlg)
         DisplayFlg = DShrinkFlg;                                      //闪烁状态
       else 
       {
         DisplayFlg = DShrinkFlg;
         DisplayFlg |= ChangeWorkFlg;
       }
       DisplayFlg |= ClockSetFlg;                          //计划设定
       temp = Hour*100+Min;
       ConvertData(temp);
     }
     else if(Key == 0X0A)                                  //按键3 本机地址设定  
     {
       Flag |= ResetFlg;                                    //设置状态
       Flag &= ~LCJ;
       Flag &= ~RUNFlg;
      if((DisplayFlg & ChangeWorkFlg) !=ChangeWorkFlg)
         DisplayFlg = DShrinkFlg;                                      //闪烁状态
       else 
       {
         DisplayFlg = DShrinkFlg;
         DisplayFlg |= ChangeWorkFlg;
       }
       DisplayFlg |= AddressSetFlg;                        //计划设定
       ConvertData(SelfAddress);       
     }
     else if(Key == 0X06)                                 //第一班时间设定
     {
        

⌨️ 快捷键说明

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