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

QQ登錄

只需一步,快速開始

搜索
查看: 2745|回復(fù): 11
收起左側(cè)

51單片機(jī)定時(shí)器中斷和外部中斷同時(shí)使用為什么一定要設(shè)置優(yōu)先級(jí)

[復(fù)制鏈接]
ID:1091094 發(fā)表于 2023-9-11 08:59 | 顯示全部樓層 |閱讀模式
我在使用普中51單片機(jī)開發(fā)板,設(shè)置了定時(shí)器10us執(zhí)行一次PWM,還有外部中斷0的程序,不設(shè)置外部中斷為高優(yōu)先級(jí)的時(shí)候,
程序是按鍵沒(méi)有反應(yīng)的。 加上優(yōu)先級(jí)就可以了按鍵控制三個(gè)擋位了,為什么?
不應(yīng)該是即使沒(méi)有優(yōu)先級(jí)也可以執(zhí)行外部中斷的嗎?

14、按鍵換擋模仿產(chǎn)品控制板.rar

32.03 KB, 下載次數(shù): 8

程序文件

普中-2&普中-3&普中-4開發(fā)板原理圖.pdf

151.73 KB, 下載次數(shù): 4

原理圖

回復(fù)

使用道具 舉報(bào)

ID:404160 發(fā)表于 2023-9-11 21:22 | 顯示全部樓層
由于處理中斷的運(yùn)算器只有一個(gè),同一時(shí)間只能運(yùn)行一段程序,當(dāng)中斷同時(shí)到達(dá)時(shí),你說(shuō)先處理(運(yùn)算)哪個(gè)中斷程序?所有需要優(yōu)先級(jí)。由于你PWM中斷“太快”,搶占了按鍵中斷需求,所以,一直來(lái)不及響應(yīng)按鍵

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2023-9-12 11:48 | 顯示全部樓層
你這不是中斷優(yōu)先級(jí)的問(wèn)題,是程序結(jié)構(gòu)的問(wèn)題,給你改了,你試試。
  1. #include <reg52.h>

  2. #define u8 unsigned char
  3. #define u16 unsigned int

  4. sbit PWM  = P2^1;
  5. sbit KEY4 = P3^3;
  6. sbit led1 = P2^5;
  7. sbit led2 = P2^6;
  8. sbit led3 = P2^7;


  9. u8 mode = 0;
  10. u8 gduty;

  11. void InitTimer0(void)
  12. {
  13.         TMOD = 0x01;
  14.         TH0 = 0xFC;
  15.         TL0 = 0x18;
  16.         EA = 1;
  17.         ET0 = 1;
  18.         TR0 = 1;
  19. }

  20. void Delay_ms(u16 t)
  21. {
  22.         u16 i,j;
  23.         for(i=t;i>0;i--)
  24.                 for(j=110;j>0;j--);
  25. }


  26. void main()
  27. {
  28.         InitTimer0();
  29.         while(1)
  30.         {       
  31.                 if(!KEY4)
  32.                 {
  33.                         Delay_ms(10);
  34.                         if(!KEY4)
  35.                         {
  36.                                 mode = ++mode%4;
  37.                                 switch(mode)
  38.                                 {
  39.                                         case 0: led1=1;led2=1;led3=1;gduty=0;break;//占空比%100
  40.                                         case 1: led1=0;led2=0;led3=0;gduty=2;break;//占空比%50
  41.                                         case 2: led1=0;led2=0;led3=1;gduty=3;break;//占空比%25
  42.                                         case 3: led1=0;led2=1;led3=1;gduty=4;break;//占空比%0
  43.                                 }
  44.                                 while(!KEY4);
  45.                         }
  46.                 }
  47.         }
  48. }

  49. void Timer0Interrupt(void) interrupt 1
  50. {
  51.         static u8 time = 0;
  52.         TH0 = 0xFC;
  53.         TL0 = 0x18;
  54.         time++;
  55.         if(time >= 4)
  56.                 time = 0;
  57.         if(time >= gduty)  //占空比
  58.                 PWM = 0;
  59.         else
  60.                 PWM = 1;
  61. }       
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:1034262 發(fā)表于 2023-9-12 15:18 | 顯示全部樓層
合理安排中斷程序,一般不需要用優(yōu)先級(jí)(更沒(méi)聽說(shuō)一定要設(shè)置優(yōu)先級(jí)),有些項(xiàng)目程序用了10來(lái)個(gè)中斷,沒(méi)那么多中斷優(yōu)先級(jí)。
回復(fù)

使用道具 舉報(bào)

ID:1091094 發(fā)表于 2023-9-14 22:15 | 顯示全部樓層
飛云居士 發(fā)表于 2023-9-11 21:22
由于處理中斷的運(yùn)算器只有一個(gè),同一時(shí)間只能運(yùn)行一段程序,當(dāng)中斷同時(shí)到達(dá)時(shí),你說(shuō)先處理(運(yùn)算)哪個(gè)中斷 ...

但是不應(yīng)該是有中斷申請(qǐng),應(yīng)該執(zhí)行完正在執(zhí)行的中斷程序后,再回過(guò)來(lái)執(zhí)行外部中斷嗎?
我試過(guò)了,確實(shí)PWM太快了,把定時(shí)器中斷的時(shí)間調(diào)長(zhǎng)一點(diǎn)就可以了
回復(fù)

