51微控制器的那些事兒(三)
接下來我們分享一下定時/計數器的應用。其實微控制器中,定時/計數器是個很常用而且很方便的時間方面的工具。學好定時器是很重要的。
很多例項,諸如萬年曆,測速儀器,波特率發生器,方波發生器,脈衝發生器,pwm脈寬調變都要基於微控制器的定時/計數器來應用。
總結起來,微控制器的定時器t0,t1的應用主要依靠這幾個引數:tmod,th0,tl0,th1,tl1,tr0,tr1。同時設計中斷的話,還有ea,et0,et1,當定時器時間到了,會將tf0或者tf1由0變成1.
tmod的引數意義在第一節講述過,這裡複習一下。
具體的意義請大家參照教科書或者相關資料,這裡不再贅述。
以上tmod設定,如果用到t1就設定tmod高四位就可以,第四位設定成0000就可以。同理,t0只需要設定第四位,高四位設定成0000.
然後就是計數的初值,組合語言中,如果預設12分頻的情況下,12m晶振對應的機器週期是1微秒。也就是說,微控制器定時器每計乙個數,就需要1微秒。
也就是說,如果計數計了1000次就是1毫秒。t1定時器會從設定的th1,tl1開始計數,直到設定的方式所能容納的最大值。
例如,我們選擇的方式1,為16定時器,那麼它能從th1,tl1中的值一直計到0ffffh,如果我們設定th1為67h,tl1是66h,那麼t1在方式一狀態下將會從6766h一直計到0ffffh,然後立即將tf1標誌位從0變成1,表示它的定時功能完成,時間已到。我們就利用需要的時間差,來計算到底要從幾開始計數。即計算th1/0.
tl1/0的初值。
這裡,由於t2應用並不多,我們不做了解。
初值如何計算呢,要知道機器週期是多少,還有需要計數多久,還有工作在方式幾。
例如,我們應用t1工作在方式一,16位計數器,機器是12分頻,12m晶振,即機器週期為一微秒,我們需要定時為1毫秒,則需要計數1000次。則初值=0ffffh+1-1000,結果化為4位十六進製制,如果不夠四位則高位補零,前兩位是th1,後兩位是tl1。
確定好初值之後,我們就可以針對需要做的事情進行過程分析。就是當tf1/0從0變成1的時候,我們要做什麼。假如是生成方波,那麼就把方波的訊號電平取反,假如是產生脈衝,就把訊號輸出的電平由低變成高,延遲一段再變成低電平。
組合語言中,定時器呼叫的大致格式為:
*** 0000h
ajmp main
*** 0080h
main: 初始化**
mov tmod ,#10h t1工作於方式1,為定時器 mov th1 , #初值高8位
mov tl1,#初值低8位
setb tr1 開始計數
loop1:jnb tf1 , loop 等待時間到
clr tf1
clr tr1
這裡輸入時間到了以後要做的處理過程**
mov th1 , #初值高8位
mov tl1,#初值低8位
setb tr1 開始計數
ajmp loop1 再次進行等待時間到進行處理
c語言中呼叫方式只有應用中斷。
#include<89x51.h>
#include
void main()
void time1_int() interrupt 3
至於中斷:51系列有6個中斷源,分別是外部中斷0/1.定時器中斷0/1/2,序列口中斷。
使用中斷首先要開總中斷,即,setb ea,然後再設定用哪個中斷,假如用外部中斷0,還需要開外部中斷0,即setb ex0 然後,根據中斷向量,在向量處跳轉到中斷處理程式。
例如,外部中斷0的入口位址是0003h,那麼用組合語言呼叫外部中斷0的大致過程是。
*** 0000h
ajmp main
*** 0003h
ajmp int0 我們把中斷處理的程式標籤設定為int0
*** 0080h
main : 這裡輸入其他初始化**
setb ea
setb ex0
loop: ajmp loop 等待中斷
int0 : push psw
push acc
這裡是中斷處理過程**
pop acc
pop psw
reti
中斷應用注意,首先是開中斷,然後是中斷入口,然後就是將psw和acc壓入堆疊保護。最後就是中斷返回reti
用c語言呼叫中斷涉及到中斷編號。具體參照第一節。
呼叫格式大致如下。
#include <89x51.h>
void main()
void inter0() interrupt0
定時器和中斷應用先分享到這裡。外部裝置的應用,例如鍵盤,lcd等,將在下節介紹。謝謝支援!
微控制器學習心得
以上三步學會,就相當於降龍十八掌武功,會了三掌了,可以勉強護身。第四步 與pc機進行rs232通訊 微控制器都有usart介面,特別是msp430系列中很多態號,都具有兩個usart介面。usart介面不能直接與pc機的rs232介面連線,它們之間的邏輯電平不同,需要使用乙個max3232晶元進行電...
51微控制器學習心得四
行的按鍵a端都依次接在低四位,四列按鍵的b端依次接在高四位。我們把鍵值編為 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 對此,我引入了一位高人編寫的鍵值判斷程式 uchar keyscan void for j 0 j 4 j 它的方式比較容易理解,其實就是按照行列...
微控制器C語言學習心得
今天寫這一篇文章並不是因為已經想好了一篇文章才寫下來,而是我要將這一篇文章作為乙個長期的筆記來寫,我會一直更新。在進行微控制器開發時,經常都會出現一些很不起眼的問題,這些問題其實都是很基礎的c語言知識點,是一些小細節。但是正是因為很基礎,又都是小細節,所以我們往往容易忽視它們。結果有時候我們會花很長...