新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機常見延時與中斷問題及解決方法

        單片機常見延時與中斷問題及解決方法

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

        #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、各位大俠幫我看一下我寫的51C程序中斷有沒有問題,執行中斷后不能繼續執行主程序,注: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++);

        d7=0;

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

        d7=1;

        }

        答:

        IT0=0;//低電平觸發,只要監測到是低電平,就觸發中斷

        你P3.2一直接地,一直是低電平,那中斷就不斷的執行,當然回不到主程序中了。

        改成IT0=1;//下降沿觸發,監測到高電平到電平跳變,就觸發中斷

        就算P3.2一直接地,也只觸發一次,中斷執行完了,就回到主程序中了。

        4、我的單片機這個程序為什么不能完全執行整個程序誰能告訴我!就是沒法執行3次亮暗的!

        2010-10-20 21:40 提問者:3865203bin3 | 懸賞分:10

        ORG 0000H

        AG:MOV A,#11111110B

        AG1:RL A

        MOV P0,A

        ACALL DELAY

        DJNZ R0,AG1

        ACALL DELAY

        MOV A,#11111111B

        MOV P1,A

        ACALL DELAY

        MOV P0,#00000000B

        ACALL DELAY

        MOV P0,#11111111B

        ACALL DELAY

        MOV P0,#00000000B

        ACALL DELAY

        MOV P0,#11111111B

        ACALL DELAY

        SJMP AG

        DELAY:MOV R3,#10

        D3:MOV R2,#200

        D1:MOV R1,#250

        D2JNZ R1,D2

        DJNZ R2,D1

        DJNZ R3,D3

        RET

        END

        我是想執行完流水燈亮.就然后執行全亮全暗3次 !可是就是不會跳到全亮全暗3次~~

        答:

        R0沒有賦初值!另外建議不要使用前2B個地址,因為51中斷矢量就在這個空間里。建議從0030H開始。以下程序在keil4中仿真成功。

        51單片機相關文章:51單片機教程


        c語言相關文章:c語言教程


        晶振相關文章:晶振原理


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 杭锦后旗| 苏尼特右旗| 开封市| 大港区| 湖南省| 沁源县| 平乐县| 琼结县| 郸城县| 赤壁市| 团风县| 安丘市| 南平市| 新邵县| 洞头县| 福清市| 宁德市| 涞源县| 安远县| 桐城市| 高雄县| 阜新| 开阳县| 即墨市| 曲周县| 五家渠市| 铜梁县| 阜新市| 江永县| 清水县| 上栗县| 仁怀市| 哈密市| 抚宁县| 临朐县| 福建省| 原阳县| 兴仁县| 来宾市| 东兰县| 郓城县|