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

📄 main.c

📁 本代码以AVR单片机为主控制器
💻 C
📖 第 1 页 / 共 2 页
字号:
        
        DIDR1 = 0x02;                               // 禁止AIN1数字缓冲
        DIDR0 = 0;
        ADMUX = 0;
        ADCSRB = 0;
        ADCSRA = 0;
        
        SPMCSR = 0;
        SPSR   = 0;
        SPCR   = 0;
        GPIOR0 = 0;
        GPIOR1 = 0;
        GPIOR2 = 0;
        GTCCR  = 0;
       
       //---------------------------------------------------------------------
       DDRB  = _DDRB_INIT;                         // 初始化PORTB
       DDRC  = _DDRC_INIT;                         // 初始化PORTC
       DDRD  = _DDRD_INIT;                         // 初始化PORTD
      //---------------------------------------------------------------------
       _LCDPOWER_ON();                             // 打开LCD电源
        //---------------------------------------------------------------------
       EICRA = (1<<ISC10)|(1<<ISC11)|(1<<ISC01)|(1<<ISC00);   // INT1为上升沿中断,INT0为上升沿
        SETBIT(EIMSK,INT0);                         // 允许INT1中断
        SETBIT(EIMSK,INT1);                         // 允许INT0中断
        //*********************************************************************
        TCCR0A = _TCCR0A_INIT;                      // TIMER0 
        TCCR0B = _TCCR0B_INIT;
        TIMSK0 = _TIMSK0_INIT;                      // 允许TIMER0溢出中断
        //---------------------------------------------------------------------
      TCCR1A = 0x00;                              // 设置 Timer1,为系统时钟必须保证可靠工作
        SETBIT(TIMSK1,TOIE1);                       // 只允许定时器1溢出中断
        CLRBIT(TIMSK1,OCIE1A);                      // 禁止比较输出A中断
        CLRBIT(TIMSK1,OCIE1B);                      // 禁止比较输出B中断
        CLRBIT(TCCR1B,CS10);                        // 启动 Timer1  8分频 0
        SETBIT(TCCR1B,CS11);                        // 启动 Timer1  8分频 1
        CLRBIT(TCCR1B,CS12);                        // 启动 Timer1  8分频 0
        TCCR1C = 0;
        //---------------------------------------------------------------------
        ASSR   = 0;
        TCNT2  = 0x00;
        OCR2A  = _OCR2A_LOAD;                       // 比较输出模式,OC2输出频率 37.8kHZ
        TCCR2B = 0x01;
        TIMSK2 = 0;                                 // 禁止TIMER2中断
        //---------------------------------------------------------------------
        // 串口安全处理,使用定时器对其进行定时初始化,通讯成功时清除初始化定时器
        if(Com1Var.ComInitTimer > 100 )             // 检测串口1初始化
        {
            Com1Var.ComInitTimer = 0;
            Com1Reset();
        }
        if(Com2Var.ComInitTimer > 100 )             // 检测串口2初始化
        {
            Com2Var.ComInitTimer = 0;
            Com2Reset();
        }
        //---------------------------------------------------------------------
        CLRBIT(ADCSRB,ACME);                        // 由AN1输入负端        // 比较器初始化
        CLRBIT(ACSR,ACD);                           // 使能比较器
        if((ACSR&0x43)!=0x43)                       // 下面标志不能随便操作,中断控制有电能累加程序处理
        {
            ACSR = (1<<ACIE)|(1<<ACBG)|(1<<ACIS1)|(1<<ACIS0)|(1<<ACI);
        }
        SREG|= 0x80;                                // 全局中断允许
        //---------------------------------------------------------------------
    }
}


