找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索

單片機(jī)外部中斷問題

查看數(shù): 1970 | 評(píng)論數(shù): 23 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請(qǐng)稍候......
發(fā)布時(shí)間: 2024-5-10 02:37

正文摘要:

void init(){         IT0=1;         EX0=1;         EA=1; } 就是每中斷一次從數(shù)組abc中取一個(gè)值給t for ...

回復(fù)

ID:1120208 發(fā)表于 2024-5-11 14:38
xiaobendan001 發(fā)表于 2024-5-10 10:30
樓主的中斷只是用來接收開關(guān)信號(hào)的,又不是定時(shí)器中斷,加點(diǎn)延時(shí)咋了?

只要是中斷,都是不建議有延時(shí)的,反正linux內(nèi)核的中斷是這樣的思想
ID:275826 發(fā)表于 2024-5-10 19:42
xjtong 發(fā)表于 2024-5-10 17:33
編譯一直沒問題,就是中斷是亂的。應(yīng)該是中斷重入的問題。

我用KEIL 4編譯你程序不過,修改下int0 通過,程序一切正常,沒有亂入問題
ID:299872 發(fā)表于 2024-5-10 17:49
就是用單片機(jī)操作續(xù)電器,續(xù)電器控制風(fēng)扇。

有一個(gè)2。4G雷達(dá),有運(yùn)動(dòng)就開風(fēng)扇,開的時(shí)間用延時(shí)控制。
中斷的作用是改變延時(shí)的時(shí)候,從而改變風(fēng)扇運(yùn)行的時(shí)候。

#include <STC8G.h>
#include <intrins.h>
#define u16 unsigned int
#define u8 unsigned char
       
sbit leda = P5^5;
sbit led = P5^4;
sbit fan = P3^3;

const unsigned int data abc[8]={0xea60,0xa410,0x8ca0,0x7530,0x4650,0x1770,0x0bb80,0x05dc};
u16 t;
u8 xu;

void Delay10ms(void)        //@11.0592MHz
{
        unsigned char data i, j;
        _nop_();_nop_();
        i = 144;
        j = 157;
        do
        {
                while (--j);
        } while (--i);
}

void dd(unsigned int tttt){
        while(tttt--)Delay10ms();
}

void init(){
        IT0=1;
        EX0=1;
        EA=1;
}

void int0() interrupt 0
{
        u8 i;
        if(!P32){
        for(i=0;i<xu;i++){
                led=1;dd(20);
                led=0;dd(20);
        }
        t=abc[xu++];
        xu &=0x07;
        }
}

void main(){
        u16 tt;
        P5M0 &= ~0x30; //P54雙向口,P55高阻
        P5M1 = (P5M1 & ~0x10) | 0x20;
        P3M0 = (P3M0 & ~0x04) | 0x08; //P33 推挽
        P3M1 &= ~0x0c;
        P3PU |= 0x04; //P3.2上拉開打
        init();
        led=0;
        while(1){
                if(leda)tt=t;   //5min
                led=leda;
                if(tt){tt--;fan=1;Delay10ms();} else {fan=0;}
        }
}


這樣基本就沒問題的。就是中斷重入的問題。開始LED閃爍明顯不對(duì),F(xiàn)在一切正常了。
ID:883242 發(fā)表于 2024-5-10 17:39
xjtong 發(fā)表于 2024-5-10 14:28
你說對(duì)了。
我覺得是抖動(dòng)的問題,所以在中斷是把EA關(guān)了呀。
在中斷里延時(shí)也是怕抖動(dòng)的問題。

再發(fā)生中斷會(huì)掛起pending,退出中斷處理程序后會(huì)再次進(jìn)入中斷處理程序。
ID:1109793 發(fā)表于 2024-5-10 17:37
不關(guān)是不是重復(fù)中斷,這樣延時(shí)的閃爍都應(yīng)該正常才對(duì)啊,先軟件模擬一下看看那些變量都是多少
ID:299872 發(fā)表于 2024-5-10 17:34
npn 發(fā)表于 2024-5-10 15:39
外部中斷接的是什么? 如果是按鍵需要消抖處理。

