新聞中心

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

        單片機中斷問題30例

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

        一、30例

        1、外中斷INT0為下降沿觸發,當中斷被觸發后cpu執行中斷程序,若本次中斷的程序還未執行完INT0又來了一個相同的下降沿中斷信號怎么辦?cpu會怎么處理?若是定時器中斷呢?串口中斷呢?求解釋

        答:再來一個不會執行。相同的優先級不會打斷正在執行的中斷。

        一. 如果是高優先級的中斷來了,會打斷低優先級的正在執行的中斷而執行高優先級的中斷。

        51的默認(此時的IP寄存器不做設置)中斷優先級為:

        外部中斷0 > 定時/計數器0 > 外部中斷1 > 定時/計數器1 > 串行中斷;

        當同時有幾種中斷到達時,高優先級中斷會先得到服務。

        例如:當計數器0中斷和外部中斷1(優先級 計數器0中斷>外部中斷1)同時到達時,會進入計時器0的中斷服務函數;但是在外部中斷1的中斷服務函數正在服務的情況下,這時候任何中斷都是打斷不了它的,包括邏輯優先級比它高的外部中斷0計數器0中斷。

        51單片機的中斷優先級控制寄存器IP可以把默認的中斷優先級設置為高或低級,

        例如默認是外部中斷0 > 定時/計數器0 > 外部中斷1 > 定時/計數器1 > 串行中斷;

        現在設為定時1 和串行中斷為高優先級 其它為低 ,那么中斷0執行時會被定時器1 或串行中斷打斷,如果設定的兩個高優先級定時/計數器1 和串行中斷同時響應,會再自然排隊,先執行定時1中斷再執行串行中斷。

        2、單片機,中斷3為什么不執行,整個程序有什么不對的地方呢?

        #include

        #define uint unsigned int

        #define uchar unsigned char

        sbit p1_0=P1^0;

        sbit p1_1=P1^1;

        sbit p1_2=P1^2;

        sbit p1_3=P1^3;

        sbit p1_4=P1^4;

        sbit p1_5=P1^5;

        uchar PWM_T1 = 0;

        uchar PWM_T2 = 0;

        uint i,m;

        void delay(uint z)

        {

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

        for(m=0;m110;m++);

        }

        void PWM_value_left(int pwm_set)

        {

        PWM_T1=pwm_set;

        }

        void PWM_value_right(int pwm_set)

        {

        PWM_T2=pwm_set;

        }

        void main(void)

        {

        bit flag = 1;

        uint n;

        TMOD=0x22;

        TH0=241;

        TH1=241;

        TL0=241;

        TL1=241;

        TR0=1;

        TR1=1;

        ET0=1;

        ET1=1;

        EA=1;

        P1=0xf0;

        delay(20);

        PWM_value_left(7);

        PWM_value_right(10);

        delay(100);

        PWM_value_left(8);

        PWM_value_right(9);

        delay(100);

        PWM_value_left(9);

        PWM_value_right(8);

        delay(100);

        PWM_value_left(10);

        PWM_value_right(7);

        }

        timer0() interrupt 1 using 2

        {

        static uint t ;

        t++;

        if(t==10)

        {

        t=0;

        p1_0=1;

        p1_1=0;

        }

        if(PWM_T1==t)

        P1=P10xfc;

        }

        timer1() interrupt 3

        {

        static uint t1 ;

        t1++;

        if(t1==10)

        {

        t1=0;

        p1_2=1;

        p1_3=0;

        }

        if(PWM_T2==t1)

        P1=P10xf3;

        }

        答:沒有主循環,

        沒有等到中斷3

        程序運行一次就跑飛了!!!

        void main(void)

        {

        //...你的程序

        //在這里加 死循環,等待中斷

        while(1)

        {

        ;

        }

        }

        而且,中斷響應函數里必須要清中斷標志位(你的沒有)!

        3、各位大俠幫我看一下我寫的51單片機C程序中斷有沒有問題,執行中斷后不能繼續執行主程序,注:P3.2口一直接

        注:P3.2口一直接地,程序如下:

        #include

        sbit dula=P2^6;

        sbit wela=P2^7;

        sbit d0=P1^0;

        sbit d1=P1^1;

        sbit d2=P1^2;

        sbit d3=P1^3;

        sbit d4=P1^4;

        sbit d5=P1^5;

        sbit d6=P1^6;

        sbit d7=P1^7;

        #define uchar unsigned char

        #define uint unsigned int

        uchar num;

        uchar code table[]={

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

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

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

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

        void delay(uint z);

        void main()

        {

        EA=1;

        EX0=1;

        IT0=0;

        wela=1;

        P0=0xc0;

        wela=0;

        while(1)

        {

        for(num=0;num16;num++)

        {

        dula=1;

        P0=table[num];

        dula=0;

        delay(1000);

        }

        }

        }

        void delay(uint z)

        {

        uint a,b;

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

        for(b=110;b>0;b--);

        }

        void exter0() interrupt 0

        {

        uint c;

        for(c=0;c25000;c++);

        d0=0;

        for(c=0;c25000;c++);

        d0=1;

        for(c=0;c25000;c++);

        d1=0;

        for(c=0;c25000;c++);

        d1=1;

        for(c=0;c25000;c++);

        d2=0;

        for(c=0;c25000;c++);

        d2=1;

        for(c=0;c25000;c++);

        d3=0;

        for(c=0;c25000;c++);

        d3=1;

        for(c=0;c25000;c++);

        d4=0;

        for(c=0;c25000;c++);

        d4=1;

        for(c=0;c25000;c++);

        d5=0;

        for(c=0;c25000;c++);

        d5=1;

        for(c=0;c25000;c++);

        d6=0;

        for(c=0;c25000;c++);

        d6=1;

        for(c=0;c25000;c++);


        上一頁 1 2 3 4 5 6 7 8 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 新宾| 枣阳市| 静乐县| 榆林市| 桂平市| 平昌县| 额济纳旗| 弥渡县| 文安县| 苍梧县| 剑阁县| 霸州市| 安丘市| 丹阳市| 阳西县| 秭归县| 福安市| 江山市| 肃南| 柯坪县| 鄢陵县| 安义县| 泰来县| 岳普湖县| 温泉县| 仙桃市| 白沙| 巴东县| 永昌县| 宁安市| 白河县| 喀喇沁旗| 麟游县| 苏尼特左旗| 新绛县| 社旗县| 文山县| 永德县| 洛川县| 镇远县| 蛟河市|