自學單片機第五十三篇:設置定時器時間

2020-12-05 小亮談電氣

定時器的難點也就在這裡了。我們使用定時器時,通過手冊可以查詢到T0定時器是有4中工作方式的,每種工作方式是不一樣的,也就導致了設置的方法也稍有不同。先看下手冊中的四種方式。

先不管如何設置的,我們先看下這四種模式,第一種是13位定時器,從學習到實踐,這麼久,我還沒有用過這種模式,想使用的可以試試,個人覺得也許就是為了兼容以前的設備,沒有其他左右,也許有,我不知道。

第二種是16位定時器模式,就是說,可以完成一個十六位二進位數的加法,從0000000000000000加到1111111111111111,看著就覺得很大的數,轉成十進位就是0-65535。

第三種是8位自動重裝定時器。先用低八位計時,計時結束,再把高八位數據放到低八位中繼續計時。

第四種是兩個8位定時器。

看到這裡,是不是有個疑問?計時器不是計時的嗎?怎麼沒有看到定時的參數?不都是像秒表一樣一秒一秒的走的嗎?這裡需要我們詳細的解釋下,定時器是如何定時的。

在單片機中,有這麼一個裝置,之前我們就看到過,還有同學說我仿真中為何不畫出來,那就使晶振。晶振的作用就是單片機的心跳,沒有它,單片機就失去了走下去的動力。可以說單片機的程序運行就是踩著晶振的頻率一步一步走下去的,晶振越穩定,單片機就越精確。

晶振又是如何影響單片機的運行呢?這要說到一個東西——晶振頻率。之前的實驗中,總是會說到我使用的晶振頻率是11.0592MHz,這裡的11.0592MHz就是晶振的頻率,是晶振發出的時鐘信號,十分精確。就相當於一個人在分秒不差的一秒喊一聲「到」,這個晶振就是趴在那裡一秒喊了11059200次「到」而且間隔十分一致。於是單片機就以這個頻率來確定自己的運行時間,常規的單片機的機器周期是晶振頻率的1/12,就是說,運行一次最簡單的代碼,需要震動12次,那麼一秒鐘可以完成的機器周期數是11059200/12=921600次這是頻率,通過頻率可以計算出一次的時間是T=1/f=1/921600=1.08507^-6秒,換算成微秒就是1.08507微秒,也就是程序完成一次運算的最短時間是1.08507微秒。

然後我們就可以用這個來作為基礎時間,單片機的最基礎運算是加減運算,都是佔用一個機器周期,我們的定時器就是靠著加法來完成定時的。例如我們前文所說的第二種定時器使用方式中,16位定時器,就是讓一個0一直加到65535,這個加的過程是單片機自己完成的,無需我們控制。如果從0開始到65535,我們可以計算出所消耗的時間是:1.08507*65535=71110.06245微秒,也就是71.110毫秒。當定時器加到65536時,就會溢出,然後清零,並觸發中斷。

這個溢出又是一個新詞。溢出的意思是滿了,裝不下了。我們假設一個3位定時器。最初是000,隨著不斷的加一,一直加到了111,當程序再加一時,由於只有三位數,再加一就該進位了,進位之後,進上去的1沒地方放,就扔了,餘下了三個0。這個扔掉的1就是溢出,像是水盆水滿了,再倒水就溢出去了。當定時器溢出後,會有一個專門的標誌位,去監控這個溢出現象,一但溢出,這個標誌位就會變成1,於是我們就可以通過這個溢出標誌位,來查看定時器是不是加到頭了。

由於加到頭的時間有整有零,不是很好算,所以往往會選擇一個整數時間來定時。方法就是不讓定時器從頭開始加,我給他一個其實值,讓他從起始值往後加,這樣時間就變得短了,通過控制起始值,就可以控制定時時間了。

比如0-65535是71110.06245微秒,假設我想讓他50000微秒完成一次計時。那麼就可以通過50000除以一次的時間,得出計時50000微秒需要的次數。

50000/1.08507=46079.97641次,程序中不存在半次的周期,所以需要使用整數,就是約46080次,有了這一次的四捨五入,就造成了計時的誤差。每50毫秒就多用了0.02359次,相當於每50毫秒長了1.08507*0.02359=0.0255968013微秒,一秒鐘就是20個50毫秒,一分鐘就是1200個50毫秒,一小時就是72000個50毫秒,就相當於單片機一小時時間比真正的一小時長了0.0255968013*72000=1842.969694微秒。一個小時誤差2毫秒,是不是相當精確了。

有些同學看著這些個數就頭疼,也怪我,就好使用這個11.0592MHz的晶振。但是方法有了,用什麼晶振都是可以的,無非就是計算一下數據而已。

當計算出46080時,就相當於知道了單片機只需要查夠46080個數就可以完成一次計時50毫秒任務了。那麼初始值就不再是0了,最大值是無法改變的,我們只有改變最小值,讓它不從0開始。要想查夠46080剛好到65536,這就需要用65536減去46080得到19456,也就是定時器要從19456開始計數。

