新聞中心

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

        單片機中斷問題30例

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

        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中仿真成功。

        ORG 0000H

        AJMP AG

        ORG 0030H

        AG:MOV A,#11111110B

        MOV R0,#8

        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

        5、STC89C52通過兩個外部中斷P3.2和P3.3,來控制P1.0和P1.1的數碼管亮和滅,一定keil C

        說明:通過外部中斷0【P3.2】,P1.0的數碼管亮,中斷結束后,數碼管滅;再由外部中斷1【P3.3】,P1.1的數碼管亮,次中斷結束后,數碼管滅;簡言之就是一個中斷只控制一個數碼管,中斷之間在功能上沒有必然的聯系,編程環境keil C51。P1.0和P1.1口上接的都是普通LED小燈,數碼管=LED小燈。

        以下是我編的程序,就是一個中斷控制一個數碼管,但是當有兩個中斷時,我就抓瞎了

        #include

        sbit D1=P1^0;

        void main()

        {

        D1=1;

        EA=1;

        EX0=1;

        }

        void exter() interrupt 0

        {

        D1=0;

        }

        求高手幫我改改程序,改成兩個中斷的那種,功能要求都寫在上面了~【希望能有程序注釋】3Q,我會去keil里面模擬的~~o()^))o

        答:

        /*模塊低電平有效、外部中斷0、1為低電平出發*/

        #include "reg52.h"

        void delay( char i)

        {

        unsigned char t;

        while(i--)

        {

        for(t=0;t108;t++);

        }

        }

        void INT0_ROUTING() interrupt 0//外部中斷0子程序

        {

        P0=0xfe;//LED0點亮

        while((P3|0xfb)==0xff);//等待外部中斷0口(P3^2松開)

        delay(10);//延時去抖動

        P0=0xff;//LED0熄滅

        }

        void INT0_ROUTING() interrupt 2

        {

        P0=0xfd;//LED1點亮

        while((P3|0xf7)==0xff);//等待外部中斷1口(P3^3松開)

        delay(10);//延時去抖動

        P0=0xff;//LED1熄滅

        }

        void main()

        {

        EA=1;//中斷總開關

        EX0=1;//外部中斷0開

        EX1=1;//外部中斷1開

        /*默認低電平觸發*/

        while(1);//死循環 防止跑飛

        }

        6、單片機,下面這段程序不知道為什么只進一次中斷,就沒有反應了呢?

        #include // 包含51單片機寄存器定義的頭文件

        #define uint unsigned int

        sbit key1=P1^4;

        sbit key2=P1^5;

        void delay1ms(uint i)

        {

        uchar j;

        while(i--)

        {

        for(j=0;j125;j++) //1ms基準延時程序

        {

        ;

        }

        }

        }

        void init()

        {

        EA=1; //開總中斷

        ES=1; //開串口中斷

        TMOD= 0x21; //定時器1定時方式2,定時器1工作于8位自動重載模式, 用于產生波特率

        SCON = 0x50; // 設定串行口工作方式1 允許接收

        TH0=(65536-50000)/256;

        TL0=(65536-50000)%256;

        TH1= 0xfd; //11.0592M 波特率9600

        TL1= 0xfd;

        PCON =0x00; // 波特率不倍增

        TR1= 1; //啟動定時器T1

        TR0=1; //啟動定時器T0

        ET0=1; //打開T0中斷

        }

        void key()

        {

        if(key2==0)

        P0=0x3f;

        delay1ms(5000);

        P0=0xf3;

        }

        void mainxh()

        {

        while(1)

        {

        key();

        P0=0x32;

        }

        }

        void keybreak()

        {

        P0=0xf1;

        delay1ms(5000);

        P0=0x1f;

        mainxh();

        }

        void main(void)

        {

        init();

        mainxh();

        }

        void Time0(void) interrupt 1

        {

        TH0=(65536-50000)/256; //定時器T0的高8位重新賦初值

        TL0=(65536-50000)%256; //定時器T0的高8位重新賦初值



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 原平市| 辽阳县| 大渡口区| 黄冈市| 茶陵县| 揭东县| 怀远县| 宜良县| 溧水县| 沂源县| 宜昌市| 乌鲁木齐县| 津市市| 镇远县| 平江县| 竹山县| 福建省| 邵武市| 临江市| 西吉县| 瑞丽市| 嘉鱼县| 闸北区| 卓尼县| 五指山市| 全州县| 安泽县| 阳朔县| 瓦房店市| 高密市| 云龙县| 高碑店市| 江孜县| 额尔古纳市| 双牌县| 延长县| 漾濞| 绥滨县| 武城县| 铜梁县| 建始县|