新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ATMEGA8計數器

        ATMEGA8計數器

        作者: 時間:2016-11-18 來源:網絡 收藏
        //可測1MHZ的頻率

        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        /***********對應的幾個數碼管顯示*****************/
        const uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
        unsigned long load=0;
        uchar data[4]={0,0,0,0};//
        uint cnt=0;//定時中的中斷次數
        uchar temp=0;//超過65536時這個數需要
        //
        void display(uchar *p)
        {
        uchar i,j,sel=0x01;
        for(j=0;j<2;j++)
        for(i=0;i<4;i++)
        {PORTB=~table[p[i]];
        PORTC=sel;
        Delay_us(2000);
        sel=sel<<1;
        }
        }
        void process(unsigned long t,uchar *p)//數據處理
        {unsigned long i=t;
        if(i<=9999)
        PORTD=PORTD|0X03;
        else if((i<=99999)&&(i>9999))
        {
        i=i/100;
        PORTD=PORTD&0XFE;
        PORTD=PORTD|0X02;
        }
        else if(i>99999)
        {
        PORTD=PORTD|0X01;
        PORTD=PORTD&0XFD;
        i=i/1000;
        }
        p[3]=i/1000;
        i=i%1000;
        p[2]=i/100;
        i=i%100;
        p[1]=i/10;
        i=i%10;
        p[0]=i;
        }
        void int_io(void)
        {DDRB=DDRC=0XFF;
        DDRD=0XDF;
        PORTC=PORTB=0XFF;
        PORTD=0XFF;
        SREG=0X80;//全局使能
        TCCR1B=0X06;//計數方式:T1下降沿
        TCNT1H=0X00;//計數器賦初值
        TCNT1L=0X00;
        }
        void main(void )
        {
        int_io();
        PORTB=0X00;
        PORTC=0XFF;
        Delay_ms(500);
        PORTB=0XFF;
        /****************************/
        TCNT0=0X06;//定時計數初使值為6
        TCCR0=0X04;//T/C0工作在定時方式,系統時鐘256分頻
        TIMSK=0X01;//定時局部使能T/C0
        while(1)
        {
        process(load,data);
        display(data);
        if(TIFR&0X04)//用標志位來進行 >65536時的事件
        { // if(TIFR&0X20)
        temp++;
        TIFR=TIFR&0X04;
        }
        }
        }
        /************************/
        ///////////////以下是T0的定時中斷
        #pragma interrupt_handler time0:10
        void time0(void)
        {
        uint tep=0;//讀取高字TCNT1L的值
        cnt++;
        if(125==cnt)//125*256us,且此處用于調節精度;
        {
        cnt=0;//
        /********以下為讀取計數器的值***********/
        load=0;
        load=TCNT1L;//讀取計數器低位的值
        tep=TCNT1H*256;//讀取計數器高位的值并處理
        load=tep+load;//高位加低位
        load=load+65536*temp;//處理完的數
        /***********************/
        TCNT1H=0X00;//重新賦初值
        TCNT1L=0X00;
        temp=0;
        }
        }
        //TO用于定時,

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


        關鍵詞: ATMEGA8計數

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 太仓市| 玉林市| 视频| 炎陵县| 万源市| 苍山县| 平顶山市| 中山市| 盖州市| 长阳| 英德市| 同江市| 汕尾市| 西丰县| 招远市| 时尚| 庄河市| 麟游县| 岱山县| 石棉县| 夹江县| 运城市| 襄垣县| 宁化县| 北流市| 河间市| 赞皇县| 上饶市| 商南县| 木里| 南木林县| 时尚| 太和县| 巴东县| 桂平市| 和林格尔县| 吉隆县| 漯河市| 井陉县| 永善县| 栖霞市|