新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > avr定時器T0,T1,T2初始化配置及其說明

        avr定時器T0,T1,T2初始化配置及其說明

        作者: 時間:2016-11-18 來源:網絡 收藏
        #include

        #include

        本文引用地址:http://www.104case.com/article/201611/315757.htm

        unsigned char shi,fen,miao;
        unsigned char t=0;
        #define DATA_T0_INIT 156
        #define DATA_T1_INIT 31249
        #define DATA_T2_INIT 156
        unsigned int T0_CAPT=0;
        //T0/C0溢出中斷向量端口
        #pragma interrupt_handler Timer0_over:iv_TIMER0_OVF
        //T0/C0比較匹配中斷向量端口
        #pragma interrupt_handler Timer0_COMP:iv_TIMER0_COMP
        //T1/C1溢出中斷向量端口
        #pragma interrupt_handler Timer1_Ov:iv_TIMER1_OVF
        //T1/C1比較匹配B中斷向量端口
        #pragma interrupt_handler Timer1_COMPB:iv_TIMER1_COMPB
        //T1/C1比較匹配A中斷向量端口
        #pragma interrupt_handler Timer1_COMPA:iv_TIMER1_COMPA
        //T1/C1事件捕捉中斷向量端口
        #pragma interrupt_handler Timer1_CAPT:iv_TIMER1_CAPT
        //T2/C2溢出中斷向量端口
        #pragma interrupt_handler Timer2_OVF:iv_TIMER2_OVF
        //T2/C2比較匹配中斷向量端口
        #pragma interrupt_handler Timer2_COMP:iv_TIMER2_COMP




        /*********************************************T0定時器**************************************************************************/
        void T0_init(unsigned char a,unsigned char b)//a是0采用定時器的溢出中斷使能,是1采用比較匹配中斷使能,b為0,1,2,3,4,分別代表分頻的方式,0,8,64,256,1024
        {
        if(a==0)
        {TCNT0=255-DATA_T0_INIT;TIMSK|=0X01;//TIMSK|=0X01;溢出中斷使能,
        }
        else
        { OCR0=DATA_T0_INIT;TCNT0=0;
        TIMSK|=0X02;// TIMSK|=0X02;比較匹配中斷使能
        }
        switch(b)
        {
        case 0:TCCR0=0X01;break;//TCCR0=0X01;無預分頻
        case 1:TCCR0=0X02;break;//TCCR0=0X02;8分頻.
        case 2:TCCR0=0X03;break;//TCCR0=0X03;256分頻.
        case 3:TCCR0=0X04;break;//TCCR0=0X04;64分頻.
        case 4:TCCR0=0X05;break;//TCCR0=0X05;1024分頻.
        }
        SREG|=BIT(7); //全局中斷使能
        shi=0;fen=0;miao=0;

        }

        void Timer0_over(void)
        {TCNT0=255-DATA_T0_INIT;
        t++;
        if(t>=50){t=0;miao++;if(miao>=60){fen++;miao=0;if(fen>=60){shi++,fen=0;if(shi>=24)shi=0;fen=0;}}}
        }
        void Timer0_COMP(void)
        {TCNT0=0;
        t++;
        if(t>=50){t=0;miao++;if(miao>=60){fen++;miao=0;if(fen>=60){shi++,fen=0;if(shi>=24)shi=0;fen=0;}}}
        }



        /*********************************************T1定時器**************************************************************************/

        void Timer1_init(unsigned char a,unsigned char b)
        { //31249 是top值,8mhz 256分頻.
        TCCR1A=0x00; //普通端口操作
        SREG|=0x80; //開放全局中斷
        if(a==1)
        {TCNT1=DATA_T1_INIT;}
        else{TCNT1=0;}
        switch(a)
        {
        case 0:TCCR1B|=0X01;break;//TCCR1B=0X01;無預分頻
        case 1:TCCR1B|=0X02;break;//TCCR1B=0X02;8分頻.
        case 2:TCCR1B|=0X03;break;//TCCR1B=0X04;64分頻.
        case 3:TCCR1B|=0X04;break;//TCCR1B=0X03;256分頻.
        case 4:TCCR1B|=0X05;break;//TCCR1B=0X05;1024分頻.
        }
        switch(b)
        {
        case 1:TIMSK|=0x04;break;//T1溢出中斷使能
        case 2:OCR1B=DATA_T1_INIT;TIMSK|=0x08;break;//T1比較匹配B中斷使能
        case 3:OCR1A=DATA_T1_INIT;TIMSK|=0x10;break;//T1比較匹配A中斷使能
        case 4:TCCR1B|=0x80;//ICNC1:1使能噪聲捕捉功能
        TCCR1B|=0x40;//噪聲捕捉事件的觸發方式 ICES1:0下降沿。1上升沿,
        TIMSK|=0x20;break;//T1事件捕捉中斷使能
        }

        }
        void Timer1_Ov(void)
        { t++;
        TCNT1=DATA_T1_INIT; //計數值裝入寄存器 T= 0.125uS*N*(1+TOP) TOP=t/(0.125*256)-1
        miao++;if(miao>=60){fen++;miao=0;if(fen>=60){shi++,fen=0;if(shi>=24)shi=0;fen=0;}}
        }
        void Timer1_COMPB()
        {TCNT1=0;
        {miao++;if(miao>=60){fen++;miao=0;if(fen>=60){shi++,fen=0;if(shi>=24)shi=0;fen=0;}}}
        }
        void Timer1_COMPA()
        { TCNT1=0;
        {miao++;if(miao>=60){fen++;miao=0;if(fen>=60){shi++,fen=0;if(shi>=24)shi=0;fen=0;}}}
        }
        void Timer1_CAPT()
        {
        T0_CAPT=ICR1;
        }
        /*********************************************T2定時器**************************************************************************/

        void Timer2_init(unsigned char a,unsigned char b)
        {
        /*TCCR2控制寄存器
        BIT7 BIT 6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
        FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20*/
        //WGM21:WGM20 0:0普通模式top=0xff
        //COM21:COM20 0:0 正常端口操作,不跟OC2相連

        ASSR=0x00;//ASSR=0x00;有IO時鐘驅動。ASSR|=0x08;異步模式。由Pc6-Pc7之間的外接石英晶體驅動
        /*
        ASSR控制寄存器
        bit3 bit2 bit 1 bit 0
        AS2 TCUN2UB OCR2UB TCR2UB
        TCUN2UB:異步模式:寫TCNT2時會引起 TCUN2UB置位,寫完成時,TCUN2UB自動清零,TCUN2UB=0代表TCNT2可以寫入新的數值了
        OCR2UB:異步模式:寫OCR2時會引起 OCR2UB置位,寫OCR2完成時,OCR2UB自動清零,OCR2UB=0代表OCR2可以寫入新的數值了
        TCR2UB:異步模式:寫TCCR2時會引起 TCR2UB置位,寫TCCR2完成時,TCR2UB自動清零,TCR2UB=0代表TCCR2可以寫入新的數值了


        */
        switch(a)
        {
        case 0:TCCR2|=0X01;break;//TCCR2=0X01;無預分頻
        case 1:TCCR2|=0X02;break;//TCCR2=0X02;8分頻.
        case 2:TCCR2|=0X03;break;//TCCR2=0X04;64分頻.
        case 3:TCCR2|=0X04;break;//TCCR2=0X03;256分頻.
        case 4:TCCR2|=0X05;break;//TCCR2=0X05;1024分頻.
        }
        if(b==0)
        {TCNT2=255-DATA_T2_INIT; TIMSK|=0x40;}//T2溢出中斷使能
        else {TCNT2=0;OCR2=DATA_T2_INIT;TIMSK|=0x80;}//T2比較匹配中斷使能
        }

        void Timer2_OVF()
        {TCNT2=255-DATA_T2_INIT;
        t++;
        if(t>=50){t=0;miao++;if(miao>=60){fen++;miao=0;if(fen>=60){shi++,fen=0;if(shi>=24)shi=0;fen=0;}}}

        }

        void Timer2_COMP()
        {TCNT2=0;
        t++;
        if(t>=50){t=0;miao++;if(miao>=60){fen++;miao=0;if(fen>=60){shi++,fen=0;if(shi>=24)shi=0;fen=0;}}}
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 大足县| 鹤庆县| 类乌齐县| 井陉县| 阜康市| 简阳市| 海城市| 微山县| 库尔勒市| 太和县| 宁夏| 富顺县| 白河县| 阿克苏市| 正定县| 柳河县| 宁夏| 关岭| 兰西县| 浙江省| 庆元县| 洮南市| 林口县| 南京市| 铁岭县| 亚东县| 镇平县| 康平县| 油尖旺区| 彭山县| 鹰潭市| 江源县| 云龙县| 镇赉县| 东兰县| 木里| 福清市| 廉江市| 美姑县| 库尔勒市| 读书|