单片机机器周期怎么计算公式_单片机很好玩6,单片机是一切智能机器的基础,就是这么嚣张...
單片機常被稱作 MCU,MCU 的全稱是 Micro Control Unit,就是微型控制器的意思。顧名思義,單片機常被用于控制一些器件工作,因此物聯網的終端,或者其他一些智能機器,都是離不開單片機的。
小到手機,大到汽車飛機,現在幾乎只要是電子器件,就有單片機的身影。精確計時的重要性
傳感器能夠感知外界環境,可以說是一切智能機器的基礎。實際工程中,常常使用單片機或者控制傳感器工作,或者采集傳感器的數據。但是不管是控制還是采集,單片機都需要與傳感器通信,這樣才能將控制命令發送到傳感器,或者將傳感數據接收到單片機內部。
為了實現器件與器件之間的通信,人們制定了一些通信協議。通信協議其實就是一系列約定,比如約定總線先輸出低電平 10us,再輸出高電平 30us 表示 0;總線先輸出低電平 10us,再輸出高電平 100us 表示 1。
可以看出,如果單片機要解析通信協議,就只需要處理電信號與時間的關系就可以了。
假設單片機在與某個傳感器通信時,需要拉低總線 50us,這就需要一個精確的定時器。在讀傳感器數據時,需要判斷總線究竟被傳感器拉高了 30us 還是 100us,這就需要一個精確的計時器。
不精確的定時器
那么單片機怎樣才能精確的定時和計時呢?本節就以 51 單片機為例,來說一下這個問題。
在第三節制作呼吸燈時,用到的延時函數C語言代碼是如下定義的:
void delay(unsigned int n){ unsigned int x; while(n--){ x = 50; while(x--); }}但這只是粗略的定時,因為軟件每次執行需要花費的時間都有所差異。所以上面的 delay() 函數,只能用在對時間精確度要求不高的“呼吸燈”小項目中。
精確的定時器
相當一部分單片機內部都有計數器資源。計數器內部有一個寄存器,這個寄存器的值每經過一個機器周期就會自動加 1,而機器周期僅與單片機的晶振有關。
我使用的這款 51 單片機有兩個計數器,它的晶振固定為 11.0592MHz,一個機器周期等于 12 個時鐘周期。所以,計數器每加1,就表示時間過去了 n 秒,n 的計算公式如下:
n = 12 * ( 1/11.0592MHz )這款單片機計數器的寄存器寬為 16 位,因此最大能夠表示到 0xffff 即 65535。計數器計滿(溢出)一次,就會將寄存器 TFx 置 1,所以檢測 TFx 寄存器就能夠知道計數器是否計滿。
如此一來,設計精確的定時器思路就有了,請看如下 C語言代碼:
static unsigned int timer_cnt = 0;void set_timer0(unsigned int tus){ timer_cnt = (unsigned int)((float)tus * 11.0592 / 12.0); timer_cnt = 65535 - timer_cnt; TH0 = (timer_cnt>>8) & 0xff; TL0 = timer_cnt & 0xff; TMOD |= 0x01;}假設定時器計數 timer_cnt 次消耗 tus 微秒,那么讓計數器計數 65535-timer_cnt 次就溢出,我們就可以檢測 TF0 寄存器的值判斷是否已經過去 tus 微秒。請看如下 C語言代碼:
void start_timer0(){ TF0 = 0; TR0 = 1;}void wait_timer0(){ while(!TF0); TR0 = 0; TH0 = (timer_cnt>>8) & 0xff; TL0 = timer_cnt & 0xff;}TR0 寄存器為高電平時,計數器才開始計數。如此一來,可以定義精確的延時函數,它的C語言代碼如下:
set_timer0(10);void delay_10us(unsigned int n){ while(n--){ start_timer0(); wait_timer0(); }}現在寫如下控制程序,測試我們實現的精確定時器,請看如下C語言代碼:
void main(){ init_uart(9600); set_timer0(10); // 10us prints("program start..."); while(1){ delay_10us(50000);delay_10us(50000); prints("1s past ..."); }}兩句delay_10us(50000);表示延時 100萬微秒(即 1秒)。編譯程序并燒寫到單片機,在電腦端打開串口調試工具,發現的確每隔 1秒打印一次 “1s past …”:
精確計時器
思路與設計精確定時器是一樣的。因為暫時不方便測試,所以放入下一節再討論。下一節將介紹一款溫度、濕度傳感器,并使用單片機采集之,發送到電腦端。這樣一來,就可以點擊鼠標知道室內的溫度和濕度了。敬請關注!!!
歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。
總結
以上是生活随笔為你收集整理的单片机机器周期怎么计算公式_单片机很好玩6,单片机是一切智能机器的基础,就是这么嚣张...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: axios请求接口http_使用axio
- 下一篇: 像素位移_1亿像素放大也清晰 OPPO