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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2593|回復: 11
收起左側

51單片機定時器中斷和外部中斷同時使用為什么一定要設置優先級

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

14、按鍵換擋模仿產品控制板.rar

32.03 KB, 下載次數: 8

程序文件

普中-2&普中-3&普中-4開發板原理圖.pdf

151.73 KB, 下載次數: 4

原理圖

回復

使用道具 舉報

ID:404160 發表于 2023-9-11 21:22 | 顯示全部樓層
由于處理中斷的運算器只有一個,同一時間只能運行一段程序,當中斷同時到達時,你說先處理(運算)哪個中斷程序?所有需要優先級。由于你PWM中斷“太快”,搶占了按鍵中斷需求,所以,一直來不及響應按鍵

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:213173 發表于 2023-9-12 11:48 | 顯示全部樓層
你這不是中斷優先級的問題,是程序結構的問題,給你改了,你試試。
  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. }       
復制代碼
回復

使用道具 舉報

ID:1034262 發表于 2023-9-12 15:18 | 顯示全部樓層
合理安排中斷程序,一般不需要用優先級(更沒聽說一定要設置優先級),有些項目程序用了10來個中斷,沒那么多中斷優先級。
回復

使用道具 舉報

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

但是不應該是有中斷申請,應該執行完正在執行的中斷程序后,再回過來執行外部中斷嗎?
我試過了,確實PWM太快了,把定時器中斷的時間調長一點就可以了
回復

使用道具 舉報

ID:1091094 發表于 2023-9-14 22:24 | 顯示全部樓層
wulin 發表于 2023-9-12 11:48
你這不是中斷優先級的問題,是程序結構的問題,給你改了,你試試。

你這個是沒有用外部中斷了,直接while(1)循環里面,檢測按鍵。
我是想看看用外部中斷和定時器中斷來實現會不會有什么問題。
確實是定時器中斷不能太快,要不然外部中斷就沒反應了,但是不知道具體原因。
回復

使用道具 舉報

ID:647261 發表于 2023-9-15 09:04 | 顯示全部樓層
3038838599 發表于 2023-9-14 22:24
你這個是沒有用外部中斷了,直接while(1)循環里面,檢測按鍵。
我是想看看用外部中斷和定時器中斷來實現 ...

我記得好像回過這個貼子,詳細說明了原因,但是不知道是不是給論壇吃掉了貼了。。。。。。
回復

使用道具 舉報

ID:647261 發表于 2023-9-15 09:06 | 顯示全部樓層
3038838599 發表于 2023-9-14 22:24
你這個是沒有用外部中斷了,直接while(1)循環里面,檢測按鍵。
我是想看看用外部中斷和定時器中斷來實現 ...

查看了回帖記錄,原來是你發了兩個一樣的帖子,我把內容復制過來了


51單片機的中斷規則:
不設置優先級時,中斷源都是一個優先級,規則如下:
1.哪個中斷先到,就先執行哪個中斷。
2.中斷執行過程中,不能被其他中斷打斷。
3.多個中斷同時到來時,按查詢號順序執行。
查詢號順序:外部中斷0(P3.2腳)-> 定時器 0 -> 外部中斷1(P3.3腳) -> 定時器 1 -> 串口

假如按鍵是P3.2腳,定時器10us
要實現按鍵功能,就必須在10us的間隙中,完成按鍵下降沿的觸發動作,才能進入外部中斷
假如按鍵是P3.3腳,定時器是T0的話,難度就更大了,這個觸發動作還不能剛好和10us時間同時產生

當設置了優先級后,中斷就分成了高優先級和低優先級兩種了,這時,規則多了一樣:
低優先級的中斷執行過程中,高優先級中斷產生,可以打斷低優先級中斷,實現中斷嵌套。
回復

使用道具 舉報

ID:1092335 發表于 2023-9-20 16:56 | 顯示全部樓層
因為CPU只能同時處理一個中斷
回復

使用道具 舉報

ID:811253 發表于 2023-9-21 23:28 | 顯示全部樓層
外部中斷0應該是默認優先級最高的吧
回復

使用道具 舉報

ID:647261 發表于 2023-9-22 09:11 | 顯示全部樓層
青草麥田 發表于 2023-9-21 23:28
外部中斷0應該是默認優先級最高的吧

不是的,默認是同一優先級,只是查詢順序最高
意思是,幾個中斷在同一時間觸發,外部中斷0先進中斷
如果其他中斷剛好比外部中斷快那么一丁點,外部中斷0就只能等其他中斷完成后,再看中斷觸發還在不在,不在的話也是不能進的
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 最新日韩在线 | 成人av鲁丝片一区二区小说 | 狠狠涩 | 色综合久久久久 | 日韩在线 | 欧美一区二区三区 | 一级黄色片一级黄色片 | 亚洲品质自拍视频 | 91av在线免费播放 | 精品综合视频 | 久久精品国产一区二区电影 | 国产精品成人一区二区三区夜夜夜 | 亚洲精品久久久久中文字幕欢迎你 | 国产精品高潮呻吟久久av野狼 | 国产69精品久久99不卡免费版 | 精产国产伦理一二三区 | 91视频在线 | av网站免费在线观看 | 99re视频| 国产精品毛片一区二区三区 | 国产福利视频 | 日韩影院在线观看 | 一区二区不卡视频 | 久久香蕉精品视频 | 中文字幕av亚洲精品一部二部 | 日韩免费高清视频 | 亚洲精品一区二区三区中文字幕 | 欧美一级欧美三级在线观看 | 久久亚洲国产精品日日av夜夜 | 成人午夜视频在线观看 | 国产精品国产精品 | 亚洲国产欧美日韩 | 亚洲不卡在线观看 | 一级毛片在线播放 | 免费黄色av网站 | 天天操人人干 | 一区欧美 | 成人久久网 | 在线视频成人 | 99久久婷婷国产综合精品电影 | 成人 在线 |