郭天翔51微控制器程式中斷程式陣列效應

發布 科技 2024-08-16
26個回答
  1. 匿名使用者2024-02-01

    我還用郭天翔的板子學了51。 根據您的問題和程式,中斷不使用陣列,它只計算 SHI 和 GE 變數。 然後 shi,ge 變數發生變化,這兩個變數的顯示在 main 函式中傳遞,同時引起數碼管的顯示發生變化。

    你說的刪除陣列是在顯示功能中將其刪除並直接更改為 p0=shi? 如果是這樣,就很容易解釋這個原因了:因為當不去掉的時候,p0就是通過shi變數在表陣列中查詢表來得到數碼管顯示資料,而0 9對應的十六進製資料按照0 9儲存在表陣列中, 每個都是固定的,並且 shi 和 ge 變數不屬於上述任何乙個固定資料,如果直接賦值,則無法正常顯示,而是亂碼。

    當然,如果我的問題不是你的問題,你可以隨時回覆我。

    我希望我的能幫助你。

  2. 匿名使用者2024-01-31

    親愛的,我怎麼不明白你的問題,看來你還沒有弄清楚定時中斷,或者你對鎖扣不太了解,多看郭老師的書,你就能明白了,如果你看不懂,就放棄學習微控制器吧,這些知識最多只能算是初學者的入門。 但我還是希望你好好學習。

    郭先生建議學生提出建議。

  3. 匿名使用者2024-01-30

    將程式**傳送過來。

  4. 匿名使用者2024-01-29

    程式中沒有 if(tt==20) 條件。

    是不是如果(tt==100),如果程式不跑掉,這肯定是真的,累計不會跳過100這個數字,你怎麼說呢? 如果你認為它不可靠,你可以把它改成if(tt>=100)。

  5. 匿名使用者2024-01-28

    在每個定時器 50ms 時間後,變數 t 加 1在迴圈程式中,t=20(1s)使數碼管顯示不同的數字。

  6. 匿名使用者2024-01-27

    其實就是中斷返回,當第一次中斷完成時,數碼管從原來的0變為1,然後程式返回while,也就是斷點,然後等待下乙個中斷請求,也就是50毫秒,當50毫秒到來時,再執行第二個中斷

  7. 匿名使用者2024-01-26

    死迴圈不是微控制器崩潰,而是它一直在這個迴圈中工作。 它的計時器也一直在工作的過程,從你的程式來看,雖然你的顯示屏在閃爍,但數字沒有變化,你就少了乙個{}應該。

    if(t==20)}

  8. 匿名使用者2024-01-25

    51、微控制器中斷分為外部中斷和內部定時器中斷,外部中斷是指在接收到外部中斷觸發訊號(中斷引腳電平變化)後,程式執行到相應的中斷服務程式進行執行,執行完成後返回之前執行的地方; 例如,如果定時器 0 設定為 10 ms,則每 10 ms 進入中斷服務程式。

  9. 匿名使用者2024-01-24

    啟用中斷後,程式會在中斷生成後自動跳轉到相應的中斷功能,所以你的燈閃爍,main 中的 while(1){} 是常規任務,中斷是意外事件還是未知事件。

    例如,如果你正在睡覺,有人打了你,你會醒來撿起**,撿起來玩**,然後繼續睡覺。

    這就是程式的全部內容,除了你的大腦在控制中,而程式在MCU的控制之下。

  10. 匿名使用者2024-01-23

    你的問題是你不明白中斷的含義。

    從字面上看,中斷意味著(當出現更緊急的事情時)停止手頭的事情並處理更緊急的事情。 在程式中,當條件為真時,它相當於停止正在執行的**(手頭的事情)並執行另一部分(更緊急的事情),但這個過程是由硬體自動完成的,而不是像通常呼叫函式那樣顯式呼叫它。

    如果你在程式中使用計時器 0(親眼看看計時器是如何工作的),那麼你只需要初始化計時器 0 並寫入函式 void exter() interrupt 1,當計時器 0 被中斷時,你要執行它。 當你啟動定時器 0 時,有點像在後台執行的程式,當它設定為 0 時,它會將對應的中斷標誌設定為 1,CPU 會不時檢測到這些中斷標誌,當發現某個標誌為 1 時,表示有中斷請求, CPU會自動進入相應的中斷服務程式。

  11. 匿名使用者2024-01-22

    立即關閉。

    當前程式繼續,但一旦退出,它就不能進入任何中斷處理程式。

  12. 匿名使用者2024-01-21

    讓我們為您談談。 當微控制器執行時,它會高速執行 while(1) 中的程式。 但這還不夠,例如,如果您想將訊號傳遞給微控制器以使其進行處理,例如:

    你按下某個鍵來控制某個燈的亮起,然後你需要乙個微控制器來響應你的動作,而響應的方式就是打斷。 也就是說,當你在主程式中完成乙個中斷觸發條件時,當達到這個條件時,程式會跳轉到中斷服務功能,然後在中斷服務功能中執行程式後返回主程式繼續迴圈。 你說的呼叫其實不太正確,中斷服務功能只能觸發,它是由微控制器中某些暫存器的標誌來控制的,當滿足這些觸發條件時,這些標誌被硬體設定為1,然後自動執行你寫的中斷服務功能。

    不是很清楚,請原諒,中斷是微控制器中最重要的功能之一,對應定時器(這是微控制器的核心),這些內容在51中非常簡單,但是在32位微控制器中就變得特別複雜了。

    希望這些能給你一些幫助。

  13. 匿名使用者2024-01-20

    理論上是可以的,在實踐中是可以的,但需要明確的是,中斷服務程式返回使用 RETI 指令,這與子程式返回的 ret 指令不同。

  14. 匿名使用者2024-01-19

    它可以直接呼叫,但這種中斷服務程式與普通的子程式沒有什麼不同。

  15. 匿名使用者2024-01-18

    呼叫是可以的,但如果有堆疊操作,它可能會破壞程式的執行。

    如果在主程式呼叫中斷程式時呼叫中斷,會發生什麼情況?

    C51 具有遞迴呼叫的函式。 但它也更大。 它似乎不划算,因為它占用了大量記憶體。

  16. 匿名使用者2024-01-17

    從理論上講,這很好,只要您充分利用儲存在堆疊中的返回位址並負責現場恢復即可。 事實上,作業系統中的搶占式多工處理也是如此。

    但是,我認為你應該找到一種方法來避免程式演算法的無休止迴圈,這才是正確的思維方式和方向。

    關於新增:直接 reti 必須返回定時器中斷的地方,但可以先從堆疊中彈出按下的定時器中斷的返回位址,並保護場景中按下的內容,這樣棧就會回到死迴圈中中斷的狀態(保證定時器中斷發生在死迴圈中, 否則會搞砸,可以通過標誌來判斷),然後你執行reti,相當於死迴圈中中斷的返回。

    其實還有一種更簡單的方法:進入無限迴圈,立即將 sp 儲存到記憶體變數中,定時器中斷確定發生了無限迴圈,然後將該變數的值恢復到 sp,然後執行 reti。 當然,這種方法要求中斷的服務程式是不可重入的,這對於微控制器來說一般不是問題。

  17. 匿名使用者2024-01-16

    進入乙個有無限迴圈的中斷是不對的,一定有出口,你的程式一定有問題,不能用定時器中斷關閉第乙個中斷,只能進入巢狀的中斷,每個中斷必須有乙個要返回的中斷,不能用其他的中斷返回上乙個。看門狗根本無法解決,不能每次進入中斷時都復位,或者重新做程式!!

  18. 匿名使用者2024-01-15

    是的,但你應該避免無限迴圈,你也可以從看門狗開始,它會在很長一段時間後復位微控制器而沒有響應。

  19. 匿名使用者2024-01-14

    只要將定時器中斷的優先順序更改為高,就可以實現此目的。 你試試看。 我隨口想了想。

    中斷優先順序控制暫存器是IP

  20. 匿名使用者2024-01-13

    難道沒有解釋嗎,不要動腦子,th0=(65536-50000) 256; 初始化,50ms

    如果發生高優先順序中斷,可以在不結束中斷的情況下再次中斷,這意味著中斷被中斷中斷。

  21. 匿名使用者2024-01-12

    程式結束後,如果有有效的中斷請求,可以立即進行中斷。

  22. 匿名使用者2024-01-11

    到 caoni() 50ms 進入中斷一次。

    中斷 20 次後,將燈更改為亮起。

  23. 匿名使用者2024-01-10

    大約需要一兩個小時。

  24. 匿名使用者2024-01-09

    上位機傳送,下位機接收,下位機接收中斷服務程式,判斷接收資料的正確性以及收貨是否完成。 需要簡單的通訊協議。 例如,將第乙個位元組定義為資料型別(單位元組陣列),將第二個位元組定義為陣列長度。

    三、四、......對於陣列資料,最後乙個位元組定義為校驗位元組(也可能不存在)。 如果要傳送的陣列是 a[7],那麼需要通過這個通訊協議總共傳送 10 個位元組。 假設你傳送的陣列的最大長度是 20(在所有條件下,如果長到幾百個,建議以子資料包的形式傳送),那麼你的資料包的最大長度是 23,你定義乙個長度為 23 的接收陣列,定義乙個接收位元組數的全域性變數計數器, 每次在下位機的接收程式中接收到它時,陣列指標+1,當計數器>2時,就可以開始判斷接收是否完成。

    volatile unsigned char counter;

    volatile unsigned char rxarray[30];

    void comrx(void)

    comrx() 可以在中斷中呼叫,但不能在中斷中呼叫,因為 return

    另外,請檢視您的 MCU 手冊,中斷標誌是否由您自己清除,或者您是否需要手動清潔。

  25. 匿名使用者2024-01-08

    推薦你借一本郭天翔51微控制器的書,寫得很詳細,絕對適合新手。

    您的程式使用定時器 0 在模式 1 下工作,th0=(65536-45872) 256;

    tl0=(65536-45872)%256;這是你的定時時間,一旦定時器時間到了,就會進入中斷程式執行,你不必擔心**中的中斷,總之,在執行完最後的中斷後,你會回到產生中斷的地方。 你應該定義的是 50ms,一秒進入中斷,重新載入初始值,重新開始定時,每 50 毫秒輸入一次中斷,使用 num++ 計數,當 num=20 時,即 50ms x 20=1s 當滿足 if 條件語句時,執行 led=led 表示小燈會亮。

    一秒鐘熄滅,一秒鐘熄滅。

  26. 匿名使用者2024-01-07

    num=0 ;這是為了將 num 清除為 0,以便下乙個週期計數;

    th0=(65536-45872) 256 這是th0的初始值,晶體振盪器定時為50ms,應該是46080而不是45872

    num++,即使執行一次,也相當於+1

