8051單片機有兩個獨立的16位向上計數定時器,名為Timer0和Timer1,本文是關于使用8051定時器生成時間延遲。使用純軟件循環可以生成延遲,但這種延遲精度較差,不能用于敏感應用。使用定時器延遲是最準確的,當然也是最好的方法。
定時器可以概括為多位計數器,它在接收時鐘信號時增加/減少自身,并在翻轉時產生中斷信號。當計數器在處理器時鐘上運行時,它被稱為“定時器”,它對預定數量的處理器時鐘脈沖進行計數并產生可編程延遲。當計數器在外部時鐘源(可能是周期性或非周期性外部信號)上運行時,它本身被稱為“計數器”,可用于對外部事件進行計數。
在8051單片機中,振蕩器輸出使用12分頻網絡進行12分頻,然后作為時鐘信號饋入定時器。這意味著對于以12MHz運行的8051,定時器時鐘輸入將為1MHz。這意味著計時器每1uS前進一次,使用單個8051計時器可能的最大時間延遲為(2^16)x(1uS)=65536uS。比這更長的延遲可以通過使用定時器編寫一個基本的延遲程序然后循環它所需的時間來實現。我們將在本文的下一節中詳細了解所有這些。
一、使用8051單片機的定時器設計延遲程序
在8051中設計延時程序時,計算需要加載到TH和TL寄存器中的初始值是很重要的事情。讓我們看看它是如何完成的:
(1)假設處理器由12MHz晶振提供時鐘。
(2)這意味著,定時器時鐘輸入將為12MHz/12=1MHz
(3)這意味著,定時器增加一倍所用的時間=1/1MHz=1uS
(4)對于“X”uS的時間延遲,計時器必須使“X”遞增。
(5)2^16=65536是16位定時器可能的最大計數數。
(6)設TH是必須加載到TH寄存器的值,TL是必須加載到TL寄存器的值。
(7)然后,THTL=(65536-X)的十六進制等效值,其中(65536-X)被視為十進制。
二、使用8051單片機定時器產生1mS延遲的程序
下面的程序可用于產生1mS延遲,已被編寫為子程序,以便可以在程序的任何地方調用它。也可以將其置于循環中以創建更長的時間延遲(1mS的倍數)。這里使用了8051的定時器0,它在MODE1(16位定時器)下運行。
DELAY: MOV TMOD,#00000001B // Sets Timer 0 to MODE1 (16 bit timer). Timer 1 is not used
MOV TH0,#0FCH // Loads TH0 register with FCH
MOV TL0,#018H // LOads TL0 register with 18H
SETB TR0 // Starts the Timer 0
HERE: JNB TF0,HERE // Loops here until TF0 is set (ie;until roll over)
CLR TR0 // Stops Timer 0
CLR TF0 // Clears TF0 flag
RET
上面的延遲例程可以循環兩次以獲得2毫秒的延遲,如下面的程序所示:
MAIN: MOV R6,#2D
LOOP: ACALL DELAY
DJNZ R6,LOOP
SJMP MAIN
DELAY: MOV TMOD,#00000001B
MOV TH0,#0FCH
MOV TL0,#018H
SETB TR0
HERE: JNB TF0,HERE
CLR TR0
CLR TF0
RET
使用定時器時要記住的幾點:
(1)一旦設置了定時器標志(TF),程序員必須先將其清除,然后才能再次設置。
(2)定時器標志設置后定時器不會停止。程序員必須清除TR位才能停止定時器。
(3)一旦定時器溢出,程序員必須將初始起始值重新加載到TH和TL寄存器以開始向上計數。
(4)我們可以配置所需的計時器以在設置TF標志時創建中斷。
(5)如果沒有使用中斷,那么我們必須使用一些條件分支指令檢查定時器標志(TF)是否設置。
(6)使用單個8051定時器可能的最大延遲為65536uS,如果您使用12MHz晶體為單片機計時,則最小延遲為1uS。
三、使用8051單片機定時器生成方波
使用8051單片機定時器可以生成任何頻率的方波(受控制器規格限制)。該技術非常簡單。編寫一個延遲子程序,延遲等于方波時間周期的一半。使任何端口引腳為高電平并調用延遲子程序。延遲子程序完成后,將相應的端口引腳拉低,調用延遲子程序增益。子程序完成后,再次重復循環。結果將是所選端口引腳上所需頻率的方波。電路圖如下所示,它可以用于任何方波,但程序必須相應。不同方波的程序如下圖所示:
例1:1KHz方波。
MOV P1,#00000000B
MOV TMOD,#00000001B
MAIN: SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP MAIN
DELAY: MOV TH0,#0FEH
MOV TL0,#00CH
SETB TR0
HERE: JNB TF0,HERE
CLR TR0
CLR TF0
SETB P1.0
RET
END
例2:2KHz方波。
MOV P1,#00000000B
MOV TMOD,#00000001B
MAIN: SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP MAIN
DELAY: MOV TH0,#0FCH
MOV TL0,#018H
SETB TR0
HERE:JNB TF0,HERE
CLR TR0
CLR TF0
SETB P1.0
RET
END
例3:10KHz方波。
MOV P1,#00000000B
MOV TMOD,#00000001B
MAIN: SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP MAIN
DELAY: MOV TH0,#0FFH
MOV TL0,#0CEH
SETB TR0
HERE:JNB TF0,HERE
CLR TR0
CLR TF0
SETB P1.0
RET
END
-
定時器
+關注
關注
23文章
3237瀏覽量
114467 -
8051單片機
+關注
關注
5文章
153瀏覽量
25479
發布評論請先 登錄
相關推薦
評論