這個19456需要存儲到一個地方,好讓每次計數完後可以找到他,然後繼續計數。在中斷中有這麼一個配置,就是兩個8位的存儲空間,分別是高八位TH0,低八位TL0。我們要把這個初始值19456轉換成二進位,然後拆成兩個八位二進位。

使用科學計數器19456=0b1001 1000 0000 0000=0x98 00,高八位就是0x98,低八位就是0x00。

至此定時器的定時設置就算完成了。

這是我們在使用方式1的情況下的定時器數值。TH0=0x80,TL0=0x00。

如果是為了方便,可以採用12MHz的晶振。

我們來計算下,一個周期的時間就是:

f=1200000/12=1000000次。

T=1/f=1/1000000=1微秒。整數,是不是看起來好多了。那麼從0加到65535就是65.535毫秒,我們需要50毫秒,就是需要50000次,口算就可以得到。比那個11.0592MHz簡單很多是吧。後邊的計算時差不多的,65536-50000=15536。然後把15536計算成二進位就可以了。

15536=0b0011 1100 1011 0000=0x3C B0。TH0=0x3C,TL0=0xB0。

好吧,就是這麼簡單。

設置時間步驟:

1,查看晶振頻率。

2,計算出一個機器周期的時間,大部分是12分之一,也有些是6分之一的,注意查看手冊。

3,設置定時器一個中斷周期時間長度。

4,計算出累加一個時間長度所需累加數,然後計算出初始值。

5,使用科學計算器,計算出初始值的二進位數,把二進位數分為兩個八位數。把二進位轉換為十六進位。

6,把高八位十六進位寫入TH0,低八位十六進位寫入TL0。

通過這六個步驟,就算是完成了時間設置。假設是一個12M的晶振。

1,頻率12M。

2,機器周期時間是1/(12M/12)=1微秒。

3,假設需要定時50毫秒。

4,累加數,50000/1=50000。65536-50000=15536。初始值15536。

5,15536=0b0011 1100 1011 0000=0x3C B0。不夠十六位的,在二進位數前補0,湊夠十六位。

6,TH0=0x3C,TL0=0xB0。

