新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ATMEGA16單片機的頻率計設計

        基于ATMEGA16單片機的頻率計設計

        作者: 時間:2012-08-06 來源:網絡 收藏
        硬件初始化函數HD_init.c:
        #includeiom16v.h>
        #includemacros.h>
        #define uchar unsigned char
        #define uint unsigned int
        #include"HD_init.h"
        extern unsigned int FREQ; //定義全局變量,用于計算
        uint time_num=250;//250*4ms=1s

        //端口初始化函數
        void PORT_Init()
        {
        DDRB = 0xFD;//PB1作為輸入口
        }
        //T0溢出中斷服務程序
        #pragma interrupt_handler timer0_ovf_isr:10
        void timer0_ovf_isr(void)
        {
        TCNT0 = 0x83; //重賦值
        if(!--time_num)
        {
        FREQ=TCNT1L;
        FREQ|=TCNT1H8; //這就是讀取低八位和高八位的值的方法
        TCNT1H=0; //計數值歸零
        TCNT1L=0;
        time_num=250;//0定時4ms,乘以250為1s
        }
        }
        //定時T1初始化進入計數模式
        void timer1_init(void)
        {
        TCCR1B = 0x00; //stop
        TCNT1H = 0x00 /*INVALID SETTING*/; //setup
        TCNT1L = 0x00 /*INVALID SETTING*/;
        TCCR1A = 0x00;
        TCCR1B = 0x06; //start Timer
        }
        //T0初始化定時4ms
        void timer0_init(void)
        {
        TCCR0 = 0x00;//停止
        TCNT0 = 0x83;//初始值
        OCR0 = 0x82;//匹配值
        TIMSK |= 0x01;//中斷允許
        TCCR0 = 0x04;//啟動定時器
        }
        延時函數(delay.c):
        #define uchar unsigned char
        #define uint unsigned int
        #include"delay.h"
        void delay(uint ms)
        {
        uint i,j;
        for(i=0;ims;i++)
        {
        for(j=0;j1141;j++);
        }
        }
        顯示函數(show.c)
        #includeiom16v.h>
        #includemacros.h>
        #define uchar unsigned char
        #define uint unsigned int
        #include"show.h"
        extern unsigned int FREQ; //定義全局變量,用于計算
        const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
        void show(uchar j,uchar k)
        {
        DDRA|=BIT(3);
        DDRA|=BIT(4);
        DDRD=0XFF;
        PORTA|=BIT(3);
        PORTD=table[j];
        PORTA=~BIT(3);
        delay(3);//此延時在仿真時非常重要
        PORTD=0XFF;
        PORTD=~BIT(k);
        PORTA|=BIT(4);
        PORTA=~BIT(4);
        }
        void display()//實際上只用最后一個就行,保留這么多
        //就是為了留一種算法
        {
        if(FREQ10)
        {
        show(FREQ%10,1);
        show(0,2);
        show(0,3);
        show(0,0);
        }
        else if(FREQ100)
        {
        show(FREQ%10,1);
        show(FREQ%100/10,2);
        show(0,3);
        show(0,0);
        }
        else if(FREQ1000)
        {
        show(FREQ%10,1);
        show(FREQ%100/10,2);
        show(FREQ%1000/100,3);
        show(0,0);
        }
        else
        {
        show(FREQ%10,1);
        show(FREQ%100/10,2);
        show(FREQ%1000/100,3);
        show(FREQ/1000,0);
        }
        }
        以下是接口函數:

        點擊瀏覽下一頁

        show.h:
        #define uchar unsigned char
        #define uint unsigned int
        #ifndef delay_h
        #define delay_h
        extern void show(uchar j,uchar k);
        extern void display();
        #endif

        HD_init.h:
        #ifndef HD_init_H
        #define HD_init_H
        extern void PORT_Init();
        extern void timer0_init(void);
        extern void timer1_init(void);
        #endif

        delay.h:
        #define uchar unsigned char
        #define uint unsigned int
        #ifndef delay_h
        #define delay_h
        extern void delay(uint ms);
        #endif

        上一頁 1 2 下一頁

        關鍵詞: ATMEGA16 頻率計 定時器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 广饶县| 壶关县| 汝南县| 西宁市| 武清区| 鹤峰县| 齐齐哈尔市| 房产| 冷水江市| 彭阳县| 张家口市| 沙雅县| 五台县| 龙井市| 连城县| 濮阳市| 成武县| 长泰县| 桂东县| 嘉善县| 团风县| 黄梅县| 宿松县| 左权县| 华坪县| 黔江区| 莱州市| 保亭| 若尔盖县| 高州市| 陈巴尔虎旗| 洛宁县| 辛集市| 贵阳市| 长春市| 望谟县| 丰原市| 土默特左旗| 南木林县| 唐海县| 德安县|