新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機中斷問題30例

        單片機中斷問題30例

        作者: 時間:2013-05-07 來源:網絡 收藏

        if(key1==0)

        keybreak();

        }

        這個程序上電后P0口顯示0x32;按下key2顯示0x3f;key1用于中斷,每20ms檢測是否有按下key1鍵,有的話,P0口顯示0xf1。

        答 :

        ORG 0000H AJMP MAIN ORG 0001H LJMP INT_0 ORG 30H MAIN:MOV SP,#8FH MOV P0,#0FFH MOV P3,#0FFH SETB IT0 SETB EA SETB EX0 LJMP START START: MOV A,#10000000B LOOP: MOV P0,A RLC A LCALL DELAY LCALL DELAY LJMP LOOP LJMP START;

        這句是多余的 根本不會執行 INT_0: PUSH ACC ;

        由于p中1斷中1A被設為10所以5中7斷返回后對A移位沒有意義,o A一e直為10 ,并不d是只能中斷一1次 .

        還有,不清楚key1是什么中斷,貌似是鍵盤掃描吧,

        while(1)

        {

        key();

        P0=0x32;

        }

        都進入死循環了,所以跳不出來,就一次中斷了。

        7、新手學習avrATmage 128 遇到問題,中斷程序被忽略問題,找不到原因。

        avr studio 4 軟件仿真時,編譯通過了,單在編譯信息欄卻看到中斷程序被忽略。在軟件仿真時也發現中斷程序沒有執行。不知道問題出在哪里,我用的是avr studio 4 ATmage 128 .

        程序如下

        #include

        #include

        void main() //用的是TC0 溢出中斷,來控制八位LED 一秒閃爍

        {

        PORTE = 0xFF; //LED 關 端口高電平位關

        DDRE = 0xFF;

        MCUCR |=(1

        sei(); //開啟全局中斷

        TIMSK|=(1

        TCNT0 =155; //定時器賦初值

        TCCR0 |= (1 CS01); //8分頻

        while (1);

        }

        volatile unsigned int j =0;

        #pragma interrupt_handler timer0_ovf_isr:17

        void timer0_ovf_isr(void)

        {

        TCNT0 = 156; //設初值

        j++;

        if(j = 5000) //中斷5000次后 執行LED 電平翻轉

        PORTE ^= 0xFF; //LED 電平翻轉

        }

        ../lesson2.c:18: warning: ignoring #pragma interrupt_handler timer0_ovf_isr

        上面是寫的程序。還有編譯信息欄里的話。

        答:

        不是,你那句#pragma interrupt_handler timer0_ovf_isr:17是ICCAVR編譯軟件中寫中斷的方式,而看你的頭文件#include 和#include 應該是用avr studio裝GCCavr編譯軟件的寫法,你加上把中斷成

        SIGNAL(SIG_OVERFLOW0)

        {

        TCNT0 = 156; //設初值

        j++;

        if(j = 5000) //中斷5000次后 執行LED 電平翻轉

        PORTE ^= 0xFF; //LED 電平翻轉

        }

        看看,記住,這是GCCAVR 編譯軟件的寫法

        8新學的C51,編了個電平觸發式中斷程序,不知道為什么和跳變沿的一樣了,諸位幫忙看看.

        #include

        #define uchar unsigned char

        #define uint unsigned int

        sbit d1=P1^0;

        sbit dula=P2^6;

        sbit wela=P2^7;

        void delay(uint z);

        uchar code table[]={

        0x3f,0x06,0x5b,0x4f,

        0x66,0x6d,0x7d,0x07,

        0x7f,0x6f,0x77,0x7c,

        0x39,0x5e,0x79,0x71};

        void main()

        {

        EA=1;

        EX0=1;

        IT0=0;

        while(1)

        { d1=1;

        dula=1;

        P0=table[1];

        dula=0;

        P0=0xff;

        wela=1;

        P0=0xfe;

        wela=0;

        delay(500);

        dula=1;

        P0=table[2];

        dula=0;

        P0=0xff;

        wela=1;

        P0=0xfd;

        wela=0;

        delay(500);

        dula=1;

        P0=table[3];

        dula=0;

        P0=0xff;

        wela=1;

        P0=0xfb;

        wela=0;

        delay(500);

        dula=1;

        P0=table[4];

        dula=0;

        P0=0xff;

        wela=1;

        P0=0xf7;

        wela=0;

        delay(500);

        dula=1;

        P0=table[5];

        dula=0;

        P0=0xff;

        wela=1;

        P0=0xef;

        wela=0;

        delay(500);

        dula=1;

        P0=table[6];

        dula=0;

        P0=0xff;

        wela=1;

        P0=0xdf;

        wela=0;

        delay(500);

        }

        }

        void delay(uint z)

        {

        uint x,y;

        for(x=100;x>0;x--)

        for(y=z;y>0;y--);

        }

        void enter() interrupt 0

        {

        d1=0;

        }

        答: 你這個程序中設置IT0=0,說明是低電平觸發,所以只要P3^2口一直是低電平那么主程序停止,所以發光二極管點亮,如果P3^2口變為高電平,主程序繼續,發光二極管熄滅。另一種情況是當IT0=1的時候是負跳變觸發,就是當P3^2口檢測到一個又高電平到低電平的跳變后,觸發中斷,在中斷函數中點亮燈,立即出中斷,執行到d1=1時熄燈。看到的現象就是燈閃一下,直到又檢測到一個負跳變,燈又閃一下。兩種觸發方式的現象是不一樣的,如果你硬件沒問題的話。你可以把中斷函數寫成d1=!d1試試。

        9、在C51單片機中,中斷服務程序怎么撤銷中斷引腳上的低電平?

        我用的是,第一個單片機輸出低電平到第二個單片機的P3^2,第二個單片機是電平觸發方式中斷

        低電平觸發方式:要求低電平保持到CPU實際響應為止,為了避勉CPU再次響應中斷,在中斷服務程序中應該撤除中斷引腳上的低電平。請問,怎么撤銷?在中斷服務程序中怎么寫? 直接寫P3^2=1;行嗎?

        答:

        第一個單片機的程序,是誰來編寫? 如果也是樓主,那就好辦了。

        第二個單片機完成了中斷的功能,在退出之前,可以向第一個單片機回送一個脈沖;

        第一個單片機收到這個脈沖,就應該撤消送到第二個單片機的中斷申請信號。

        ----

        另外,如果能算出來完成中斷的時間,第一個單片機送來的申請信號,就不要超過這個時間,應該及時、自動的撤消申請信號。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 禹州市| 英山县| 营山县| 潮安县| 元朗区| 阳泉市| 新郑市| 景德镇市| 东乡族自治县| 庄浪县| 资溪县| 柳州市| 南涧| 朔州市| 天镇县| 大同市| 长沙市| 池州市| 永定县| 正定县| 神木县| 南岸区| 洛宁县| 阜城县| 巴马| 西昌市| 合山市| 郯城县| 游戏| 连平县| 高邑县| 莒南县| 洛川县| 安溪县| 大新县| 三原县| 岫岩| 伊金霍洛旗| 普兰县| 奇台县| 邢台市|