我看8051使用keil C書籍,上面寫著中斷宣告的用法為
void 中斷函數名稱(void) interrupt 中斷型號 using 暫存器
而interrupt的型號為
0 外部中斷0
1 計時/計數0
2 外部中斷1
3 計時/計數1
4 串列埠
而當我在做外部中斷的實驗時,一個外部中斷的實驗還有成功
但要做二個外部中斷的實驗時就出現問題了!
以下是我做二個外部中斷的程式,是課本的範例程式
這個程式因為是有二個中斷源所以有二個中斷服務程式
因為是外部中斷0和外部中斷1所以中斷型號分別為interrupb 0跟 interrupt2
但這個程式編譯出來的.hex檔載入燒入暫存區時,使用空間竟然只有1F
很明顯的有錯誤存在,我將這個.hex檔燒入晶片,當然是無法正常動作
但我試著將interrupt 0,改成interrupt 1
此時程式的中斷服務程式的中斷型號分別為 1 跟 2
很神奇的,編譯出來的.hex檔燒入晶片後,竟然可以動作了
而且動作就如程式寫的一樣led左旋和右旋。
我不懂的是interrupt 1不是給計時/計數0這個中斷源用的嗎
為什麼我改成1卻變成可以給外部中斷源用了
我看了二本書做比較,程式也看了好幾次
真的不知道問題出在哪裡,特地上此論壇請教大家
請知道的人指導我一下好嗎???謝謝你
感謝你的指教
電機初學者 ipis
/* int2.c test int0 int1 */
#include <reg51.h>
sbit wled = P3^7;
/*-----------------------------------*/
delay(int d)
{
int i, j;
for(i=0; i<d; i++)
for(j=0; j<200; j++) ;
}
/*-----------------------------------*/
led_bl()
{
int i;
for(i=0; i<2; i++)
{
wled=0; delay(50);
wled=1; delay(50);
}
}
/*-----------------------------------*/
void ex0_int(void) interrupt 0
{
char i;
unsigned char c;
P1=0xff;
delay(100);
c=0x80; /* 1000 0000 */
for(i=0; i<8; i++)
{
P1=~c;
delay(100);
c=c>>1;
}
}
/*---------------------------------*/
void ex1_int(void) interrupt 2
{
char i;
unsigned char c;
P1=0xff;
delay(100);
c=1; /* 0000 0001 */
for(i=0; i<8; i++)
{
P1=~c;
delay(100);
c=c<<1;
}
}
/*---------------------------------*/
main()
{
unsigned char d;
led_bl();
TCON=0x04;
IE=0x85;
IP=0x01;
d=0;
while(1)
{
P1=d;
delay(100);
d=~d;
}
}