久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1826|回復: 23
打印 上一主題 下一主題
收起左側

單片機外部中斷問題

[復制鏈接]
跳轉到指定樓層
樓主

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

就是每中斷一次從數組abc中取一個值給t
for循環是讀xu的值,值是多少led閃幾下,
發現LED閃的不對呀,按理來說,中斷一次led多閃一次,但實際不是,

用的P32的外部中斷0,這個需要上拉或下拉嗎????
P3PU |= 0x04;
這個內部上拉,用和不用,都沒作用。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1109793 發表于 2024-5-10 08:25 | 只看該作者
中斷觸發方式呢?
回復

使用道具 舉報

板凳
ID:619259 發表于 2024-5-10 09:28 | 只看該作者
EA放在中斷函數里不科學吧!
回復

使用道具 舉報

地板
ID:607298 發表于 2024-5-10 09:35 | 只看該作者
中斷程序加延時是大忌,完全偏離中斷的意義。
可以在中斷里改變閃爍次數變量,然后在主程序里實現閃爍。
回復

使用道具 舉報

5#
ID:275826 發表于 2024-5-10 09:38 | 只看該作者
編譯沒通過吧
回復

使用道具 舉報

6#
ID:77589 發表于 2024-5-10 09:57 | 只看該作者
編程技巧先不說,延時短了,眼睛根本看不到閃
回復

使用道具 舉報

7#
ID:1109793 發表于 2024-5-10 10:29 | 只看該作者
cy009 發表于 2024-5-10 09:28
EA放在中斷函數里不科學吧!

有啥不科學的?
回復

使用道具 舉報

8#
ID:1109793 發表于 2024-5-10 10:30 | 只看該作者
lightday 發表于 2024-5-10 09:35
中斷程序加延時是大忌,完全偏離中斷的意義。
可以在中斷里改變閃爍次數變量,然后在主程序里實現閃爍。

樓主的中斷只是用來接收開關信號的,又不是定時器中斷,加點延時咋了?
回復

使用道具 舉報

9#
ID:161164 發表于 2024-5-10 13:06 | 只看該作者
沒電路圖盲猜按鍵接中斷
你沒加按鍵消抖,并在中斷里延時了
于是中斷在延時期間收到抖動信號,誤判了
反復進入中斷
回復

使用道具 舉報

10#
ID:161164 發表于 2024-5-10 13:26 | 只看該作者

回復

使用道具 舉報

11#
ID:299872 發表于 2024-5-10 14:28 | 只看該作者
lkc8210 發表于 2024-5-10 13:06
沒電路圖盲猜按鍵接中斷
你沒加按鍵消抖,并在中斷里延時了
于是中斷在延時期間收到抖動信號,誤判了

你說對了。
我覺得是抖動的問題,所以在中斷是把EA關了呀。
在中斷里延時也是怕抖動的問題。

重點是有一個邏輯我沒弄明白。比如中斷里的程序還沒處理為又發生中斷,這時單片機怎么處理,是直接無視,還是排對處理呀???
回復

使用道具 舉報

12#
ID:299872 發表于 2024-5-10 14:29 | 只看該作者
Longan.Wang 發表于 2024-5-10 09:57
編程技巧先不說,延時短了,眼睛根本看不到閃

一次是10ms,20次是200ms
回復

使用道具 舉報

13#
ID:299872 發表于 2024-5-10 14:36 | 只看該作者

應該就是這個問題,
所以我關EA,開EA,加延時。
看樣子加延時是沒用的。
開關EA也不行,那應該怎么處理呀??

drrteet.JPG (57.07 KB, 下載次數: 36)

drrteet.JPG
回復

使用道具 舉報

14#
ID:161164 發表于 2024-5-10 14:43 | 只看該作者
xjtong 發表于 2024-5-10 14:28
你說對了。
我覺得是抖動的問題,所以在中斷是把EA關了呀。
在中斷里延時也是怕抖動的問題。

"中斷里的程序還沒處理完又發生中斷"
單片機會繼續運行中斷函數
直到運行完畢跳出中斷函數
單片機會立刻再次運行中斷函數
回復