恩,直接用杜邦線點(diǎn)GND,按鍵都省了。
ID:299872 發(fā)表于 2024-5-10 17:33
tyrl800 發(fā)表于 2024-5-10 15:30
都說了編譯通不過呀

編譯一直沒問題,就是中斷是亂的。應(yīng)該是中斷重入的問題。
ID:299872 發(fā)表于 2024-5-10 17:29
問題解決了。
void int0() interrupt 0
{
        u8 i;
        if(!P32){
        for(i=0;i<xu;i++){
                led=1;dd(20);
                led=0;dd(20);
        }
        t=abc[xu++];
        xu &=0x07;
        }
}


這樣就好了。
ID:57657 發(fā)表于 2024-5-10 15:39
外部中斷接的是什么? 如果是按鍵需要消抖處理。
ID:275826 發(fā)表于 2024-5-10 15:30
都說了編譯通不過呀
ID:161164 發(fā)表于 2024-5-10 14:43
xjtong 發(fā)表于 2024-5-10 14:28
你說對(duì)了。
我覺得是抖動(dòng)的問題,所以在中斷是把EA關(guān)了呀。
在中斷里延時(shí)也是怕抖動(dòng)的問題。

"中斷里的程序還沒處理完又發(fā)生中斷"
單片機(jī)會(huì)繼續(xù)運(yùn)行中斷函數(shù)
直到運(yùn)行完畢跳出中斷函數(shù)
單片機(jī)會(huì)立刻再次運(yùn)行中斷函數(shù)
ID:299872 發(fā)表于 2024-5-10 14:29
Longan.Wang 發(fā)表于 2024-5-10 09:57
編程技巧先不說,延時(shí)短了,眼睛根本看不到閃

一次是10ms,20次是200ms
ID:299872 發(fā)表于 2024-5-10 14:28
lkc8210 發(fā)表于 2024-5-10 13:06
沒電路圖盲猜按鍵接中斷
你沒加按鍵消抖,并在中斷里延時(shí)了
于是中斷在延時(shí)期間收到抖動(dòng)信號(hào),誤判了

你說對(duì)了。
我覺得是抖動(dòng)的問題,所以在中斷是把EA關(guān)了呀。
在中斷里延時(shí)也是怕抖動(dòng)的問題。

重點(diǎn)是有一個(gè)邏輯我沒弄明白。比如中斷里的程序還沒處理為又發(fā)生中斷,這時(shí)單片機(jī)怎么處理,是直接無視,還是排對(duì)處理呀???
ID:161164 發(fā)表于 2024-5-10 13:26

ID:161164 發(fā)表于 2024-5-10 13:06
沒電路圖盲猜按鍵接中斷
你沒加按鍵消抖,并在中斷里延時(shí)了
于是中斷在延時(shí)期間收到抖動(dòng)信號(hào),誤判了
反復(fù)進(jìn)入中斷
ID:1109793 發(fā)表于 2024-5-10 10:30
lightday 發(fā)表于 2024-5-10 09:35
中斷程序加延時(shí)是大忌,完全偏離中斷的意義。
可以在中斷里改變閃爍次數(shù)變量,然后在主程序里實(shí)現(xiàn)閃爍。

樓主的中斷只是用來接收開關(guān)信號(hào)的,又不是定時(shí)器中斷,加點(diǎn)延時(shí)咋了?
ID:1109793 發(fā)表于 2024-5-10 10:29
cy009 發(fā)表于 2024-5-10 09:28
EA放在中斷函數(shù)里不科學(xué)吧!

有啥不科學(xué)的?
ID:77589 發(fā)表于 2024-5-10 09:57
編程技巧先不說,延時(shí)短了,眼睛根本看不到閃
ID:275826 發(fā)表于 2024-5-10 09:38
編譯沒通過吧
ID:607298 發(fā)表于 2024-5-10 09:35
中斷程序加延時(shí)是大忌,完全偏離中斷的意義。
可以在中斷里改變閃爍次數(shù)變量,然后在主程序里實(shí)現(xiàn)閃爍。
ID:619259 發(fā)表于 2024-5-10 09:28
EA放在中斷函數(shù)里不科學(xué)吧!
ID:1109793 發(fā)表于 2024-5-10 08:25
中斷觸發(fā)方式呢?

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表