天天看點

《51單片機應用開發從入門到精通》——2.9 交通燈執行個體

本節書摘來自異步社群《51單片機應用開發從入門到精通》一書中的第2章,第2.9節,作者 張華傑,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

定時器/計數器是單片機中最常用、最重要的功能子產品之一,本節通過交通燈控制器執行個體來示範定時器的使用方法,并複習如何使用上節學習的散轉程式。

本節首先介紹交通燈的基礎知識以及定時器/計數器的基礎知識,接着介紹本執行個體的硬體電路構成,然後逐漸分析定時器的程式設計以及程式的全貌,最後将總結一下本執行個體的技巧與注意點。

交通燈控制器執行個體主要使用了8051單片機的定時器/計數器,本執行個體的基礎知識主要包括:交通燈的變化規律、定時器/計數器的概念、定時器/計數器的相關寄存器、定時器/計數器的4種工作方式以及定時器/計數器的程式設計。下面就從這幾個方面進行 介紹。

1.交通燈的變化規律

本執行個體是交通燈控制器,是以先介紹交通燈的變化規律。

假設一個十字路口為東西南北走向。初始狀态為狀态1南北方向綠燈通車,東西方向紅燈。經過過一段時間(20秒)轉換到狀态2,南北方向綠燈閃幾次轉亮黃燈,延時3秒,東西方向仍然紅燈。再轉換到狀态3,東西方向綠燈通車,南北方向紅燈。過一段時間(20秒)轉換到狀态4,東西方向綠燈閃幾次轉亮黃燈,延時3秒,南北方向仍然紅燈。最後循環至狀态1。

2.定時器/計數器的概念

8051單片機内有兩個可程式設計的定時器/計數器t0、t1。

當定時器/計數器用作“定時器”功能時,每經過1個機器周期(12個時鐘周期),計數器加1。

當定時器/計數器用作“計數器”功能時,計數器在對應的外部輸入管腳(t0為p3.4引腳,t1為p3.5引腳)上每發生一次1到0的跳變時加1。使用“計數器”功能時,外部輸入每個機器周期被采樣一次。當某一周期管腳狀态采樣為高而下一周期采樣為低時,計數器加1。由于檢測下降沿跳變需要兩個機器周期(24個時鐘周期)的時間,是以計數頻率最大值隻能為時鐘周期的1/24。計數器對外部輸入信号的占空比并無限制,但為了保證給定的電平信号在其改變之前至少被采樣一次,外部輸入信号必須至少保持一個完整的機器周期。

3.定時器/計數器的相關寄存器

與定時器/計數器相關的寄存器有定時器/計數器工作方式寄存器(tmod)、定時器/計數器控制寄存器(tcon)。tcon已經在2.5節受控輸出執行個體中介紹過,在本例中主要介紹tmod寄存器。

定時器/計數器工作方式寄存器(tmod),位元組位址89h,不可進行位尋址。tmod的格式如圖2-13所示。

《51單片機應用開發從入門到精通》——2.9 交通燈執行個體

定時器/計數器工作方式寄存器(tmod)的8位分為兩組,高4位控制t1,低4位控制t0。tmod每一位的功能如下:

gate:門控位。

gate = 0,僅由運作控制位trx(x = 0,1) = 1來啟動定時器/計數器運作;

gate = 1,由運作控制位trx(x = 0,1) = 1和外部中斷引腳上的高電平共同來啟動定時器/計數器運作。 - c/t:定時器模式和計數器模式選擇位。

c/t = 0,為定時器模式;

c/t = 1,為計數器模式。 - m1、m0:工作方式選擇位。m1、m0的4中編碼對應4種工作方式,對應關系見表2-11。

《51單片機應用開發從入門到精通》——2.9 交通燈執行個體

4.定時器/計數器的4種工作方式

定時器/計數器的4種工作方式下的邏輯結構如表2-12所示。

《51單片機應用開發從入門到精通》——2.9 交通燈執行個體
《51單片機應用開發從入門到精通》——2.9 交通燈執行個體
《51單片機應用開發從入門到精通》——2.9 交通燈執行個體
《51單片機應用開發從入門到精通》——2.9 交通燈執行個體

(1)方式0

定時器/計數器的工作方式0稱為13位定時器/計數器。它是由tlx的低5位和thx的8位構成13位的計數器,此時tlx的高3位未使用。該工作方式是為了和48系列單片機相容而設計的一種工作方式,一般情況下一般不使用方式0進行定時/計數。方式0的控制方式與方式1完全相同,下面重點介紹方式1的控制方式。

(2)方式1

定時器/計數器的工作方式1稱為16位定時器/計數器。它由tlx和thx構成,tlx計數溢出向thx進位,thx計數溢出置位tcon中的溢出标志位tfx。

gate位的狀态決定定時器/計數器運作控制取決于trx一個條件還是trx和intx引腳這兩個條件。當gate = 0時,則隻要trx被置為1,定時器/計數器即被允許計數(定時器/計數器的計數控制僅由trx的狀态确定,trx = 1計數,trx = 0停止計數)。當gate = 1時,定時器/計數器是否計數由intx輸入的電平和trx的狀态共同确定:當trx = 1,且intx = 1時,才允許定時器/計數器計數(定時器/計數器的計數控制由trx和intx兩個條件控制)。