//*****************************************************************************
//  函    数 : void TimeEvent(void)                                           *
//                                                                            *
//  功    能 : 时间相关处理函数                                               *
//  注    释 :                                                                *
//*****************************************************************************
void TimeEvent(void)
{
    if(CHKBIT(TimeBits,OneSecond))
    {
    if(ComVar.AdjustEn==0xAA) REVBIT(TimeBits,AdjustFlash);
    CLRBIT(TimeBits,OneSecond);         // 清秒标志
    SETBIT(TimeBits,EnDisplay);         // 允许显示刷新
    Com1Var.ComInitTimer ++;            // 串口1复位定时加
    Com2Var.ComInitTimer ++;            // 串口2复位定时加
    if(++TimeVar.AdjustTimer>=4)TimeVar.AdjustTimer=4;
    CheckProgKeyHigh();                 // Check internal prog-key
    CheckDisplayKey();                  // Check display key
   
    if(++TimeVar.Power10sTimer>=40)
        {
            TimeVar.Power10sTimer = 0;
            if(PowerVar.Pulse10SecCnt < _MEASURE_FALUT_LIMIT)   // 飞走检测
            {
                CLRBIT(PulseBits,DisMeasure);
            }
            PowerVar.Pulse10SecCnt = 0;
            //-----------------------------------------------------------------
            CheckREVP();                        // 检测反向指示,反向定时处理,防止潜动反向
        }
    if(++TimeVar.PowerOnDelayTimer >= 120)   // 上电延迟事件
        {
            TimeVar.PowerOnDelayTimer = 0;
            PowerOnReadParameter();             // 刷新设置参数
        }
        //---------------------------------------------------------------------
    if(++DispVar.DispTimer>(Disp_Time*2))      // 轮显时间控制
        {
            DispVar.DispTimer = 0;
           // if(DispVar.DispCode==0x03) DispVar.DispCode=0x00;
            if((DispVar.DispCode ==0x00)&&((PowerVar.DisplayCouter&0x02)==0x02))DispVar.DispCode  =0x01;
              else if((DispVar.DispCode ==0x01)&&((PowerVar.DisplayCouter&0x04)==0x04))DispVar.DispCode  =0x02;
                else DispVar.DispCode=0x00;
        }
       //---------------------------------------------------------------------
    if(CHKBIT(ComBits,EnStatus))            // 通讯指示
        {
            if(++DispVar.StatusTimer > 10)
            {
                DispVar.StatusTimer = 0;
                CLRBIT(ComBits,EnStatus);
                CLRBIT(ComBits,CommFlag);
            }
            else
            {
                SETBIT(ComBits,CommFlag);
            }
        }
        //---------------------------------------------------------------------
    }
    //-------------------------------------------------------------------------
}
//*****************************************************************************
//  函    数 : void PowerOnReadParameter(void)                                *
//                                                                            *
//  功    能 : 上电读入设置参数函数                                           *
//  注    释 :                                                                *
//*****************************************************************************
void PowerOnReadParameter(void)
{
    //CopyEEPToRam(ADDRESS_E814E,&DispVar.DispMode,1);        // 读入显示方式
    //-------------------------------------------------------------------------
 //   ReadPulseConst();                                         // 读入电表常数
    ReadDispConst();                                          // 读入显示项目
    ReadAdjustConst();                                        // 读入校准参数
    //-------------------------------------------------------------------------
    //CopyEEPToRam(ADDRESS_TIMECOEF,&TimeVar.TimeCoef,1);     // 读入时钟校正值
}
//*****************************************************************************
//       函数 : INT8U CheckDisplayKey(void)                                  *
//                                                                            *
//       功能 : 显示开关检测                                                  *
//                                         *
//*****************************************************************************
  void CheckDisplayKey(void)
{
    if(CHKBIT(PINC,IO_DISPLAY)==0)
    {
        ShortDelay();
        if(CheckPin(PINC,0,IO_DISPLAY))
        {
            DispVar.DispTimer = 0;        // 循显计数时间清零
            SETBIT(TimeBits,PushDispKey); // 置位键显标志
        }
    }
}
/*************************** END OF SUB **************************************/



⌨️ 快捷键说明

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