相關回答
10個回答2024-08-16

首先,您必須開啟 Total Break EA

其次,開啟五個小中斷:et0、et1、es、int0、int1,一旦與中斷對應的介面收到重要電平,它就會啟動。 >>>More

8個回答2024-08-16

1.首先,在Proteus軟體中。

如下圖所示。 >>>More

5個回答2024-08-16

首先,我不明白你的中斷請求是什麼,聽你的描述應該是外部中斷使LED亮起,數碼管停止(是不亮還是停止計數)。 我們先說電路,LED不能接P32,需要接其他空閒的IO口(如P20,要加乙個串聯限流電阻,使電流一般為4mA,1K或LED的另一端可以接高電平,P32口要接一端乙個按鈕, 鑰匙的另一端接地,可以加乙個上拉電阻,也可以不加。 這樣,當按下按鍵時,會產生乙個下降沿來觸發外部中斷(觸發模式在程式中設定為由下降沿觸發),然後進入中斷處理程式。 >>>More

19個回答2024-08-16

原理:只是執行一些所謂的“無意義指令”,比如縮放或執行乙個int自加法,簡單來說,就像高中數學中的“乘法原理”一樣,很容易快速增加上面提到的“無意義指令”的數量。 >>>More

11個回答2024-08-16

你用什麼樣的AD晶元---不同的晶元是不同的。