(3)方式2

定時器/計數器的工作方式0和方式1在計數溢出後,計數器的值為0,需要通過程式重新裝入計數初值。

定時器/計數器的工作方式1稱為初值自動重裝的8位定時器/計數器。在該工作方式下,tlx作為計數器,當tlx計數溢出時,在置1溢出标志tfx的同時,還自動地将thx中的常數送至tlx,使tlx從該常數開始重新計數。這種工作方式可以省去使用者軟體中重裝常數的程式,簡化定時常數的計算方法(确定計數初值),可以相當精确地确定定時時間。

(4)方式3

工作方式3僅對定時器/計數器0有效,在該工作方式下,定時器/計數器0被拆成2個獨立的定時/計數器:tl0、th0。tl0使用t0的狀态控制位c/t、gate、tr0、int0,而th0被固定為一個8位定時器(不能用作外部計數方式),并使用定時器/計數器1的狀态控制位tr1和tf1,同時占用定時器t1的中斷源。此時,定時器/計數器1可設定為方式0、方式1和方式2,作為串行口的波特率發生器。

注意:此時,定時器/計數器1也可作為定時器,用于不需要中斷的場合。

5.定時器/計數器的程式設計

(1)初始化

定時器/計數器的初始化程式設計包括以下幾個部分:

根據要求給定時器/計數器方式寄存器(tmod)送一個方式控制字,以設定定時器/計數器的工作方式。

根據需要給th和tl寄存器送初值,以确定需要的定時時間或計數的初值。

根據需要給中斷允許寄存器(ie)送中斷控制字,以開放相應的中斷和設定中斷優先級。

注意:也可用查詢方式來響應定時器。

給tcon寄存器送指令字以啟動或禁止定時/計數器的運作。

(2)定時器/計數器初值的計算

計數器初值:

設計數器的模值為m,所需的計數值為c,計數初值設定為tc,則

tc = m-c(m = 213、216或28)。 - 定時器初值:

設定時器的模值為m,需要的定時時間為t,定時器的初值設定為tc,則

tc = m-t/t 機器周期(m = 213、216或28)。

本執行個體硬體電路如圖2-14所示,使用6隻led模拟兩組紅綠燈:vd1、vd2、vd3分别模拟南北方向的紅燈、黃燈、綠燈,vd4、vd5、vd6分别模拟東西方向的紅燈、黃燈、綠燈。

《51單片機應用開發從入門到精通》——2.9 交通燈執行個體

交通燈控制器執行個體使用了8051單片機的定時器/計數器,軟體程式設計部分首先分定時器初始化、定時器中斷服務程式兩個部分介紹定時器/計數器的軟體程式設計。然後介紹如何在畫出程式流程圖的基礎上編寫軟體程式,并給出了完整的交通燈控制器程式執行個體。

1.定時器初始化

為了使定時時間準确,不出現因為定時器重裝而引起的累計誤差,将定時器設定為初值自動重裝的8位定時器/計數器,即定時器工作在工作方式2。在12mhz晶振條件下,8位定時器的最長定時時間為0.256毫秒,為了友善計算取定時時間為0.25毫秒,這樣,定時0.5秒鐘需要定時器中斷2000次。

下面計算定時器的初值。定時器初值tc = m-t/t_機器周期_=__28-250/1 = 6,是以th0 = 06h,tl0 = 06h。

以下為定時器初始化程式執行個體,定時器t0設定為工作方式2,初始值為06h,自動重裝入值為06h。

2.定時器中斷服務程式

定時器中斷服務程式執行個體如下:

每0.25毫秒定時器中斷發生,程式跳轉到中斷服務程式t0_int開始執行。中斷服務程式每次将定時器中斷計數變量減1,當定時器中斷計數變量為0時,0.5秒定時時間到,将位變量second_flag置1。定時器中斷服務程式通過reti指令傳回,程式将跳轉到進入中斷前的斷點繼續執行。

3.程式流程圖

在前面幾節中,程式較為簡單,可以直接進行程式的編寫,但本執行個體的程式流程比較複雜,在編寫程式之前,應當先畫出程式流程圖。在編寫複雜的程式之前畫出程式流程圖,有助于理清思路,友善程式設計,應當養成編寫程式前畫程式流程圖的良好 習慣。

程式流程圖是描述程式運作流程的一種圖表。它不僅描繪程式從頭至尾的運作順序,也描述了程式運作過程中的所有可能的狀況。一般程式流程圖包含的基本元素如表2-13所示。

《51單片機應用開發從入門到精通》——2.9 交通燈執行個體

本執行個體的程式流程圖如圖2-15所示。

《51單片機應用開發從入門到精通》——2.9 交通燈執行個體

4.程式全貌

本執行個體以交通燈控制器為例介紹了8051單片機定時器/計數器的使用方法,通過本執行個體應注意以下的幾個技巧。

定時器的初始化以及定時時間的計算。

定時器的中斷服務程式的編寫應注意現場保護和現場恢複的操作;中斷服務程式通過reti指令傳回;中斷服務程式應當盡量簡短。

在編寫複雜的程式前,畫程式流程圖可以理清思路,使程式設計事半功倍。

繼續閱讀