新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機學(xué)習(xí)之十六:定時器應(yīng)用3(模式3)

單片機學(xué)習(xí)之十六:定時器應(yīng)用3(模式3)

作者: 時間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
一、實驗現(xiàn)象:

本文引用地址:http://butianyuan.cn/article/201611/315890.htm

在P0.0和p0.1分別輸出一個周期是200us和400us的方波信號。

二、實驗?zāi)康?/p>

掌握內(nèi)部定時/計數(shù)器作定時功能(模式3)的應(yīng)用

三、實驗任務(wù)分析:

在這個試驗里面,要同時產(chǎn)生兩個方波信號。我們可以采用和上面一個試驗類似的方法,讓T0、T1都工作于模式2,分別產(chǎn)生兩個方波信號,但是這樣要同時占用兩個定時器的資源,比較浪費。

由于T0還有一種工作方式,就是可以分為兩個8位的計數(shù)器tl0和th0,所以我們就采用這個模式3來產(chǎn)生兩個方波信號。(注:這種工作模式只適用于T0,如果把定時器T1定義為模式3的時候,T1是停止計數(shù)的。)

T0工作于模式3的邏輯圖如下圖所示:

從圖上我們可以看到,tl0使用T0的狀態(tài)控制位:gate 、c/t、 tr0、tf0;而th0使用的是T1的狀態(tài)控制位tr1和tf1,并占用T1的中斷源。

所以,啟動tl0應(yīng)該是:setb tr0;而啟動th0則是:setb tr1

另外,th0產(chǎn)生計數(shù)溢出的時候,是置位tf1,所以th0的溢出中斷入口應(yīng)該是T1的中斷入口001bh。

我們用tl0產(chǎn)生100us定時,計數(shù)初值是156;用th0產(chǎn)生200us定時,計數(shù)初值是56,該程序如下:

四、實驗程序

org 0000h

ajmp main

org 000bh ;T0溢出中斷入口地址

ajmp time0

org 001bh

ajmp time1 ;T1溢出中斷入口地址

org 0020h

main: clr p1.5

mov sp,#70h ;設(shè)置堆棧

mov tmod,#03h ;設(shè)置T0為定時方式,工作于模式3

mov tl0,#156 ;tl0置計數(shù)初值

mov th0,#56h ;th0置計數(shù)初值

setb et0 ;允許TL0溢出中斷

setb et1 ;允許TH0溢出中斷

setb ea ;cpu開中斷

setb tr0 ;啟動TL0計數(shù)

setb tr1 ;啟動TH0計數(shù)

ajmp $ ;等待

time0:mov tl0,#156 ;tl0定時時間到,重新裝入計數(shù)初值

cpl p0.0 ;P0.0取反

reti

time1:mov th0,#56 ;th0定時時間到,重新裝入計數(shù)初值

cpl p0.1 ;P0.1取反

reti

end

五、幾點說明

1、當(dāng)T0工作于模式3的時候,T1可以工作于模式0、模式1、模式2、串行口的波特率發(fā)生器、或者不需要中斷的場合(由于這時T1的中斷資源被TH0占用)。

2、大家如果用示波器看了上一個試驗中周期為500us的波形,和這個試驗的周期分別為200us和400us的波形,就會發(fā)現(xiàn)一個問題。在上一個試驗中,產(chǎn)生的500us信號非常標(biāo)準(zhǔn),但是這個試驗里面200us的信號約有14us的誤差,而400us的約有26us的誤差,這是為什么呢?

由于上一個試驗中進(jìn)入中斷后計數(shù)值是自動重裝的,所以產(chǎn)生的定時非常標(biāo)準(zhǔn)。而在這個試驗中,由于每次進(jìn)入中斷都要手動重裝計數(shù)值,所以就會相應(yīng)的產(chǎn)生誤差。同時,由于400us剛好是200us的兩倍,每進(jìn)入兩次tl0的中斷才會進(jìn)入一次th0的中斷,所以th0的誤差約為tl0的兩倍。大家如果把兩個信號的周期分別改為200us和300us,就會發(fā)現(xiàn)兩者的誤差基本一致拉。



關(guān)鍵詞: 單片機定時器模式

評論


技術(shù)專區(qū)

關(guān)閉