相關焦點

  • 自學單片機第十篇:基礎知識--萬用表的使用
    一般的可以等數據穩定後讀數即可,也可以等待5秒,因為萬用表需要時間去估算數據。對於色環電阻,可以百度其數值,對照測量值,看是否正常。電流的測量,測量電流就要更加注意了,雖然我們測量的一般都是小電流,不會出現什麼人身傷害,但是考慮到你在這裡的操作,會對以後其他作業產生影響,就像是慣性思維,所以一樣,不論大小,都要慎重,這是從事電氣行業的基本操守。
  • 51單片機---定時器 計數器
    8051系列單片機有兩個定時器:T0和T1,分別稱為定時器和定時器T1,這兩個定時器都是16位的定時器/計數器;8052系列單片機增加了第三個定時器/計數器T2;它們都有定時或事件計數功能,常用於時間控制、延時、對外部時間計數和檢測等場合
  • stm32庫函數學習篇通用定時器輸入捕獲功能
    也就是說,每個通用定時器都只有四個獨立通道,當某一通道作為了輸入觸發功能那就不能再作為輸出匹配功能。這一點我們也可以從其他地方找到印證。This parameter can be a value of TIM_Input_Capture_Prescaler這個成員是對外部信號進行分頻,也即是設置上圖中的Prescaler,可以設置為1/2/4/8分頻。uint16_t TIM_ICInitTypeDef::TIM_ICSelectionSpecifies the input.
  • LPC1114系統定時器(SysTick)
    在LPC1114內部有一個特殊的定時器——系統定時器(SysTick),它位於Cortex-M0內核裡面,是ARM內核的一部分,主要用來給作業系統提供時間片輪轉的定時,一般固定為10ms的定時,所以中文也稱它為「嘀噠」定時器。
  • 定時器
    定時器在我們日常生活中也非常的常見,例如用遙控器來定一個小時或者兩個小時後電視機自動關機;電磁爐電飯鍋中定時某個時間開始煮飯燒水和煮飯燒水的時間設定
  • MSP430 定時器輸出PWM波形
    當PWM 不需要修改佔空比和時間時,TimerA 能自動輸出PWM,而不需利用中斷維持PWM輸出。MSP430F16x和MSP430F14x單片機內部均含有兩個定時器,TA和TB;TA有三個模塊,CCR0-CCR2;TB含有CCR0-CCR67個模塊;其中CCR0模塊不能完整的輸出PWM波形(只有三種輸出模式可用);TA可以輸出完整的2路PWM波形;TB可以輸出6路完整的PWM波形。
  • AVR——使用定時器必須弄清的幾個概念
    定時器是獨立運行的,它不佔用CPU的時間,不需要指令,只有調用對應的寄存器的時候才需要參與。以AVR mega16為例,它有三個寄存器,timer0,timer1和timer2,T0和T2是8位定時器,T1是16位寄存器,T2為異步定時器,三個定時器都可以用於產生PWM。
  • STM32 高級定時器-PWM簡單使用
    高級定時器與通用定時器比較類似,下面是一個TIM1 的PWM 程序,TIM1是STM32唯一的高級定時器。共有4個通道有 死區有互補。本文引用地址:http://www.eepw.com.cn/article/201612/325215.htm先是配置IO腳: GPIO_InitTypeDef GPIO_InitStructure; /* PA8設置為功能腳(PWM) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  • 一個定時器生成多路PWM波形的原理和方法
    首先來看看用一個定時器實現一路PWM輸出的方法:>>定義一個時間基準刻度t,這個也是計時器中斷周期,一般在程序中t不改變。PWM的周期、高低電平時間由若干個基準時間t組成;>>定義一個全局計時變量n,n表示這段時間經過了多少個基準時間t;>>定義一個全局計時變量n1,n1表示一個PWM的周期包含多少個基準時間t,n1=t1/t。一般在程序中n1,t1不改變。
  • 單片機中各種周期的關係與定時器原理
    單片機訪問一次存儲器的時間,稱之為一個機器周期,這是一個時間基準。  機器周期不僅對於指令執行有著重要的意義,而且機器周期也是單片機定時器和計數器的時間基準。例如一個單片機選擇了12MHZ晶振,那麼當定時器的數值加1時,實際經過的時間就是1us,這就是單片機的定時原理。
  • 自學單片機第十一篇:基礎知識--電工常識
    自學單片機第十篇:基礎知識--萬用表的使用
  • 單片機原理|定時器/計數器的工作原理及應用作業
    A、定時器T0採用方式1,定時5ms,每200次中斷後實現1s到B、定時器T0採用方式2,定時100us,每1000次中斷後實現1s到C、定時器T0採用方式0,定時10ms,每1000次中斷後實現1s到D、定時器T0採用方式3,定時100us,每1000次中斷後實現1s到我的答案:A
  • STM32F1通用定時器配置步驟(使用HAL庫)
    (1)使能定時器時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4時鐘(2)初始化定時器參數,包含自動重裝值,分頻係數,計數方式等voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct
  • STM32 定時器的4通道計數器應用
    通用定時器確實比較強悍,功能極多我也比較暈此為在不牽扯PWM與DMA下像C51那樣計數點燈。本文引用地址:http://www.eepw.com.cn/article/201611/317176.htm當然你要配置一些IO口作為點燈用這裡就不詳細說了。
  • 相片曝光定時器的工作原理
    打開APP 相片曝光定時器的工作原理 工程師吳畏 發表於 2018-09-29 08:49:00 附圖電路是用555單穩電路製成的相片曝光定時器。
  • 51單片機定時器/計數器的結構和原理
    定時器/計數器簡稱定時器,其作用主要包括產生各種時標間隔、記錄外部事件的數量等,是微機中最常用、最基本的部件之一。803l單片機有2個16位的定時器/計數器:定時器0(T0)和定時器1(T1)。
  • 如何採用STM32中的控制定時器Tim1實現計數器功能
    STM32中的高級控制定時器(Tim1)是由一個16位的自動裝載計數器組成,它由一個可編程預分頻器驅動。 用途在於:測量輸入信號的脈衝寬度(輸入捕獲),或者產生輸出波形(輸出比較,PWM,嵌入死區時間的互補PWM等)。 使用定時器預分頻器和RCC時鐘控制預分頻器,可以實現脈衝寬度和波形周期從幾個微秒到幾個毫秒的調節。
  • stm32f407之高級定時器 死區互補PWM(操作寄存器)
    高級定時器的功能有很多,這裡只介紹死區互補PWM輸出功能。其實死區互補PWM跟通用定時器的PWM配置差異不大,只是需要設置多CCER寄存器中的幾個位以及剎車與死區寄存器BDTR。對寄存器的具體描述請參考數據手冊。配置步驟:1.     使能相關時鐘。2.
  • C#如何使用定時器[Timer]
    在新程序界面空白窗口上放置合適的控制項:包括,顯示操作流程的textbox控制項;用於時間間隔秒數的輸入框;開始計時器按鈕和停止計時器的按鈕;timer控制項。添加變量設置標誌位, 如果為0 停止計時, 如果為1 則開始計時;設置臨時變量;設置變量,獲取指定的間隔秒數。添加按鈕【開始】代碼獲取指定的間隔秒數;設置臨時變量;設置標誌位為開始。
  • 為什麼高速數據通道需要重定時器?
    六零年代,隨著電信數字載波系統T1和E1的出現,數字重定時器開始受到關注。這些系統在屏蔽雙絞線上承載多條語音電路信道,每隔幾千英尺需安裝一個數字重定時器。當時這些設備比較先進,它們採用的技術與現在的高速重定時器類似,包括均衡、時鐘數據恢復(CDR)、線路編碼和成幀。