第四節:累計定時中斷次數使led燈閃爍。
開場白:
上一節提到在累計主迴圈次數來實現計時,隨著主函式裡任務量的增加,為了保證延時時間的準確性,要不斷修正設定上限閥值const_time_level 。我們該怎麼解決這個問題呢?本節教大家利用累計定時中斷次數的方法來解決這個問題。這一節要教會大家四個知識點:
第一點:利用累計定時中斷次數的方法實現時間延時
第二點:展現鴻哥最完整的實戰程式框架。在主函式迴圈裡用switch語句實現狀態機的切換,在定時中斷裡累計中斷次數,這兩個的結合就是我寫**最本質的框架思想。
第三點:提醒大家c語言中的int ,long變數是由幾個位元組構成的資料,凡是在main函式和中斷函式裡有可能同時改變的變數,這個變數應該在主函式中被更改之前,先關閉相應的中斷,更改完了此變數,再開啟中斷,否則會留下不宜察覺的漏洞。當然在大部分的專案中可以不用這麼操作,但是在一些要求非常高的專案中,有一些核心變數必須這麼做。
第四點:定時中斷的初始值該怎麼設定。不用嚴格按公式來計算時間,一般取個經驗值是最大初始值減去1000就可以了。
具體內容,請看源**講解。
(1)硬體平台:基於朱兆祺51微控制器學習板。
(2)實現功能:讓乙個led閃爍。
(3)源**講解如下:
#include "reg52.h"
#define const_time_level 200
void initial_myself();
void initial_peripheral();
void delay_long(unsigned int uidelaylong);
void led_flicker();
void t0_time(); //定時中斷函式
sbit led_dr=p3^5;
unsigned char ucledstep=0; //步驟變數
unsigned int uitimecnt=0; //統計定時中斷次數的延時計數器
void main()
}void led_flicker() 第三區 led閃爍應用程式
break;
case 1:
if(uitimecnt>=const_time_level) //時間到
break;}}
/* 注釋三:
* c51的中斷函式格式如下:
* void 函式名() interrupt 中斷號
* * 函式名可以隨便取,只要不是編譯器已經徵用的關鍵字。
* 這裡最關鍵的是中斷號,不同的中斷號代表不同型別的中斷。
* 定時中斷的中斷號是 1.至於其它中斷的中斷號,大家可以查詢
* 相關書籍和資料。大家進入中斷時,必須先清除中斷標誌,並且
* 關閉中斷,然後再寫**,最後出來時,記得重灌初始值,並且
* 開啟中斷。
*/void t0_time() interrupt 1
th0=0xf8; //重灌初始值(65535-2000)=63535=0xf82f
tl0=0x2f;
tr0=1; //開中斷
}void delay_long(unsigned int uidelaylong)}}
void initial_myself() //第一區 初始化微控制器
void initial_peripheral() //第二區 初始化外圍
總結陳詞:
本節程式麻雀雖小五臟俱全。在本節中已經展示了我最完整的實戰程式框架。
本節程式只有乙個led燈閃爍的單任務,如果要多增加乙個任務來並行處理,該怎麼辦?
欲知詳情,請聽下回分解-----蜂鳴器的驅動程式。
(未完待續,下節更精彩,不要走開哦)
ObjC第四節 繼承
繼 承 1 繼承 1.1 nsobject,根類,oc建立的類都繼承自根類,位於類層次結構的頂層,沒有父類 1.2 父類的例項變數和方法都可以被隱式的繼承過來成為子類的一部分,子類就可以直接訪問這些例項變數和方法 1.3 alloc和init是繼承自nsobject的方法 1.4 繼承的概念呈單鏈繼...
第四節 條件語句
if語句 if v 100else if v 50elseif語句不需要括號 用法高階 const filename abc.txt if contents,error ioutil.readfile filename error nilelse注意 contents和error變數都是在if 塊中...
Python基礎第四節
字典是 鍵值對 的無序可變序列,其中每個元素都是乙個 鍵值對 包含 鍵物件 和 值物件 就像可通過列表元素索引值獲取對應物件,我們可通過 鍵物件 獲取 刪除 更新其對應的值物件。鍵必須是不可變資料,如整數 浮點數 字串 元組,不能是字典 列表 集合等可變物件,鍵不可重複。若重複出現鍵,則後面的覆蓋前...