-
我還用郭天翔的板子學了51。 根據您的問題和程式,中斷不使用陣列,它只計算 SHI 和 GE 變數。 然後 shi,ge 變數發生變化,這兩個變數的顯示在 main 函式中傳遞,同時引起數碼管的顯示發生變化。
你說的刪除陣列是在顯示功能中將其刪除並直接更改為 p0=shi? 如果是這樣,就很容易解釋這個原因了:因為當不去掉的時候,p0就是通過shi變數在表陣列中查詢表來得到數碼管顯示資料,而0 9對應的十六進製資料按照0 9儲存在表陣列中, 每個都是固定的,並且 shi 和 ge 變數不屬於上述任何乙個固定資料,如果直接賦值,則無法正常顯示,而是亂碼。
當然,如果我的問題不是你的問題,你可以隨時回覆我。
我希望我的能幫助你。
-
親愛的,我怎麼不明白你的問題,看來你還沒有弄清楚定時中斷,或者你對鎖扣不太了解,多看郭老師的書,你就能明白了,如果你看不懂,就放棄學習微控制器吧,這些知識最多只能算是初學者的入門。 但我還是希望你好好學習。
郭先生建議學生提出建議。
-
將程式**傳送過來。
-
程式中沒有 if(tt==20) 條件。
是不是如果(tt==100),如果程式不跑掉,這肯定是真的,累計不會跳過100這個數字,你怎麼說呢? 如果你認為它不可靠,你可以把它改成if(tt>=100)。
-
在每個定時器 50ms 時間後,變數 t 加 1在迴圈程式中,t=20(1s)使數碼管顯示不同的數字。
-
其實就是中斷返回,當第一次中斷完成時,數碼管從原來的0變為1,然後程式返回while,也就是斷點,然後等待下乙個中斷請求,也就是50毫秒,當50毫秒到來時,再執行第二個中斷
-
死迴圈不是微控制器崩潰,而是它一直在這個迴圈中工作。 它的計時器也一直在工作的過程,從你的程式來看,雖然你的顯示屏在閃爍,但數字沒有變化,你就少了乙個{}應該。
if(t==20)}
-
51、微控制器中斷分為外部中斷和內部定時器中斷,外部中斷是指在接收到外部中斷觸發訊號(中斷引腳電平變化)後,程式執行到相應的中斷服務程式進行執行,執行完成後返回之前執行的地方; 例如,如果定時器 0 設定為 10 ms,則每 10 ms 進入中斷服務程式。
-
啟用中斷後,程式會在中斷生成後自動跳轉到相應的中斷功能,所以你的燈閃爍,main 中的 while(1){} 是常規任務,中斷是意外事件還是未知事件。
例如,如果你正在睡覺,有人打了你,你會醒來撿起**,撿起來玩**,然後繼續睡覺。
這就是程式的全部內容,除了你的大腦在控制中,而程式在MCU的控制之下。
-
你的問題是你不明白中斷的含義。
從字面上看,中斷意味著(當出現更緊急的事情時)停止手頭的事情並處理更緊急的事情。 在程式中,當條件為真時,它相當於停止正在執行的**(手頭的事情)並執行另一部分(更緊急的事情),但這個過程是由硬體自動完成的,而不是像通常呼叫函式那樣顯式呼叫它。
如果你在程式中使用計時器 0(親眼看看計時器是如何工作的),那麼你只需要初始化計時器 0 並寫入函式 void exter() interrupt 1,當計時器 0 被中斷時,你要執行它。 當你啟動定時器 0 時,有點像在後台執行的程式,當它設定為 0 時,它會將對應的中斷標誌設定為 1,CPU 會不時檢測到這些中斷標誌,當發現某個標誌為 1 時,表示有中斷請求, CPU會自動進入相應的中斷服務程式。
-
立即關閉。
當前程式繼續,但一旦退出,它就不能進入任何中斷處理程式。
-
讓我們為您談談。 當微控制器執行時,它會高速執行 while(1) 中的程式。 但這還不夠,例如,如果您想將訊號傳遞給微控制器以使其進行處理,例如:
你按下某個鍵來控制某個燈的亮起,然後你需要乙個微控制器來響應你的動作,而響應的方式就是打斷。 也就是說,當你在主程式中完成乙個中斷觸發條件時,當達到這個條件時,程式會跳轉到中斷服務功能,然後在中斷服務功能中執行程式後返回主程式繼續迴圈。 你說的呼叫其實不太正確,中斷服務功能只能觸發,它是由微控制器中某些暫存器的標誌來控制的,當滿足這些觸發條件時,這些標誌被硬體設定為1,然後自動執行你寫的中斷服務功能。
不是很清楚,請原諒,中斷是微控制器中最重要的功能之一,對應定時器(這是微控制器的核心),這些內容在51中非常簡單,但是在32位微控制器中就變得特別複雜了。
希望這些能給你一些幫助。
-
理論上是可以的,在實踐中是可以的,但需要明確的是,中斷服務程式返回使用 RETI 指令,這與子程式返回的 ret 指令不同。
-
它可以直接呼叫,但這種中斷服務程式與普通的子程式沒有什麼不同。
-
呼叫是可以的,但如果有堆疊操作,它可能會破壞程式的執行。
如果在主程式呼叫中斷程式時呼叫中斷,會發生什麼情況?
C51 具有遞迴呼叫的函式。 但它也更大。 它似乎不划算,因為它占用了大量記憶體。
-
從理論上講,這很好,只要您充分利用儲存在堆疊中的返回位址並負責現場恢復即可。 事實上,作業系統中的搶占式多工處理也是如此。
但是,我認為你應該找到一種方法來避免程式演算法的無休止迴圈,這才是正確的思維方式和方向。
關於新增:直接 reti 必須返回定時器中斷的地方,但可以先從堆疊中彈出按下的定時器中斷的返回位址,並保護場景中按下的內容,這樣棧就會回到死迴圈中中斷的狀態(保證定時器中斷發生在死迴圈中, 否則會搞砸,可以通過標誌來判斷),然後你執行reti,相當於死迴圈中中斷的返回。
其實還有一種更簡單的方法:進入無限迴圈,立即將 sp 儲存到記憶體變數中,定時器中斷確定發生了無限迴圈,然後將該變數的值恢復到 sp,然後執行 reti。 當然,這種方法要求中斷的服務程式是不可重入的,這對於微控制器來說一般不是問題。
-
進入乙個有無限迴圈的中斷是不對的,一定有出口,你的程式一定有問題,不能用定時器中斷關閉第乙個中斷,只能進入巢狀的中斷,每個中斷必須有乙個要返回的中斷,不能用其他的中斷返回上乙個。看門狗根本無法解決,不能每次進入中斷時都復位,或者重新做程式!!
-
是的,但你應該避免無限迴圈,你也可以從看門狗開始,它會在很長一段時間後復位微控制器而沒有響應。
-
只要將定時器中斷的優先順序更改為高,就可以實現此目的。 你試試看。 我隨口想了想。
中斷優先順序控制暫存器是IP
-
難道沒有解釋嗎,不要動腦子,th0=(65536-50000) 256; 初始化,50ms
如果發生高優先順序中斷,可以在不結束中斷的情況下再次中斷,這意味著中斷被中斷中斷。
-
程式結束後,如果有有效的中斷請求,可以立即進行中斷。
-
到 caoni() 50ms 進入中斷一次。
中斷 20 次後,將燈更改為亮起。
-
大約需要一兩個小時。
-
上位機傳送,下位機接收,下位機接收中斷服務程式,判斷接收資料的正確性以及收貨是否完成。 需要簡單的通訊協議。 例如,將第乙個位元組定義為資料型別(單位元組陣列),將第二個位元組定義為陣列長度。
三、四、......對於陣列資料,最後乙個位元組定義為校驗位元組(也可能不存在)。 如果要傳送的陣列是 a[7],那麼需要通過這個通訊協議總共傳送 10 個位元組。 假設你傳送的陣列的最大長度是 20(在所有條件下,如果長到幾百個,建議以子資料包的形式傳送),那麼你的資料包的最大長度是 23,你定義乙個長度為 23 的接收陣列,定義乙個接收位元組數的全域性變數計數器, 每次在下位機的接收程式中接收到它時,陣列指標+1,當計數器>2時,就可以開始判斷接收是否完成。
volatile unsigned char counter;
volatile unsigned char rxarray[30];
void comrx(void)
comrx() 可以在中斷中呼叫,但不能在中斷中呼叫,因為 return
另外,請檢視您的 MCU 手冊,中斷標誌是否由您自己清除,或者您是否需要手動清潔。
-
推薦你借一本郭天翔51微控制器的書,寫得很詳細,絕對適合新手。
您的程式使用定時器 0 在模式 1 下工作,th0=(65536-45872) 256;
tl0=(65536-45872)%256;這是你的定時時間,一旦定時器時間到了,就會進入中斷程式執行,你不必擔心**中的中斷,總之,在執行完最後的中斷後,你會回到產生中斷的地方。 你應該定義的是 50ms,一秒進入中斷,重新載入初始值,重新開始定時,每 50 毫秒輸入一次中斷,使用 num++ 計數,當 num=20 時,即 50ms x 20=1s 當滿足 if 條件語句時,執行 led=led 表示小燈會亮。
一秒鐘熄滅,一秒鐘熄滅。
-
num=0 ;這是為了將 num 清除為 0,以便下乙個週期計數;
th0=(65536-45872) 256 這是th0的初始值,晶體振盪器定時為50ms,應該是46080而不是45872
num++,即使執行一次,也相當於+1
首先,您必須開啟 Total Break EA
其次,開啟五個小中斷:et0、et1、es、int0、int1,一旦與中斷對應的介面收到重要電平,它就會啟動。 >>>More
首先,我不明白你的中斷請求是什麼,聽你的描述應該是外部中斷使LED亮起,數碼管停止(是不亮還是停止計數)。 我們先說電路,LED不能接P32,需要接其他空閒的IO口(如P20,要加乙個串聯限流電阻,使電流一般為4mA,1K或LED的另一端可以接高電平,P32口要接一端乙個按鈕, 鑰匙的另一端接地,可以加乙個上拉電阻,也可以不加。 這樣,當按下按鍵時,會產生乙個下降沿來觸發外部中斷(觸發模式在程式中設定為由下降沿觸發),然後進入中斷處理程式。 >>>More
原理:只是執行一些所謂的“無意義指令”,比如縮放或執行乙個int自加法,簡單來說,就像高中數學中的“乘法原理”一樣,很容易快速增加上面提到的“無意義指令”的數量。 >>>More