線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1839
推到 Plurk!
推到 Facebook!

8051中斷後動作異常

答題得分者是:taishyang
van83619
一般會員


發表:4
回覆:7
積分:2
註冊:2012-10-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-04-25 22:35:44 IP:118.232.xxx.xxx 訂閱
各位大大好
小弟最近在做8051中斷控制的練習
用紅綠燈的誠是在額外加一個中斷控制
配置如圖(一)
中斷是INT0



下面三個端子的電路圖(二)
圖中PB的部分改成紅色電線另做控制

動作是
當中斷後假如是遇到 "直向綠燈 橫向紅燈"
則按下P1.0使燈號改成 "直向紅燈 橫向綠燈"

遇到"直向紅燈 橫向綠燈"
則按下P1.1使燈號改成"直向綠燈 橫向紅燈"

小弟遇到的問題是中斷後按下P1.0直向變為紅燈後紅燈又馬上跳掉
按下P1.1橫向變為紅燈後紅燈又馬上跳掉
下方網址影片為小弟所錄
http://youtu.be/p-_XW0Fyy6c
20秒開始中斷然後控制P1.0
30~32秒為所遇到的問題
40秒是第二次中斷然後控制P1.1
54~56為所遇到的問題

下面是我的程式碼
#pragma oe db pw(80) SM SB CD
#include
#define LED P0 //定義LED接至P0
#define PB P1 //定義按鈕開關接至P1
void delay1ms(int) ; //宣告延遲函數
void debouncer(void) ; //防彈跳副程式
main()
{
int i;
IE=0x81;
for(;;)
{
P0 = 0x21; //左右向綠燈:前向紅燈
for(i=0;i<10;i )
{
delay1ms(500) ;
}
for(i=0;i<4;i )
{
if((i&1)==1)
{
P0 = 0x01;
}
else
{
P0 = 0x11; //左右向閃黃燈,前向綠燈
}
delay1ms(1000) ;
}
P0 = 0x0c; // 左右向紅燈 :直向綠燈
for(i=0;i<10;i )
{
delay1ms(500) ;
}
for(i=0;i<4;i )
{
if((i&1)==1)
{
P0 = 0x08;
}
else
{
P0 = 0x0a;
}
delay1ms(1000) ;
}
}
}
void my_int0(void) interrupt 0 //中斷副程式----- 手動---------
{
int i;
PB = 0xff;
switch(~PB)
{
case 0x01: //P1.0
{
unsigned saveLED=LED;
debouncer();
P0 = 0x0a;
for(i=0;i<10;i )
{
delay1ms(500) ;
}
for(i=0;i<4;i )
{
if((i&1)==1)
{
P0 = 0x08;
}
else
{
P0 = 0x0a; //左右向閃黃燈,前向綠燈
}
delay1ms(1000) ;
}
P0 = 0x21;
debouncer();
LED=saveLED;
break;
}
case 0x02: //P1.1
{
unsigned saveLED=LED;
debouncer();
P0=0x11;
for(i=0;i<10;i )
{
delay1ms(500) ;
}
for(i=0;i<4;i )
{
if((i&1)==1)
{
P0 = 0x01;
}
else
{
P0 = 0x11; //左右向閃黃燈,前向綠燈
}
delay1ms(1000) ;
}
P0=0x0c;
debouncer();
LED=saveLED;
break;
}
}
}
// 延遲副程式 1ms
void delay1ms(int x)
{
int a,b;
for(a=0;a
for(b=0;b<120;b );
}
//防彈跳副程式
void debouncer(void)
{
int i;
for(i=0;i<2400;i ) ;
}
編輯記錄
van83619 重新編輯於 2014-04-26 00:25:04, 註解 無‧
van83619 重新編輯於 2014-04-26 00:25:05, 註解 無‧
van83619 重新編輯於 2014-04-26 14:39:55, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5486
積分:4552
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-04-28 10:11:22 IP:60.251.xxx.xxx 訂閱
1.通常在中斷中不會使用delay
而是記錄狀態後回到主程式後依照紀錄的狀態改變行為

2.若程式RUN到delay1ms,此時發生中斷,中斷裡面又呼叫delay1ms,應該會出問題的

底層的原因同下面連結
http://delphi.ktop.com.tw/board.php?cid=173&fid=1167&tid=96734
若用C寫的話可以用關鍵字[using]避開同BANK R0~R7相衝的問題
編輯記錄
taishyang 重新編輯於 2014-04-28 10:25:24, 註解 無‧
taishyang 重新編輯於 2014-04-28 10:30:12, 註解 無‧
van83619
一般會員


發表:4
回覆:7
積分:2
註冊:2012-10-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-04-29 21:47:45 IP:118.232.xxx.xxx 訂閱
感謝大大提示
系統時間:2017-12-16 17:16:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!