定時器中斷基礎
如何理解定時器
定時器是微控制器的乙個重要外設,也是微控制器的一大利器,要了解定時器,首先要了解微控制器的執行;初學定時器的時候,我們可能常常會疑惑,為什麼要用定時器中斷來代替軟體延時,為什麼軟體延時的精確度無法保證,接下來的講解將帶你解決這個問題
定時器,顧名思義,如果將微控制器比作人,那麼定時器就是秒錶,假設我們需要延時三分鐘,三分鐘後做事件a
使用軟體延時相當於人在盯著秒錶讀秒,這三分鐘就沒法做其他事情了
使用定時器延時則相當於這個秒錶每三分鐘就會報一次警,只需要在報警時做事件a就可以了
假設我們需要微控制器做乙個週期性的工作,那麼採用定時器延時與採用軟體延時就是如下的情形:
使用定時器延時的時候,在完成timer0的初始化之後,timer0開始計時,當達到初始化要求的值時,定時器溢位,溢位標誌位tf0 = 1,執行中斷函式(藍色部分),其中與延時相關的過程都由定時器通過硬體完成,不干擾微控制器執行程式的其他內容,這意味著在timer0溢位前,微控制器都可以去做其他事(白色部分)
而在使用軟體延時的時候,微控制器實際上在消耗大量的算力在執行延時相關的指令,上圖中紅色的部分,在延時過程中由於微控制器被占用去做延時的工作,無法做其他事情,造成了資源的浪費
定時器的初始化
以一條簡單的timer0定時1ms為例
void init_timer0()
其中涉及的需要配置的暫存器無非是以下幾個:
tmod ( timer mode)定時器模式設定具體詳見資料手冊
tcon(timer control)定時器控制中的tr0(定時器執行允許),tf0(溢位標誌,溢位時被置1)
ie(interrupt enable)中斷允許中的ea(總中斷允許),et0(中斷溢位允許,相當於例子中允許秒錶的報警功能)
th0(timer high)定時時長配置的高八位
tl0(timer low)定時時長配置的低八位(51是8位機,設定高八位和低八位可以將原先的8位延長至16位,增長定時時長)
使用定時器完成數碼管的掃瞄
利用定時器的延時替代數碼管動態掃瞄中的delay,這樣做的好處就是給予了微控制器大量的時間去處理數碼管顯示以外的內容,這在需要延時的iic協議獲取資料並將資料顯示在數碼管上的場景中效果尤為突出
藍橋杯微控制器設計與開發 數碼管
開發板所使用的數碼管為共陽數碼管,所以數碼管的碼字一定要知道,不知道也要會推。uchar code nixie 共陽數碼管碼字 共陽數碼管0 f的碼字如上 所示 y6c控制數碼管的位選端 y7c控制數碼管的段選端 標頭檔案包含 include include 管腳宣告 變數型別宣告 typedef ...
定時器數碼管時鐘
mai.c handlebars include system.h include key.h extern uchar flag 1ms 在其他模組中尋找其定義。另外,extern也可用來進行鏈結指定。void main void 程式的主函式 在這裡插入 片key.c include key.h...
藍橋杯微控制器學習之動態數碼管
由於藍橋杯的特殊設定,具體請看我的初始化解釋,所以藍橋杯的不同數字展示是和其他數碼管有區別的,因為藍橋杯的暫存器比較少,所以就是需要另乙個知識來實現這個不同數字顯現問題。也就是不停轉換位選來顯現不同位置上的數字,通過分流輪流控制各個數碼管的com端,這就是動態驅動 在一定時間範圍內,儘管不是同時顯示...