概述
在程序設(shè)計(jì)中我們經(jīng)常會(huì)用到延時(shí),對(duì)于精度要求不高的應(yīng)用來(lái)說(shuō)我們一般采用插入語(yǔ)句等待的方式來(lái)實(shí)現(xiàn),對(duì)于精度高的應(yīng)用來(lái)說(shuō)我們一般采用定時(shí)器中斷來(lái)實(shí)現(xiàn)。本章主要內(nèi)容包括:
- 延時(shí)時(shí)間的調(diào)試
- 定時(shí)器功能介紹
- 定時(shí)器應(yīng)用實(shí)例介紹
6.1延時(shí)調(diào)試
前面程序中用到的延時(shí)通過(guò)執(zhí)行多條語(yǔ)句來(lái)實(shí)現(xiàn)的,那么我們會(huì)問(wèn)執(zhí)行一條語(yǔ)句需要多長(zhǎng)時(shí)間,延時(shí)1ms又需要多少條語(yǔ)句,延時(shí)的精度高嗎?下面講解的內(nèi)容將包含以上內(nèi)容。眾所周知,晶振為單片機(jī)提供了時(shí)間基準(zhǔn),在晶振的節(jié)拍下程序按時(shí)間順序往下執(zhí)行,在單片機(jī)應(yīng)用中有三個(gè)重要的時(shí)間概念,分別為時(shí)鐘周期、機(jī)器周期和指令周期。
時(shí)鐘周期: 單片機(jī)晶振頻率的倒數(shù),例如開(kāi)發(fā)板的板載晶振為11.0592MHz,時(shí)鐘周期為1/11.0592us,是51單片機(jī)的最基本,最小的時(shí)間單位。
機(jī)器周期: 單片機(jī)完成一條最基本指令操作所需要的時(shí)間,51單片機(jī)的一個(gè)機(jī)器周期等于12個(gè)時(shí)鐘周期,RY-51開(kāi)發(fā)板機(jī)器周期:12/11.0592us=1.09us。
指令周期: 執(zhí)行一條指令所需的時(shí)間,一般由若干個(gè)機(jī)器周期組成。當(dāng)然根據(jù)指令的不同所需的機(jī)器周期也不同,只需一個(gè)機(jī)器周期的簡(jiǎn)單指令,稱(chēng)之為單周期指令,包含兩個(gè)機(jī)器周期的指令稱(chēng)之為雙周期指令。
以RY-51單片機(jī)開(kāi)發(fā)板為例,執(zhí)行一條最簡(jiǎn)單的語(yǔ)句需要至少1.09us,復(fù)雜的語(yǔ)句需要多個(gè)1.09us來(lái)實(shí)現(xiàn)。因此,我們常常在程序中通過(guò)添加數(shù)目不等的簡(jiǎn)單語(yǔ)句來(lái)實(shí)現(xiàn)延時(shí),但是延時(shí)的精度往往不會(huì)太高,我們可以通過(guò)keil軟件的仿真功能來(lái)確定延時(shí)的大概數(shù)值。接下來(lái)講解延時(shí)函數(shù)仿真功能,我們以延時(shí)10ms為例進(jìn)行介紹。
#include< reg52.h >
sbit led0 = P1^0;//LED小燈管腳定義
sbit FM = P2^4;//蜂鳴器管腳位定義
sbit Key17 = P3^0;//獨(dú)立按鍵管腳定義
void delayms(unsigned int z)//延時(shí)函數(shù)
{
unsigned int x,y;
for(x=z;x >0;x--)
for(y=70;y >0;y--);
}
void main()
{
while(1)
{
delayms(10);//延時(shí)10ms
delayms(10);//延時(shí)10ms
delayms(10);//延時(shí)10ms
}
}
首先,根據(jù)前面介紹的步驟建立一個(gè)工程,并編輯好如上所示的代碼。這個(gè)代碼和前面講解的代碼有點(diǎn)不同,我們先把延時(shí)的語(yǔ)句寫(xiě)成一個(gè)函數(shù)delayms(),將其放在主程序之外。在主程序中調(diào)用函數(shù)來(lái)實(shí)現(xiàn)延時(shí)。改變延時(shí)函數(shù)的輸入參數(shù)便可改變延時(shí)語(yǔ)句的條數(shù),因此延時(shí)變得非常的靈活。主程序中我們對(duì)延時(shí)函數(shù)進(jìn)行了三次調(diào)用,接下來(lái)我們看看執(zhí)行一次函數(shù)調(diào)用需要多長(zhǎng)時(shí)間。
在keil軟件快捷按鈕菜單欄中找到配置,點(diǎn)擊進(jìn)入如下圖所示的子菜單:
如上圖所示,在”Target”目錄先將仿真晶振設(shè)置為“11.0592”。
如圖所示,在“C51”目錄下將代碼優(yōu)化等級(jí)設(shè)置為“0:Constant folding”。
設(shè)置好如上規(guī)則后,點(diǎn)擊菜單欄的debug快捷鍵如下圖所示,進(jìn)入調(diào)試模式,可以看到程序進(jìn)程已經(jīng)執(zhí)行到了第17條代碼。
接下來(lái)給17,18,19三條語(yǔ)句設(shè)置斷點(diǎn),將鼠標(biāo)移到語(yǔ)句處點(diǎn)擊右鍵選擇“insert/Remove Breakpoint”,設(shè)置好之后語(yǔ)句左邊會(huì)出現(xiàn)紅色的小方塊。當(dāng)程序執(zhí)行到斷點(diǎn)時(shí),程序便會(huì)停止下來(lái)。
如圖6-5所示,當(dāng)程序順序執(zhí)行的黃色箭頭停留在第17行時(shí),所使用的時(shí)間為:0.00042209s,如圖左側(cè)所示。
點(diǎn)擊如圖6-6左上角的程序執(zhí)行快捷鍵,程序進(jìn)程黃色箭頭停留在第18行,即執(zhí)行完了一條延時(shí)函數(shù)語(yǔ)句delayms(10),觀察左下角的進(jìn)程時(shí)間為:0.01057943s將執(zhí)行語(yǔ)句前后時(shí)間相減,結(jié)果約等于10.1ms,因此與我們延遲10ms的要求相符。
通過(guò)調(diào)用函數(shù)實(shí)現(xiàn)延時(shí)的方法在單片機(jī)編程中是非常常見(jiàn)的,經(jīng)過(guò)上面的延時(shí)調(diào)試可見(jiàn)這種方法的精度并不是很高,對(duì)應(yīng)特殊應(yīng)用場(chǎng)合我們一般采用定時(shí)器的方式實(shí)現(xiàn)。
6.2定時(shí)器介紹
定時(shí)器的功能很容易理解,就是到了某個(gè)指定的時(shí)間會(huì)提示設(shè)定者,我們平常使用的鬧鐘實(shí)際上可看作是一個(gè)定時(shí)器。定時(shí)器是單片機(jī)的重要資源,那么我們什么時(shí)候會(huì)使用到單片機(jī)的定時(shí)器功能呢?正常情況下我們一直在運(yùn)行單片機(jī)的主程序,在主程序中假設(shè)我們需要1s之后去執(zhí)行某個(gè)操作,這時(shí)我們只好在主程序中進(jìn)行延時(shí),直到1s時(shí)間到了再去執(zhí)行相應(yīng)的操作,那么在這個(gè)延時(shí)的過(guò)程中主程序別的事情干不了了,這樣就很浪費(fèi)系統(tǒng)的資源。
如果我們這個(gè)時(shí)候使用定時(shí)器功能就可以很好的解決這個(gè)問(wèn)題。首先,我們?cè)谥鞒绦蛑性O(shè)定定時(shí)器定時(shí)1s,并啟動(dòng)定時(shí)器開(kāi)始計(jì)時(shí),因?yàn)槎〞r(shí)器的運(yùn)行和單片機(jī)的主程序執(zhí)行是分開(kāi)的,不會(huì)相互影響,因此主程序繼續(xù)往下執(zhí)行。當(dāng)1s的時(shí)間到了,定時(shí)器告訴主程序,這個(gè)時(shí)候主程序停下當(dāng)前正在干的活而去響應(yīng)定時(shí)器。
STC89C52系列單片機(jī)內(nèi)置2個(gè)16位的定時(shí)器,同時(shí)也可以當(dāng)作計(jì)數(shù)器來(lái)用,分別為定時(shí)器0(T0),定時(shí)器1(T1),每個(gè)定時(shí)器有4種工作方式。那么定時(shí)器是如何計(jì)時(shí)的呢?我們以定時(shí)器T0工作在16位模式下進(jìn)行介紹。16位的二進(jìn)制的最大值為:0b1111,1111,1111,1111=65535。首先,我們需要給這個(gè)16位的寄存器賦初始值,假設(shè)為1000,當(dāng)我們?cè)谥鞒绦蛑袉?dòng)定時(shí)器T0,此時(shí)這個(gè)寄存器會(huì)每12個(gè)時(shí)鐘周期從1000開(kāi)始往上加1,直到加到65535,當(dāng)再加1后,定時(shí)器T0就溢出了,寄存器值從65535變成0,當(dāng)溢出后定時(shí)器會(huì)告訴主程序,定時(shí)時(shí)間到了。所以我們只要改變這個(gè)初始值1000就可以得到不同的定時(shí)時(shí)間了。細(xì)心的同學(xué)可能會(huì)發(fā)現(xiàn),當(dāng)初始值為0的時(shí)候可以定時(shí)的時(shí)間最長(zhǎng)。那么我們來(lái)看看定時(shí)器T0工作在16位模式下最長(zhǎng)能定時(shí)多久。我們開(kāi)發(fā)采用的時(shí)鐘頻率為11.0592MHz,因此,每12個(gè)時(shí)鐘周期時(shí)間為:12/11.0592us=1.09us。啟動(dòng)定時(shí)器后,從初始值0累加到65535再到溢出為0,總共累加了65536次。因此,最大定時(shí)長(zhǎng)度為:1.09us*65536=71.4ms。
6.3定時(shí)器使用
前面介紹了51系列單片機(jī)中定時(shí)器的工作原理,這節(jié)將重介紹定時(shí)器的使用。前面介紹過(guò)單片機(jī)的某個(gè)功能的實(shí)現(xiàn)都有特殊功能寄存器SFR有關(guān),當(dāng)然定時(shí)器的使用也不例外,特殊功能寄存器列表如下表所示:
表6-1 定時(shí)器/計(jì)數(shù)器特殊功能寄存器列表
TCON是一個(gè)8位定時(shí)器/計(jì)數(shù)器中斷控制寄存器,可位尋址,即每一位可單獨(dú)賦值。B7、B6為定時(shí)器T1控制位,B5、B4為定時(shí)器T0控制位,如下表所示:
表6-2 TCON寄存器
TF0:定時(shí)器/計(jì)數(shù)器0中斷溢出標(biāo)志位。T1被允許計(jì)數(shù)后,從初始值開(kāi)始加1計(jì)數(shù)。當(dāng)最高位產(chǎn)生溢出時(shí)由硬件置“1”TF0,向CPU請(qǐng)求中斷,一直保持到CPU響應(yīng)中斷時(shí),才由硬件清零“0”TF0,另外,TF0也可由程序查詢(xún)清零“0”。
TF1:定時(shí)器/計(jì)數(shù)器1中斷溢出標(biāo)志位。功能與TF0類(lèi)似。
TR0:定時(shí)器T0的運(yùn)行控制位。該位由軟件置位和清零。當(dāng)TR0=1時(shí)就允許T0開(kāi)始計(jì)數(shù)。
TR1:定時(shí)器T1的運(yùn)行控制位。該位由軟件置位和清零。當(dāng)TR1=1時(shí)就允許T1開(kāi)始計(jì)數(shù)。
其它位為外部中斷相關(guān)內(nèi)容,與定時(shí)器功能無(wú)關(guān),這里暫時(shí)不做介紹。
前面講的這幾個(gè)位是定時(shí)器中斷控制位,TR0賦值為1后,定時(shí)器T0開(kāi)始運(yùn)行,當(dāng)定時(shí)器T0溢出時(shí),單片機(jī)硬件會(huì)將TF0位置1。我們可以在程序中通過(guò)查詢(xún)這個(gè)位是否為1來(lái)確定定時(shí)是否到達(dá)。另外,我們?nèi)绻O(shè)置了定時(shí)器中斷函數(shù),當(dāng)定時(shí)到達(dá)后,單片機(jī)程序會(huì)跳轉(zhuǎn)到定時(shí)器中斷函數(shù),并且由硬件將TF0清零。
TCON是一個(gè)可位尋址的寄存器,在單片機(jī)程序中可以直接對(duì)TCON賦值,或者對(duì)其中的位進(jìn)行直接賦值。
圖6-7 定時(shí)器模式寄存器
TMOD為定時(shí)器模式寄存器,寄存器的高4位為定時(shí)器1模式位,低四位為定時(shí)器0模式位,高低位的功能類(lèi)似,下面以定時(shí)器0為例:
C/T:定時(shí)器、計(jì)數(shù)器功能選擇位。清零作為定時(shí)器,置1作為計(jì)數(shù)器。
表6-3 模式選擇
定時(shí)器/計(jì)數(shù)器功能原理圖如下圖所示:
圖6-8 定時(shí)器/計(jì)數(shù)器功能原理圖
如上圖所示,當(dāng)作為定時(shí)器或計(jì)數(shù)器時(shí)唯一的區(qū)別為輸入的時(shí)鐘不一樣。當(dāng)作為定時(shí)器時(shí),輸入的時(shí)鐘為系統(tǒng)時(shí)鐘,而當(dāng)作定時(shí)器時(shí),系統(tǒng)輸入時(shí)鐘為外部引腳。
6.4定時(shí)器應(yīng)用實(shí)例
本節(jié)我們介紹定時(shí)器的兩種應(yīng)用實(shí)例進(jìn)行介紹,第一種為程序查詢(xún)方式響應(yīng)定時(shí)器的溢出,第二種為中斷函數(shù)處理的方式響應(yīng)定時(shí)器溢出。應(yīng)用定時(shí)器實(shí)現(xiàn)的功能為每隔50ms使led0小燈閃爍一次,并使用定時(shí)器T0,工作在模式1,即16位定時(shí)的模式下。
6.4.1程序查詢(xún)方式實(shí)例
定時(shí)器使用步驟:
- 配置定時(shí)器模式控制寄存器TMOD;
- 裝載定時(shí)器初始值TH0,T0;
- 置位TR0,啟動(dòng)定時(shí)器開(kāi)始計(jì)時(shí);
- 主程序查詢(xún)定時(shí)器中斷標(biāo)志位TF0。
假設(shè)設(shè)置定時(shí)器0為每1ms溢出1次,因此在主程序中累計(jì)查詢(xún)到50次便使led小燈閃爍一次。根據(jù)前面介紹的方法計(jì)算出定時(shí)器0初始值65536-FOSC/12 * 1 * 10-3,程序設(shè)計(jì)如下圖所示:
#include< reg52.h >
#define FOSC 11059200 //單片機(jī)晶振頻率
#define T_1ms (65536 - FOSC/12/1000) //定時(shí)器初始值計(jì)算
sbit led0 = P1^0;
unsigned char count = 0;
void main()
{
TMOD = 0x01; //定時(shí)器工作模式配置
TL0 = T_1ms; //裝載初始值
TH0 = T_1ms >>8;
TR0 = 1; //啟動(dòng)定時(shí)器
while(1)
{
if(TF0==1)
{
TF0 = 0; //軟件清零
TL0 = T_1ms;//重裝初始值
TH0 = T_1ms >>8;
count++;
if(count >=50)// 每一毫秒進(jìn)入一次中斷,達(dá)到50次則為50ms,翻轉(zhuǎn)小燈。
{
count = 0;
led0 = ~led0;
}
}
}
}
如上圖所示,在主程序開(kāi)始階段,對(duì)TMOD進(jìn)行賦值來(lái)配置定時(shí)器T0為工作模式1,然后對(duì)TL0,TH0寄存器進(jìn)行初始化賦值,緊接著啟動(dòng)定時(shí)器T0開(kāi)始計(jì)數(shù)。完成上述步驟后,進(jìn)入主程序循環(huán),在循環(huán)中不斷的檢測(cè)TF0,當(dāng)檢測(cè)到定時(shí)器溢出后將TF0清零,重新轉(zhuǎn)載定時(shí)器初始值,當(dāng)溢出達(dá)到50次后翻轉(zhuǎn)led小燈的值。這里需要注意的地方是,當(dāng)判斷到溢出后需要通過(guò)軟件對(duì)TF0進(jìn)行軟件清零。結(jié)合我們前面學(xué)習(xí)的知識(shí),大家可以根據(jù)自己的需求來(lái)改變程序的功能,加深對(duì)定時(shí)器功能的理解。
6.4.2中斷響應(yīng)方式實(shí)例
中斷響應(yīng)方式與程序查詢(xún)方式略有不同,在程序初始化處需要打開(kāi)定時(shí)器中斷,當(dāng)定時(shí)器溢出后程序跳轉(zhuǎn)到中斷入口程序,并由硬件自動(dòng)清理TF0,可在中斷程序中實(shí)現(xiàn)led小燈閃爍的功能。
定時(shí)器使用步驟:
- 配置定時(shí)器模式控制寄存器TMOD;
- 裝載定時(shí)器初始值TH0,T0;
- 置位TR0,啟動(dòng)定時(shí)器開(kāi)始計(jì)時(shí);
- 允許定時(shí)器中斷,并開(kāi)啟總中斷;
- 進(jìn)入中斷程序。
- 在中斷程序中重載定時(shí)器初始值,并閃爍led小燈。
程序設(shè)計(jì)如下圖所示:
#include< reg52.h >
#define FOSC 11059200 //單片機(jī)晶振頻率
#define T_1ms (65536 - FOSC/12/1000) //定時(shí)器初始值計(jì)算
sbit led1 = P1^1;
unsigned char count = 0;
void main()
{
TMOD = 0x01; //定時(shí)器工作模式配置
TL0 = T_1ms; //裝載初始值
TH0 = T_1ms >>8;
TR0 = 1; //啟動(dòng)定時(shí)器
ET0 = 1; //允許定時(shí)器中斷
EA = 1; //開(kāi)總中斷
while(1); //循環(huán)
}
void timer0() interrupt 1
{
TL0 = T_1ms;//重裝初始值
TH0 = T_1ms >>8;
count++;
if(count >=50)// 每一毫秒進(jìn)入一次中斷,達(dá)到50次則為50ms,翻轉(zhuǎn)小燈。
{
count = 0;
led1 = ~led1;
}
}
6.4本章小結(jié)
本章介紹了延時(shí)函數(shù)的調(diào)試,定時(shí)器基礎(chǔ)知識(shí)的介紹以及定時(shí)器功能的應(yīng)用實(shí)例。結(jié)合我們我們程序的介紹,多多練習(xí)下載試驗(yàn)逐步的熟練掌握延時(shí)函數(shù)、定時(shí)器功能的應(yīng)用。
-
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44553瀏覽量
634736 -
晶振
+關(guān)注
關(guān)注
34文章
2860瀏覽量
68010 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3246瀏覽量
114739 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5035瀏覽量
97384
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論