(學習筆記)手把手教你學51微控制器:中斷與數碼管動態顯示
一、c語言的陣列
1.1陣列的基本概念
陣列是具有相同資料型別的有序資料的組合,一般來講陣列定義後滿足以下三個條件:
(1)具有相同的資料型別
(2)具有相同的名字
(3)在儲存器中是被連續存放的
1.2陣列的宣告
資料型別 陣列名【陣列長度】;
(1)同一個陣列中的元素具有相同的資料型別。
(2)陣列名必須為字母、數字、下劃線組成且第一個字元必須是字母或者下劃線。
(3)陣列長度可以是常量或者常量表達式,且必須是正整數。
1.3陣列的初始化
資料型別 陣列名【陣列長度】={初值列表};
1.4陣列的使用和賦值
(1)c語言程式中,是不能一次使用整個陣列的,只能使用陣列的單個元素。
(2)陣列元素的方括號裡的下標可以是整型常數、整型變數或者表示式,而陣列初始化方括號裡的數字必須是常熟而不能是變數。
(3)陣列整體賦值只能在初始化的時候進行,程式執行程式碼中只能對單個數碼賦值。
二、條件語句
2.1 if語句
if……else
2.2 if……else if……else語句
2.3 switch語句
分支過多時可以採用switch語句,避免if……else配對出錯。
switch(表示式)
{
case 常量表達式1:語句1;
case 常量表達式2:語句2;
…
default:語句n+1;
}
首先計算“表示式”的值,然後從第一個case開始,與“常量表達式x”進行比較,若於當前值不相等,不執行冒號後面的語句,一旦發現和某個常量表達式的值相等,則執行之後的所有語句
改進:
switch(表示式)
{
case 常量表達式1:語句1;break;
case 常量表達式2:語句2;break;
…
default:語句n+1;break;
}
break,跳出當前迴圈,包括for或者while,同時還可以用來結束switch語句塊。
三、數碼管的動態顯示
3.1動態顯示的基本原理
動態顯示(動態掃描):多個數碼管顯示實際上是輪流點亮數碼管,利用人眼的視覺暫留(餘暉效應),看起來像是所有數碼管同時亮了。
完成一次全部數碼管的掃描需要10ms以內,只要重新整理頻率大於100Hz,即重新整理時間小於10ms,就可以做到無閃爍。
3.2數碼管顯示消隱
在數碼管位選和段選的瞬態會產生餘暉,為了避免可採取以下措施:
(1)重新整理之前關閉所有的段,改變位選後再開啟段。
賦值語句前加上 P0=0xFF 。
(2)關閉數碼管的位,賦值好之後再開啟。
在賦值語句前加上 ENLED=1 ,賦值重新整理語句完成後 ENLED=1 。
仍存在問題:亮度不一
例如在秒錶倒計時程式中由於每個數碼管的顯示時間為1s, 實際顯示時間為“1s+從上一次重新整理值到這一次重新整理值執行程式碼耗費的時間”,由於後者的時間差會導致幾個數碼管亮度不一。故需要採用其他思路解決這個問題。
四、微控制器中斷系統
4.1定時器中斷的應用
明確定時器和中斷不是一回事!
定時器是微控制器模組的一個資源,確確實實存在的一個模組,而中斷則是微控制器的一種運算機制。
標準的51微控制器中控制中斷的暫存器有兩個,一個是中斷使能暫存器,另一個是中斷優先順序暫存器。
IE----中斷使能暫存器的位分配(地址0xA8 可位定址 )
中斷使能暫存器IE的位0~5控制了 6 箇中斷使能,第 6 位沒用到,第 7 位是總開關。0~5位相當於分開關。故只要用到中斷就必須先寫 EA=1 。
T0中斷,要使用這個中斷那麼就要把它的中斷使能為 ET0 置1。
中斷函式寫好後,每當滿足中斷條件而觸發中斷後,系統就會自動來呼叫中斷函式。
4.2中斷優先順序
中斷優先順序有兩種,一種是搶佔優先順序,一種是固有優先順序。
IP的每一位表示對應中斷的搶佔優先順序,每一位的復位值都是0,當把某一位置1時,這一位的優先順序就比其他位的優先順序高。
當進入低優先順序中斷中執行時,如又發生了高優先順序的中斷,則立刻進入高優先順序中斷執行,處理完高優先順序級中斷後,再返回處理低優先順序中斷,這個過程就叫做 中斷巢狀 ,也稱為搶佔。所以搶佔優先順序的概念就是,優先順序高的中斷可以打斷優先順序低的中斷的執行,從而形成巢狀。當然反過來,優先順序低的中斷是不能打斷優先順序高的中斷的。
既然有搶佔優先順序,自然也有非搶佔優先順序,也成為 固有優先順序 。如表 6 - 5 中斷優先順序編號中,數字越小優先順序越高,不具有搶佔的特性。即使在低優先順序中斷執行過程中又發生了高優先順序的中斷,也只能等到低優先順序執行完之後才能得到響應。