51單片機定時器程式設計

  • 2020 年 3 月 17 日
  • 筆記

在我們的DIY電子時鐘里,需要用到單片機定時器來做秒的顯示,說是顯示,其實就是實現數碼管上「:」點的閃爍。這裡初步定義為每秒亮1次,亮0.5秒,滅0.5秒。實現顯示秒的功能。這裡也可以用DS1302的秒數據來做,但是實現起來麻煩,達到一樣的效果,我們追求的是程式越簡單越好,所以在此我們用單片機定時器來實現。

我們DIY時鐘板子上的單片機為STC15W408AS,單片機自帶IRC可調時鐘和搞可靠複位,為了降低功耗(工作頻率越低,功耗越小),本時鐘採用12M的工作頻率(燒寫程式是在軟體上選擇),那當定時器工作在12T模式下時,一個機械周期就是1us。

接下來我們就該看看單片機的數據手冊了。以下是今天我們需要關注的暫存器:

TCON為定時器T0和T1的控制暫存器,可以位定址(直接操作位);TMOD是T0、T1工作方式控制暫存器,不可以位定址(只能操作暫存器),高四位控制T1,低四位控制T0;定時器的工作方式由TOMD暫存器中的M1和M0選擇,具體如上圖。

本例中我們要用T0實現1秒的定時時間,這裡我們用T0工作在方式0,也就是16位的自動重載方式(傳統的51單片機只有8位的自動重載,需要做高精度的定時時最好用自動重載方式)。我們不需要外部中斷來開啟定時器,所以GATE位=0,T0工作在定時模式,CT=0,所以我們TMOD暫存器的值為0x00;在TCON暫存器里和T0相關的位有TF0和TR0;TF0=0:T0中斷標誌位,當定時器中斷產生是,TF0自動置位,CPU相應中斷後硬體自動清零;TR0=1:開啟定時器,相當於定時器的開關。

除了這些暫存器外,定時器溢出後,也會產生中斷,所以還需要去設置中斷部分:

EA=1:,開啟總中斷,相當於中斷總開關;ET0=1;開啟定時器T0中斷,相當於中斷的子開關,只有中斷的總開關和相應的子開關都開啟後,CPU才能相應中斷訊號,具體請看中斷部分數據手冊。我們用的STC15W系列單片機屬於增強型單片機,為了和傳統51單片機兼容,還專門設有一個暫存器AUXR,此暫存器可設置T 0工作在1T還是12T模式,此處我們讓T0工作在12T模式下,AUXR=0x00。最後就是定時器的初值暫存器了,我們需要定時的時間是500ms,16位的定時器再12M頻率下最大定時時間為65535us,而我們需要的是500ms,明顯達不到,那我們就需要做組合定時的方式,這裡我們設定定時器的中斷頻率為10ms,那我們中斷1次後在中斷函數里將某個變數加1,當變數加到50的時候就是500ms,當變數加到100的時候就是1s了。這就是我們實現1s定時的思路。

具體實現程式如下:

如上圖中程式所示,定時器初始化時設置T0位16位自動重載模式,工作在12T模式,初值10ms,開啟定時器,開啟中斷。這樣定時器就工作了;在定時器中斷函數里,每次進入中斷後我們就給變數T_a自加1,當變數小於50的時候(小於500ms),讓D=1(D即為我們電路中控制秒顯示的那兩個點,高電平有效),大於50小於100的時候D=0,關閉秒顯示。這樣一來就實現了秒顯示在1秒內亮500ms,滅50ms了。上圖中中斷函數名後面的interrupt 1這是中斷函數的入口地址,C語言中叫中斷號(為小白說明,老司機略過),具體的個中斷對應的入口地址對照表如下圖(部分):

Tags: