日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

单片机机器周期怎么计算公式_单片机很好玩6,单片机是一切智能机器的基础,就是这么嚣张...

發(fā)布時(shí)間:2025/3/20 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机机器周期怎么计算公式_单片机很好玩6,单片机是一切智能机器的基础,就是这么嚣张... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

單片機(jī)常被稱作 MCU,MCU 的全稱是 Micro Control Unit,就是微型控制器的意思。顧名思義,單片機(jī)常被用于控制一些器件工作,因此物聯(lián)網(wǎng)的終端,或者其他一些智能機(jī)器,都是離不開(kāi)單片機(jī)的。

小到手機(jī),大到汽車(chē)飛機(jī),現(xiàn)在幾乎只要是電子器件,就有單片機(jī)的身影。

精確計(jì)時(shí)的重要性

傳感器能夠感知外界環(huán)境,可以說(shuō)是一切智能機(jī)器的基礎(chǔ)。實(shí)際工程中,常常使用單片機(jī)或者控制傳感器工作,或者采集傳感器的數(shù)據(jù)。但是不管是控制還是采集,單片機(jī)都需要與傳感器通信,這樣才能將控制命令發(fā)送到傳感器,或者將傳感數(shù)據(jù)接收到單片機(jī)內(nèi)部。

為了實(shí)現(xiàn)器件與器件之間的通信,人們制定了一些通信協(xié)議。通信協(xié)議其實(shí)就是一系列約定,比如約定總線先輸出低電平 10us,再輸出高電平 30us 表示 0;總線先輸出低電平 10us,再輸出高電平 100us 表示 1。

可以看出,如果單片機(jī)要解析通信協(xié)議,就只需要處理電信號(hào)與時(shí)間的關(guān)系就可以了

假設(shè)單片機(jī)在與某個(gè)傳感器通信時(shí),需要拉低總線 50us,這就需要一個(gè)精確的定時(shí)器。在讀傳感器數(shù)據(jù)時(shí),需要判斷總線究竟被傳感器拉高了 30us 還是 100us,這就需要一個(gè)精確的計(jì)時(shí)器。

不精確的定時(shí)器

那么單片機(jī)怎樣才能精確的定時(shí)和計(jì)時(shí)呢?本節(jié)就以 51 單片機(jī)為例,來(lái)說(shuō)一下這個(gè)問(wèn)題。

在第三節(jié)制作呼吸燈時(shí),用到的延時(shí)函數(shù)C語(yǔ)言代碼是如下定義的:

void delay(unsigned int n){ unsigned int x; while(n--){ x = 50; while(x--); }}

但這只是粗略的定時(shí),因?yàn)檐浖看螆?zhí)行需要花費(fèi)的時(shí)間都有所差異。所以上面的 delay() 函數(shù),只能用在對(duì)時(shí)間精確度要求不高的“呼吸燈”小項(xiàng)目中。

精確的定時(shí)器

相當(dāng)一部分單片機(jī)內(nèi)部都有計(jì)數(shù)器資源。計(jì)數(shù)器內(nèi)部有一個(gè)寄存器,這個(gè)寄存器的值每經(jīng)過(guò)一個(gè)機(jī)器周期就會(huì)自動(dòng)加 1,而機(jī)器周期僅與單片機(jī)的晶振有關(guān)。

我使用的這款 51 單片機(jī)有兩個(gè)計(jì)數(shù)器,它的晶振固定為 11.0592MHz,一個(gè)機(jī)器周期等于 12 個(gè)時(shí)鐘周期。所以,計(jì)數(shù)器每加1,就表示時(shí)間過(guò)去了 n 秒,n 的計(jì)算公式如下:

n = 12 * ( 1/11.0592MHz )

這款單片機(jī)計(jì)數(shù)器的寄存器寬為 16 位,因此最大能夠表示到 0xffff 即 65535。計(jì)數(shù)器計(jì)滿(溢出)一次,就會(huì)將寄存器 TFx 置 1,所以檢測(cè) TFx 寄存器就能夠知道計(jì)數(shù)器是否計(jì)滿。

如此一來(lái),設(shè)計(jì)精確的定時(shí)器思路就有了,請(qǐng)看如下 C語(yǔ)言代碼:

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;}

假設(shè)定時(shí)器計(jì)數(shù) timer_cnt 次消耗 tus 微秒,那么讓計(jì)數(shù)器計(jì)數(shù) 65535-timer_cnt 次就溢出,我們就可以檢測(cè) TF0 寄存器的值判斷是否已經(jīng)過(guò)去 tus 微秒。請(qǐng)看如下 C語(yǔ)言代碼:

void start_timer0(){ TF0 = 0; TR0 = 1;}void wait_timer0(){ while(!TF0); TR0 = 0; TH0 = (timer_cnt>>8) & 0xff; TL0 = timer_cnt & 0xff;}

TR0 寄存器為高電平時(shí),計(jì)數(shù)器才開(kāi)始計(jì)數(shù)。如此一來(lái),可以定義精確的延時(shí)函數(shù),它的C語(yǔ)言代碼如下:

set_timer0(10);void delay_10us(unsigned int n){ while(n--){ start_timer0(); wait_timer0(); }}

現(xiàn)在寫(xiě)如下控制程序,測(cè)試我們實(shí)現(xiàn)的精確定時(shí)器,請(qǐng)看如下C語(yǔ)言代碼:

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);表示延時(shí) 100萬(wàn)微秒(即 1秒)。編譯程序并燒寫(xiě)到單片機(jī),在電腦端打開(kāi)串口調(diào)試工具,發(fā)現(xiàn)的確每隔 1秒打印一次 “1s past …”:

精確計(jì)時(shí)器

思路與設(shè)計(jì)精確定時(shí)器是一樣的。因?yàn)闀簳r(shí)不方便測(cè)試,所以放入下一節(jié)再討論。下一節(jié)將介紹一款溫度、濕度傳感器,并使用單片機(jī)采集之,發(fā)送到電腦端。這樣一來(lái),就可以點(diǎn)擊鼠標(biāo)知道室內(nèi)的溫度和濕度了。敬請(qǐng)關(guān)注!!!

歡迎在評(píng)論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語(yǔ)言、linux等嵌入式開(kāi)發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。

總結(jié)

以上是生活随笔為你收集整理的单片机机器周期怎么计算公式_单片机很好玩6,单片机是一切智能机器的基础,就是这么嚣张...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。