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

📄 interrupt.c

📁 本代码以AVR单片机为主控制器
💻 C
📖 第 1 页 / 共 2 页
字号:
                        {
                        Com2Var.RxBuff[ Com2Var.RxPoint ] = ComVar.UDR2 ;  // 接收数据
                        Com2Var.RxPoint ++;
                        Com2Var.OverTimer = 0;
                        SETBIT(Com2Bits,En500ms);
                        if(Com2Var.RxPoint >=60)            // 检测串口是否溢出
                        {
                            SETBIT(Com2Bits,ComRST);        // 置位串口错误标志
                            Com2Var.RxPoint = 0;
                        }
                    }
                }
                else                                        // 停止位无效,非法数据
                {
                    SETBIT(Com2Bits,ComRST);                // 置位串口错误标志
                }
                //---------------------------------------------------------
            }
        }
    }

}
                  
    // #endif
    //-------------------------------------------------------------------------
    if(++TimeVar.CommDelay>=12)                 // 延迟20ms
    {
        TimeVar.CommDelay = 0;
       
        
        // 串口1数据定时发送处理
        //-------------------------------------------------------------------------
        if(CHKBIT(Com1Bits,EnComTx))
    {
        if(Com1Var.ComTxStep>=2)
        {
            if(Com1Var.TxPoint >= Com1Var.TxConst)
            {                               // 串口转接收在安全性里做
                CLRBIT(Com1Bits,EnComTx);   // 清楚串口发送控制位
                SETBIT(Com1Bits,ComRST);    // 发送完毕复位串口为接收状态
            }
            else                            // 继续发送缓冲区的数据
            {
                UDR0 = ComVar.TxAllBuff[Com1Var.TxPoint];
                Com1Var.TxPoint++;
            }
        }
        else
        {
            UDR0 = 0xFE;
            Com1Var.ComTxStep++;
        }
    }
        // 串口1超时定时处理
        //-------------------------------------------------------------------------
       if(CHKBIT(Com1Bits,En500ms))
       {
        if(++Com1Var.OverTimer >= 5)        // 延迟约50ms
        {
            Com1Var.OverTimer = 0;
            CLRBIT(Com1Bits,En500ms);
            
            CLRBIT(UCSR0B,RXCIE0);          // 禁止串口接收中断
            Com1Var.CommEnd = 0xAA;         // 置位接收帧尾标志
        }
    }
    //#ifdef  _COM2_HW_EN
    // 串口2数据定时发送处理
    //-------------------------------------------------------------------------
      if(++TimeVar.Com2DelayTimer>1)
      {
        TimeVar.Com2DelayTimer = 0;
        if(CHKBIT(Com2Bits,EnComTx))
        {
            if(Com2Var.ComTxStep>=2)
            {
                ComVar.UDR2 = Com2Var.TxBuff[Com2Var.TxPoint];
                checkp = 0;
                for(i=0;i<8;i++)            // 计算偶校验位
                {
                    checkp += ComVar.UDR2>>i;
                }
                checkp = checkp&0x01;
                ComVar.CheckP = checkp;
                Com2Var.TxPoint++;
            }
            else
            {
                ComVar.UDR2 = 0xFE;         // 发送起始的 0xFE
                Com2Var.ComTxStep++;
            }
            if(Com2Var.TxPoint > Com2Var.TxConst)
            {
                CLRBIT(Com2Bits,EnComTx);   // 清除串口发送标志
                SETBIT(Com2Bits,ComRST);    // 置位串口复位标志,红外接收完毕复位一次
            }
            else
            {
                ComVar.Port2BitCnt = 0;     // 清零数据位寄存器
                TCNT1 = _TCNT1_RELOAD;      // 置定时器初始值
    
                SETBIT(Com2Bits,TD2);       // 置位发送请求标志
            }
        }
    }
    
          
        // 串口2超时定时处理
        //-------------------------------------------------------------------------
        if(CHKBIT(Com2Bits,En500ms))
        {
            if(++Com2Var.OverTimer >= 10)
            {
                Com2Var.OverTimer = 0;
                CLRBIT(Com2Bits,En500ms);
                Com2Var.CommEnd = 0xAA;             // 置位接收帧尾标志

                SETBIT(TIFR1,ICF1);                 // 禁止串口2接收
                CLRBIT(TIMSK1,ICIE1);               // 禁止捕捉中断
            }
        }
    //    #endif
    }
    //-------------------------------------------------------------------------
}
    
   
//*****************************************************************************
//       函数 : void Timer0(void)                                             *
//                                                                            *
//       功能 : Timer0定时中断处理                                            *
//       注释 : 提供系统15ms时基                                              *
//*****************************************************************************
/*
#pragma vector=TIMER0_OVF_vect
__interrupt void BasicTimer(void)
{
    TCNT0 = _TCNT0_RELOAD;                   // 重载TCNT0定时

    ComVar.Port2BitCnt++;                    // 串口处理位数加1
    //---------------------------------------------------------------------------
    if(CHKBIT(Com2Bits,TD2))                // 模拟串口发送处理
    {
        switch(ComVar.Port2BitCnt)
        {
            case 1:
                    TCCR2A = 0x42;          // 启动TIMER2       发送起始位(0)
            break;
            case 10:
                ComVar.UDR2 = ComVar.CheckP;  //          发送偶校验位
                if((ComVar.UDR2&0x01)==1)
                {
                    TCCR2A = 0;             // 停止TIMER2
                    _CLR_IO_TXD2();         // 置高TXD2 停止38k 发送1 
                }
                else
                {
                    TCCR2A = 0x42;          // 启动TIMER2        发送0
                }
            break;
            case 11:
                TCCR2A = 0;                 // 停止TIMER2
                _CLR_IO_TXD2();             // 置高TXD2 停止38k 发送1 停止位
                CLRBIT(Com2Bits,TD2);       // 清除发送请求标志 1字节发送完毕
            break;
            default:
                if((ComVar.UDR2&0x01)==1)
                {
                    TCCR2A = 0;             // 停止TIMER2
                    _CLR_IO_TXD2();         // 置高TXD2 停止38k 发送1 停止位
                }
                else
                {
                    TCCR2A = 0x42;          // 启动TIMER2        发送0
                }
                ComVar.UDR2 = ComVar.UDR2>>1;
            break;
        }
    }
    //-------------------------------------------------------------------------
    if(CHKBIT(Com2Bits,RD2))                                // 模拟串口接收处理
    {
        if(ComVar.Port2BitCnt< 9)                           // 读入8bit数据
        {
            ComVar.UDR2 = (ComVar.UDR2>>1);
            if(CHKBIT(PIND,IO_RXD2))                        // 检测RX2端口电平
            {
                ComVar.UDR2 |=0x80;
            }
        }
        else
        {
            if(ComVar.Port2BitCnt > 9)                      // 跳过校验位 接收完毕
            {
                if(CHKBIT(PIND,IO_RXD2))                    // 检测停止位
                {
                    CLRBIT(Com2Bits,RD2);                   // 清除串口接收请求标志
                    CLRBIT(TIMSK0,TOIE0);                   // 禁止 TIMER0 中断
                    //-------------------------------------------------------------
                    SETBIT(EIFR,INTF0);                     // 清除INT0中断标志
                    SETBIT(EIMSK,INT0);                     // 允许INT0中断
                    //---------------------------------------------------------
                    if(Com2Var.CommEnd == 0)
                    {
                        Com2Var.RxBuff[ Com2Var.RxPoint ] = ComVar.UDR2 ;  // 接收数据
                        Com2Var.RxPoint ++;
                        Com2Var.OverTimer = 0;
                        SETBIT(Com2Bits,En500ms);
                        if(Com2Var.RxPoint >=60)            // 检测串口是否溢出
                        {
                            SETBIT(Com2Bits,ComRST);        // 置位串口错误标志
                            Com2Var.RxPoint = 0;
                        }
                    }
                }
                else                                        // 停止位无效,非法数据
                {
                    SETBIT(Com2Bits,ComRST);                // 置位串口错误标志
                }
                //---------------------------------------------------------
            }
        }
    }

}
*/
//*****************************************************************************
//       函数 : void Compactor(void)                                          *
//                                                                            *
//       功能 : 比较器中断处理                                                *
//       注释 : 利用比较器提供掉电检测信号                                    *
//*****************************************************************************
#pragma vector=ANA_COMP_vect
__interrupt void Compactor(void)
{
    CLRBIT(ACSR,ACIE);                          // 禁止比较器中断
    PowerVar.SavePow = 0xAA;                    // 置位掉电保存电量标志
}
//*****************************************************************************
//       函数 : void UartRxInterrupt(void)                                    *
//                                                                            *
//       功能 : 串口接收中断处理                                              *
//       注释 :                                                               *
//*****************************************************************************
#pragma vector=USART_RX_vect
__interrupt void UartRxInterrupt(void)
{
    if(Com1Var.CommEnd != 0xAA)
    {
        Com1Var.RxBuff[Com1Var.RxPoint] = UDR0; // 接收数据
        Com1Var.RxPoint ++;
        Com1Var.OverTimer = 0;
        SETBIT(Com1Bits,En500ms);
        if(Com1Var.RxPoint >=60)                // 检测串口是否溢出
        {
            SETBIT(Com1Bits,ComRST);            // 置位复位串口标志
            Com1Var.RxPoint = 0;
        }
    }
}

/*************************** END OF SUB **************************************/


⌨️ 快捷键说明

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