使用道具 舉報

15#
ID:275826 發表于 2024-5-10 15:30 | 只看該作者
都說了編譯通不過呀
回復

使用道具 舉報

16#
ID:57657 發表于 2024-5-10 15:39 | 只看該作者
外部中斷接的是什么? 如果是按鍵需要消抖處理。
回復

使用道具 舉報

17#
ID:299872 發表于 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;
        }
}


這樣就好了。
回復

使用道具 舉報

18#
ID:299872 發表于 2024-5-10 17:33 | 只看該作者
tyrl800 發表于 2024-5-10 15:30
都說了編譯通不過呀

編譯一直沒問題,就是中斷是亂的。應該是中斷重入的問題。
回復

使用道具 舉報

19#
ID:299872 發表于 2024-5-10 17:34 | 只看該作者
npn 發表于 2024-5-10 15:39
外部中斷接的是什么? 如果是按鍵需要消抖處理。

恩,直接用杜邦線點GND,按鍵都省了。
回復

使用道具 舉報

20#
ID:1109793 發表于 2024-5-10 17:37 | 只看該作者
不關是不是重復中斷,這樣延時的閃爍都應該正常才對啊,先軟件模擬一下看看那些變量都是多少
回復

使用道具 舉報

21#
ID:883242 發表于 2024-5-10 17:39 | 只看該作者
xjtong 發表于 2024-5-10 14:28
你說對了。
我覺得是抖動的問題,所以在中斷是把EA關了呀。
在中斷里延時也是怕抖動的問題。

再發生中斷會掛起pending,退出中斷處理程序后會再次進入中斷處理程序。
回復

使用道具 舉報

22#
ID:299872 發表于 2024-5-10 17:49 | 只看該作者
就是用單片機操作續電器,續電器控制風扇。

有一個2。4G雷達,有運動就開風扇,開的時間用延時控制。
中斷的作用是改變延時的時候,從而改變風扇運行的時候。

#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閃爍明顯不對。現在一切正常了。
回復

使用道具 舉報

23#
ID:275826 發表于 2024-5-10 19:42 | 只看該作者
xjtong 發表于 2024-5-10 17:33
編譯一直沒問題,就是中斷是亂的。應該是中斷重入的問題。

我用KEIL 4編譯你程序不過,修改下int0 通過,程序一切正常,沒有亂入問題
回復

使用道具 舉報

24#
ID:1120208 發表于 2024-5-11 14:38 | 只看該作者
xiaobendan001 發表于 2024-5-10 10:30
樓主的中斷只是用來接收開關信號的,又不是定時器中斷,加點延時咋了?

只要是中斷,都是不建議有延時的,反正linux內核的中斷是這樣的思想
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩国产在线 | 黄色大片在线播放 | 精品一区国产 | 欧美视频精品 | 欧美福利一区 | 一级毛片大全免费播放 | 国产精品一区二区av | 国产亚洲精品久久久久动 | 免费视频一区二区 | 少妇一级淫片免费放播放 | 精品不卡 | 久久久久久久91 | 亚洲免费在线视频 | 一区二区在线不卡 | 免费在线看黄 | 欧美日韩国产一区二区三区 | 波多野结衣中文字幕一区二区三区 | 色精品视频 | 看片国产| 一级毛片免费 | 日韩国产精品一区二区三区 | 91视频18| www免费视频 | 日本三级电影免费观看 | 欧美日韩国产中文 | 亚洲精品91 | 日本三级电影在线观看视频 | 亚洲 成人 av | 欧美日韩在线视频一区 | 精品免费国产一区二区三区四区介绍 | 在线播放中文字幕 | 亚洲综合久久精品 | 成人在线精品 | 手机在线观看 | 国产乱码久久久久久 | 国产精品亚洲综合 | 国产欧美一区二区三区久久手机版 | 九九热在线视频观看这里只有精品 | 99免费精品视频 | 影音先锋中文字幕在线观看 | 国产精品久久九九 |