新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > avr中斷使用例子

        avr中斷使用例子

        作者: 時間:2016-11-18 來源:網絡 收藏
        在ICCAVR下,用以下語句可定義中斷程序
        #pragma interrupt_handler 函數名:中斷向量
        要注意不同的AVR芯片的中斷向量是不同的,因此在ICCAVR下編譯,除了要在程序上注明芯片的類型外,還要在PROJECT的OPTION頁選擇正確的芯片,否則有可能導致程序運行不正常;而GCC只要在MFILE里面選定芯片型號就可以,GCC在這點上的使用比ICCAVR的方便。
        附:定時器1溢出中斷例子,每溢出一次就令i自加1,然后在LCD1602上顯示出來
        ------------------------------------------------------------------------------------------------
        #include
        #include
        #pragma interrupt_handler ANA_COMP:10 //定時器1溢出中斷
        #define uchar unsigned char
        #define uint unsigned int
        #define LcdBus PORTA
        #define rs 2 //LCD端口定義
        #define rw 3
        #define en 4


        void LcdIni(void);
        void WrOp(uchar dat);
        void WrDat(uchar dat);
        void ChkBusy(void);
        void DisText(uchar addr,uchar *text);
        void DisTextConst(uchar addr,uchar const *text);
        void ShowNum(uchar addr,uint num); //在addr處顯示數字num
        int AdcVal(uchar n);
        void delayms(uint n);
        int AdcValPro(uchar n);
        void ANA_COMP(void);

        char BCD[6]; //十位二進制的顯示碼分別是千百十個位的顯示
        int Adc[3]; //存放Adc轉換后的值
        int i=0;
        void main(void)
        {
        LcdIni();
        TIMSK=0X04;
        TCNT1H=0XFF;
        TCNT1L=0X00;
        TCCR1A=0X00;
        TCCR1B=0X01;
        SEI(); //允許全局中斷
        while(1);
        }

        void ANA_COMP(void)
        {//中斷處理程序,溢出時就令i增加1
        TCNT1H=0XFF;
        TCNT1L=0X00;
        ShowNum(0x82,i++);
        }

        int AdcVal(uchar n)
        {//軟件濾波
        uchar i,k;
        uint tmp=0;
        for(i=0;i<20;i++)
        tmp=(tmp+AdcValPro(n))/2;
        k=tmp>Adc[n] ? (tmp-Adc[n]):(Adc[n]-tmp);
        Adc[n]=k>0 ? tmp:Adc[n];
        return Adc[n];
        }

        int AdcValPro(uchar n)
        {//返回第N個ADC的值從0到7
        uchar dat1,dat0;
        int val;
        DDRA &=~BIT(n); //設置對應的ADC口為輸入
        PORTA &=~BIT(n);
        ADMUX=0x40+n; //選擇AVCC,選擇第N個ADC
        ADCSRA=0xc0; //允許轉換ADEN,ADSC
        while(ADCSRA & BIT(ADSC)); //
        dat1=ADCH;
        dat0=ADCL;
        val=ADCH*256+ADCL;
        return val;
        }

        void ShowNum(uchar addr,uint num) //在addr處顯示數字num
        {//將num轉化成五個BCD碼存放在全局數組BCD[5]中
        uchar i;
        for(i=5;i>0;i--) //將NUM數據轉化成ASCII碼,如521會轉化為00521
        {
        BCD[i-1]=(uchar)(num%10+0x30); //取出最低位
        num/=10; //去掉最低位
        }
        i=0;
        while(BCD[i] ==0x30 && i<4) BCD[i++]= ; //NUM轉換成數組存放,但還沒有加上小數點
        BCD[5]= 主站蜘蛛池模板: 临泉县| 涟源市| 蓬安县| 湘西| 溧水县| 布拖县| 河池市| 长海县| 内江市| 乐平市| 山阳县| 四子王旗| 儋州市| 武山县| 石首市| 东乡族自治县| 汾西县| 大埔县| 万州区| 奉化市| 安吉县| 阿合奇县| 封开县| 永新县| 吴江市| 乌拉特前旗| 兴仁县| 华容县| 横峰县| 通州市| 巴楚县| 道孚县| 肇源县| 玉门市| 洞头县| 吴川市| 孟连| 定远县| 洛阳市| 措勤县| 林口县|