新聞中心

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

單片機中斷問題30例

作者: 時間:2013-05-07 來源:網(wǎng)絡 收藏

d7=0;

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

d7=1;

}

答:

IT0=0;//低電平觸發(fā),只要監(jiān)測到是低電平,就觸發(fā)中斷

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

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

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

4、我的這個程序為什么不能完全執(zhí)行整個程序誰能告訴我!就是沒法執(zhí)行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

我是想執(zhí)行完流水燈亮.就然后執(zhí)行全亮全暗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的數(shù)碼管亮和滅,一定keil C

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

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

#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為低電平出發(fā)*/

#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;//中斷總開關(guān)

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

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

/*默認低電平觸發(fā)*/

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

}

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位自動重載模式, 用于產(chǎn)生波特率

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位重新賦初值



關(guān)鍵詞: 單片機 中斷問題 INT0信號

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