PIC单片机入门_定时器/计数器TMR0详解与实例
1.前言:
PIC 系列單片機內部配備有數量不等的定時器/計數器模塊:例如PIC17CX系列和PIC18CX系列都都配置了4個定時器/計數器模塊;而PIC16F87X系列都配置了3個定時器/計數器模塊,分別記為TMR0、TMR1和TMR2。
TMR0、TMR1和TMR2在電路上均不相同,而且用途也各有所異,但是三者也存在許多共同之處。這里主要介紹的是TMR0,TMRl和TMR2將在后面介紹。
其實定時器都是一個由時鐘信號觸發的遞增的計數器;都是從預先設定的初始值開始累計,在累計數超過最大值,或者超過預先設定的值時便產生溢出,并同時會建立一個相應的溢出標志(即中斷標志位)。 ? ? ? ?
2.TMR0的特性
①核心部分是一個8位寬,在時鐘信號上升沿觸發的循環累加計數寄存器TMR0;最大位數:256②TMR0是一個特殊功能寄存器,地址為01H或101H;
③有一個可選用的8位可編程分頻器;?
④信號源可以是內部時鐘信號源(定時器模式),也可以是外部時鐘信號源(計數器模式)。? ?? ⑤當使用外部觸發信號作為時鐘信號源時,可定義觸發方式,即上升沿觸發或下降沿觸發;
⑥具有溢出中斷功能。
3.與TMR0模塊相關的寄存器
與TMR0模塊有關的特殊功能寄存器有四個:8位的累加寄存器TMR0、中斷控制寄存器INTCON、選項寄存器OPTION_REG和端口RA方向控制寄存器TRISA,如下表所列。以上4個寄存器都是特殊功能寄存器,可以把它們當做普通RAM單元來進行讀寫訪問。我挑幾個起控制作用的寄存器進行介紹。
3.1?選項寄存器OPTION_REG ? ? ?
選項寄存器是一個可讀、寫的寄存器,與TMR0有關各位的含義如下:?
⑴PS2~PS0:分頻器分頻比選擇位。如下表所列: ⑵PSA:分頻器分配位。 ?1=分頻器分配給WDT;0=分頻器分配給TMR0。 ?
⑶T0SE:TMR0時鐘源觸發邊沿選擇位,只有當TMR0工作于計數器模式時,該位才有效。1=外部時鐘T0CKI下降沿觸發TMR0遞增;?0=外部時鐘T0CKI上升沿觸發TMR0遞增。 ⑷T0CS:TMR0的時鐘源選擇位;1=由T0CKI外部引腳輸入的脈沖作為TMR0時鐘源;0=由內部提供的指令周期信號作為TMR0時鐘源。
3.2?中斷控制寄存器INTCON
中斷控制寄存器也是一個可讀/寫的寄存器,與TMR0有關的各位的含義如下: ? ?
⑴T0IF:TMR0溢出標志位(也就是溢出中斷標志)。l=TMR0發生溢出;0=TMR0未發生溢出。
⑵T0IE:TMR0溢出中斷使能位。l=允許TMR0溢出后產生中斷; ? ?0=屏蔽TMR0溢出后產生中斷。
⑶GIE:全局中斷總使能位。1=允許CPU響應所有外圍設備產生的中斷請求;0=禁止CPU響應所有外圍設備產生的中斷請求。
3.3?端口RA方向控制寄存器TRISA(外部觸發引腳復用)
TRISA4:由于TMR0的外部輸入信號T0CKI與端口RA4是復合在同一條腳上的,當TMR0工作于計數模式時,要求該腳必須設置為輸入方式,作為T0CKI信號專用輸入引腳。1=引腳RA4設為輸入,以便從該腳送進T0CK1信號。4.TMR0的電路結構和工作原理
定時器/計數器TMR0的結構方框圖如圖所示:
在圖可以將整個電路按功能簡化為三個相對獨立的主要組成部分:計數寄存器TMR0、分頻器和看門狗定時器WDT。因為看門狗在電路上與TMR0之間共同分享同一個分頻器,于是兩者就有了同時出現在同一張圖上。
4.1?分頻器
看門狗定時器WDT與TMR0共同分享一個分頻器,但兩者不能同時使用。即在同一時刻,分頻器只能分配給兩者中之一。分頻器也是一個8位累加計數器,不過它不能像TMR0那樣直接進行讀、寫操作,它只能配合TMR0或WDT起分頻作用。當PSA=0時,分頻器歸TMR0所有,進入累加器TMR0的時鐘信號,都要先經過分頻器;而當PSA=1時,分頻器與TMR0隔離,進入TMR0的時鐘信號,不再經過分頻器。
當分頻器分配給TMR0時,任何以TMR0為目標的寫操作指令(如CLRF TMR0 , MOVWF TMR0 )都會將分頻器清0;當分頻器分配給WDT時,執行CLRWDT的指令將會同時將其分頻器清零。注意分頻器清零時,而分頻比和分配對象并不會改變。
4.2?TMR0 累加計數寄存器
定時器/計數器TMR0 既可以作為定時器使用,也可以作為計數器使用,即TMR0有定時和計數兩種工作模式。
兩種模式的差異就是進入TMR0的時鐘信號源不同,TMR0的工作模式由T0CS位,即選項寄存器OPTION_REG位5決定。
1.定時器模式: 當T0CS=0時,TMR0為定時器模式, TMR0的觸發信號來自于內部的指令周期信號。在定時器模式下,一旦往TMR0中寫入初始值,TMR0便啟動累加計數。未使用分頻器時,TMR0會在每個指令周期信號到來時自動加1;使用了分頻器時,TMR0會在收到n個指令周期信號后自動加1, n 由分頻比決定。
2.計數器模式:工作在計數器模式時,T0SE位決定了外部時鐘信號的觸發邊沿:T0SE=1,下降沿觸發;T0SE=0,上升沿觸發。TMR0工作于計數器模式時,一旦往計數寄存器中寫入初始值后,TMR0立即開始新一輪的累加計數。
沒有使用分頻器時,TMR0會在每個T0CKI信號的上升沿或下降沿到來時自動加1。在此模式下,外部隨機送入的脈沖信號和內部的工作時鐘之間存在一個同步的問題。也就是說,并不是外部觸發信號一進入,TMR0就立即加1,而是要經過一個同步邏輯,外部信號與系統時鐘同步之后,方能進入累加計數器TMR0,引發 一次加1操作。
5.TIMER0應用實例
前面介紹了用軟件方式實現延時,下面利用定時器TMR0來實現硬件延時。把PIC單片機演示板上的8只LED發光二極管,設計為輪流發光,也就是在下圖所示 16 個狀態間輪流切換,并且在各個狀態之間切換時,插入256 ms的延時。
8只LED的亮滅規律符合數據結構中的隊列操作規則:“最先移入隊列的亮燈,最先移出隊列”。即開始亮燈的順序是:LED0→ LED1 LED0 →…. LED7… LED0 。熄燈的順序也是以上順序。?
軟件設計:
⒈延時時間設計:
?當8個LED在16個狀態之間切換時,要插入256 ms的延時;每個燈在發光時有閃爍,即每個燈不斷在“亮-滅”, “亮-滅”之間的延時為64 ms ,這些延時要求由TMR0產生。
⒉ ?定時器/計數器TMR0控制字設計:
將分頻器配置給TMR0使用,即PSA=0;分頻比設定為最大(1:256),即PS2~PS0=111;那么OPTION_REG=07H (00000111B)。
TMR0的初值X計算(假設Tcyc=1μs) :
? ? ? ? ? ? ? ? ?256*(256-X)*Tcyc =64000μs
? ? ? ? ? ? ? ? ?X=256-64000/256=6 (關鍵是要找到這個初值,啟動定時器的時候,把它裝進去)
⒊設計一個查表子程序READ ,在表中預先存儲要顯示的狀態, LED顯示碼可以調用READ獲取。
⒋程序流程圖如下:
程序清單:
TMR0 EQU 01H ;定義寄存器的位置 PCL EQU 02H ;定義程序計數器低字節寄存器地址 STATUS EQU 03H ;定義狀態寄存器地址 OPTION EQU 81H ;定義選項寄存器位置 INTCON EQU 0BH ;定義中斷寄存器位置 PORTC EQU 07H ;定義PORTC的存儲位置 TRISC EQU 87H TMR0B EQU 6 ;定義TMR0寄存器初始值 COUNT EQU 20H ;定義一個計數器變量 RP0 EQU 5 ;定義RAM的頁選位RP0 ORG 000H BSF STATUS, RP0 ;轉向RAM的體1MOVLW 00H ;將端口C設為輸出 MOVWF TRISC ;**********TMR0延時子程序(64 MS)************* DELAY BCF INTCON,2 ;清除TMR0溢出標志位MOVLW TMR0B ;TMR0賦初值MOVWF TMR0 ; <strong><span style="color:#ff0000;">并重新啟動定時計數</span></strong> LOOP1 BTFSS INTCON,2 ;檢測TMR0溢出標志位GOTO LOOP1 ; 沒有溢出,循環檢測RETURN ; 子程序返回 ;********** 讀取顯示信息的查表子程序************ READADDWF PCL,1 ; 地址偏移量加當前PC值RETLW B'00000001' ;顯示信息碼,下同RETLW B'00000011'RETLW B'00000111 ' RETLW B'00001111' RETLW B'00011111'RETLW B'00111111' RETLW B'01111111'RETLW B'11111111'RETLW B'11111110'RETLW B'11111100'RETLW B'11111000'RETLW B'11110000'RETLW B'11100000'RETLW B'11000000'RETLW B'10000000'RETLW B'00000000'END
總結
以上是生活随笔為你收集整理的PIC单片机入门_定时器/计数器TMR0详解与实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS中调用短信和邮箱的方法
- 下一篇: 免费共享给大家一些免费的代理服务器(包括