8051使用keil C該怎麼宣告中斷呢?

我們生活周遭存在太多太多的 embedded system ,過去 embedded system 有專屬的 OS,現在 linux 也可以應用在嵌入式環境,不過本版將廣泛討論所有嵌入式系統不只 linux 喔,歡迎有這方面經驗或有興趣的朋友一同進來討論。

版主: chester

8051使用keil C該怎麼宣告中斷呢?

文章ipis » 週五 10月 07, 2005 4:40 pm

我看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;
}
}
IPIS
ipis
可愛的小學生
可愛的小學生
 
文章: 12
註冊時間: 週四 10月 06, 2005 1:17 pm
來自: 南投

文章訪客 » 週五 10月 07, 2005 10:37 pm

==> TCON=0x05; ==> EX0 AND EX1 邊緣觸發
:mrgreen:
訪客
 

文章test » 週二 1月 10, 2006 1:52 am

你燒錄的程式要去抓新的
我也有過這個問題
test
 

文章訪客 » 週五 4月 07, 2006 1:40 am

:-) :-( :-( :-( :-(
訪客
 


回到 embedded system

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客

cron