使用道具 舉報(bào)

ID:1091094 發(fā)表于 2023-9-14 22:24 | 顯示全部樓層
wulin 發(fā)表于 2023-9-12 11:48
你這不是中斷優(yōu)先級(jí)的問(wèn)題,是程序結(jié)構(gòu)的問(wèn)題,給你改了,你試試。

你這個(gè)是沒(méi)有用外部中斷了,直接while(1)循環(huán)里面,檢測(cè)按鍵。
我是想看看用外部中斷和定時(shí)器中斷來(lái)實(shí)現(xiàn)會(huì)不會(huì)有什么問(wèn)題。
確實(shí)是定時(shí)器中斷不能太快,要不然外部中斷就沒(méi)反應(yīng)了,但是不知道具體原因。
回復(fù)

使用道具 舉報(bào)

ID:647261 發(fā)表于 2023-9-15 09:04 | 顯示全部樓層
3038838599 發(fā)表于 2023-9-14 22:24
你這個(gè)是沒(méi)有用外部中斷了,直接while(1)循環(huán)里面,檢測(cè)按鍵。
我是想看看用外部中斷和定時(shí)器中斷來(lái)實(shí)現(xiàn) ...

我記得好像回過(guò)這個(gè)貼子,詳細(xì)說(shuō)明了原因,但是不知道是不是給論壇吃掉了貼了。。。。。。
回復(fù)

使用道具 舉報(bào)

ID:647261 發(fā)表于 2023-9-15 09:06 | 顯示全部樓層
3038838599 發(fā)表于 2023-9-14 22:24
你這個(gè)是沒(méi)有用外部中斷了,直接while(1)循環(huán)里面,檢測(cè)按鍵。
我是想看看用外部中斷和定時(shí)器中斷來(lái)實(shí)現(xiàn) ...

查看了回帖記錄,原來(lái)是你發(fā)了兩個(gè)一樣的帖子,我把內(nèi)容復(fù)制過(guò)來(lái)了


51單片機(jī)的中斷規(guī)則:
不設(shè)置優(yōu)先級(jí)時(shí),中斷源都是一個(gè)優(yōu)先級(jí),規(guī)則如下:
1.哪個(gè)中斷先到,就先執(zhí)行哪個(gè)中斷。
2.中斷執(zhí)行過(guò)程中,不能被其他中斷打斷。
3.多個(gè)中斷同時(shí)到來(lái)時(shí),按查詢號(hào)順序執(zhí)行。
查詢號(hào)順序:外部中斷0(P3.2腳)-> 定時(shí)器 0 -> 外部中斷1(P3.3腳) -> 定時(shí)器 1 -> 串口

假如按鍵是P3.2腳,定時(shí)器10us
要實(shí)現(xiàn)按鍵功能,就必須在10us的間隙中,完成按鍵下降沿的觸發(fā)動(dòng)作,才能進(jìn)入外部中斷
假如按鍵是P3.3腳,定時(shí)器是T0的話,難度就更大了,這個(gè)觸發(fā)動(dòng)作還不能剛好和10us時(shí)間同時(shí)產(chǎn)生

當(dāng)設(shè)置了優(yōu)先級(jí)后,中斷就分成了高優(yōu)先級(jí)和低優(yōu)先級(jí)兩種了,這時(shí),規(guī)則多了一樣:
低優(yōu)先級(jí)的中斷執(zhí)行過(guò)程中,高優(yōu)先級(jí)中斷產(chǎn)生,可以打斷低優(yōu)先級(jí)中斷,實(shí)現(xiàn)中斷嵌套。
回復(fù)

使用道具 舉報(bào)

ID:1092335 發(fā)表于 2023-9-20 16:56 | 顯示全部樓層
因?yàn)镃PU只能同時(shí)處理一個(gè)中斷
回復(fù)

使用道具 舉報(bào)

ID:811253 發(fā)表于 2023-9-21 23:28 | 顯示全部樓層
外部中斷0應(yīng)該是默認(rèn)優(yōu)先級(jí)最高的吧
回復(fù)

使用道具 舉報(bào)

ID:647261 發(fā)表于 2023-9-22 09:11 | 顯示全部樓層
青草麥田 發(fā)表于 2023-9-21 23:28
外部中斷0應(yīng)該是默認(rèn)優(yōu)先級(jí)最高的吧

不是的,默認(rèn)是同一優(yōu)先級(jí),只是查詢順序最高
意思是,幾個(gè)中斷在同一時(shí)間觸發(fā),外部中斷0先進(jìn)中斷
如果其他中斷剛好比外部中斷快那么一丁點(diǎn),外部中斷0就只能等其他中斷完成后,再看中斷觸發(fā)還在不在,不在的話也是不能進(jìn)的
回復(fù)

使用道具 舉報(bào)

ID:1097455 發(fā)表于 2023-10-27 13:48 | 顯示全部樓層
程序里肯定有進(jìn)程很高的程序模塊是不能讓其它外設(shè)影響的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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