中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

北京做網(wǎng)站站長工具麻豆

北京做網(wǎng)站,站長工具麻豆,印章制作軟件在線制作,新網(wǎng)虛擬主機安裝wordpress目錄 T1工作在方式2時 T0工作在方式3時 四種工作方式的總結(jié) 定時計數(shù)器對輸入信號的要求 定時計數(shù)器對的編程的一個要求 關(guān)于初值計算的問題 4種工作方式的最大定時時間的大小 關(guān)于編程方式的問題 實例分析 實例1 實例2 T1工作在方式2時 51單片機,有兩個…

目錄

T1工作在方式2時

T0工作在方式3時

四種工作方式的總結(jié)

定時計數(shù)器對輸入信號的要求

定時計數(shù)器對的編程的一個要求

關(guān)于初值計算的問題

4種工作方式的最大定時時間的大小

關(guān)于編程方式的問題

實例分析

實例1

實例2


T1工作在方式2時

51單片機,有兩個16位的定時計數(shù)器,是T0和T1。上面我們介紹了的方式0和方式1的兩種工作方式,分別對應(yīng)的是13位定時計數(shù)器方式和16位定時計數(shù)器方式。 我們開始介紹方式2。 方式2,又叫做常數(shù)自動重裝入。在工作的一個等效的圖是這樣的一種形式,以定時計數(shù)器T1為例。

我們大家可以看到基本控制位跟剛才我們所介紹的方式1和方式0是一樣的,C/T這一位用來控制是定時器還是計數(shù)器方式。gate位是門控位。TR1是這個定時計數(shù)器的啟動位。

跟方式0和方式1的不同之處就是在這兒:

這里參與計數(shù)的是一個八位的單元,對于T1來說是把這個T1這個16位的定時計數(shù)器放初值單元分成了兩個,一個是TL1,一個是TH1,其中參與計數(shù)的是TL1這個單元,所能記錄的數(shù)據(jù)的大小就是從0到FF這樣的256數(shù)。然后,當(dāng)記錄的數(shù)值超過FF就會發(fā)生溢出,發(fā)生溢出的時候會指位TF1。

在跟方式0和方式1的特點不同之處,就是在TL1發(fā)生溢出的同時,會把T1自動的把TH1的數(shù)放入到TL1當(dāng)中去,這個又叫做常數(shù)自動重轉(zhuǎn)入,也就是說當(dāng)一個定時計數(shù)器工作在方式2,工作在這種常數(shù)自動重裝入方式時,相當(dāng)于是一個八位的定時計數(shù)器,這個八位定時器有一個特點,就是每當(dāng)溢出之后,計數(shù)初值是由硬件自動的把TH當(dāng)中的內(nèi)容給寫入到TL當(dāng)中去。計數(shù)初值是由硬件自動來寫入的,這是的一個特點。

下面就是一個方式2正常在工作的時候的一個流程圖,就是正常有脈沖技術(shù)脈沖經(jīng)過的時候,TL的值加1。 如果要是說當(dāng)TL值在記錄的過程當(dāng)中沒有超過255這個數(shù),就相當(dāng)于是沒有溢出,始終是循環(huán),有計數(shù)值就要加1,有計數(shù)值加1,當(dāng)產(chǎn)生溢出的時候,是把1賦值給TF位,就是產(chǎn)生這個溢出標(biāo)志位,同時,是把TH的內(nèi)容再寫入到TL當(dāng)中去,這樣的話,在T當(dāng)中,就得到了一個初始值。

在這里,我們要強調(diào)一點,對于方式0和方式1來說,在正常工作的時候,記錄的數(shù)據(jù)達(dá)到溢出,比如說從0000開始記,當(dāng)我記到FFFF,然后又有一個數(shù)來的時候,那是從FFFF變成0000,這叫溢出,一旦溢出之后,在定時計數(shù)器的初值寄存器當(dāng)中,放的就是0,也就是說,第一次計數(shù)可以在你所設(shè)定的那個初值的基礎(chǔ)上開始計數(shù)。 當(dāng)?shù)谝淮斡嫈?shù)溢出之后,第二次計數(shù)將是從0000這個初始值開始計數(shù)。 對于我們來說,有的很多時候,這樣做是不可以的,比如說你要產(chǎn)生一個周期非常穩(wěn)定的一個方波,希望這個周期的高低電平都保持一個固定的時間,換句話說,產(chǎn)生這個方波的定時計數(shù)器的初值都是一個固定的值,這樣的話,記錄時間長度才能夠保持一致。 如果要是你使用的是13位或者是16位的定時計數(shù)器的話,每一次在產(chǎn)生溢出之后都需要重新的寫入的初值,有這樣的兩條指令,重新寫初值的指令,而對于方式2的話,就不需要,每一次溢出的時候是由硬件自動的把TH中的內(nèi)容給寫入到TL當(dāng)中,你只要把TH當(dāng)中存放的就是你所需要產(chǎn)生的那段定時時間的常數(shù),只要這樣做,就可以保證產(chǎn)生一個周期比較穩(wěn)定的這樣的一個信號。

這種工作方式(方式2),可以省去用戶軟件中重新裝入常數(shù)的這個程序,當(dāng)定時計數(shù)器的這個初值寄存器產(chǎn)生溢出之后,對于方式2來說,就不需要你再手工的去寫初值,就硬件自動的賦予初值,而對方式0方式1,需要手工寫初值,這樣的話,如果你采用方式2的話,就省去了重新寫入初值的這樣的程序,會使得這個定時時間更加精確,可以產(chǎn)生比較穩(wěn)定的周期,比較穩(wěn)定的這樣的一個方波信號,產(chǎn)生一個就是定時時間非常精度比較高的這樣的一個時間信號。

比如說,我們在波特律發(fā)生器當(dāng)中,就要采用方式2,讓這個定時器產(chǎn)生一個穩(wěn)定的一個波特率。 波特率,是在串行通訊當(dāng)中所需要使用到的一個定義,主要是指的是串行通訊的時候每秒鐘所發(fā)送的位數(shù),一般,我們要求串行通訊的時候每秒鐘發(fā)送的這個位數(shù)是有一個比較穩(wěn)定的,非常固定的這樣的一個速率發(fā)送的話,對于發(fā)送方和接收方才能夠可靠的實現(xiàn)雙機通訊,所以要求這個時間是精度比較高,一般,我們是讓定時器工作在方式2作為波特律發(fā)射器來使用。

T0工作在方式3時

下面,再看一下工作于方式3。

只有定時計數(shù)器T0才有工作方式3,當(dāng)T0工作于方式3的時候,是把內(nèi)部分成了兩個8位的定時計數(shù)器TL0和TH0,就是TL0在方式3下,自己自動分解成兩個8位的定時計數(shù)器,其中,TL0仍然使用T0的狀態(tài)控制位,C/T位,GATE位,TR0位和INT0位,這些仍然使用原先T0的這些資源。而TH0被固定的作為一個8位的定時器來使用,并且使用定時器T1的兩個控制位TR1和TF1,同時占用定時計數(shù)器T1的中斷源,也就是說,當(dāng)T0如果工作在方式3的話,相當(dāng)于是把T0分解成了兩個8位的定時計數(shù)器,其中TL0(低8位)占用了原先T0的所有資源,而TH0這個8位定時計數(shù)器是只能工作在定時器方式下,同時占用了原先T1的那些啟動位和的中斷標(biāo)志位。 這就是T0工作的方式三,而T1是不能工作在方式三的,如果在設(shè)置這個命令字的時候,讓T1進(jìn)入到了方式三,等效就是T1是停止工作,不會工作了,在T0工作在方式三的時候,我們可以設(shè)置讓T1進(jìn)入到方式0,方式1,方式,2,這些都可以。

大家看一下,這就是工作在方式3的T0的等效的一個邏輯圖。

大家可以看到在T0工作在方式3的時候,是分解成了一個低8位的一個定時計數(shù)器,占用了原先的T0的所有的資源,所有的資源包括的這個門控位,包括的啟動位,以及包括的中斷源等等這些都被所占用了。

TH這個8位的定時計數(shù)器就是只能作為定時器使用,只能對機器周期計數(shù)。 同時,使用到了T1的兩個資源,一個是啟動位,另一個就是中斷源,這就是工作在方式3的T0。

我們再看,當(dāng)T0工作在方式3的時候,T1可以工作在什么樣的一個狀態(tài)?可以工作在方式0,是一個13位的定時計數(shù)器,也可以工作在方式1,作為一個16位的定時計數(shù)器來使用,也可以工作在方式2,作為一個8位的定時計數(shù)器來使用。

大家要注意到,當(dāng)T0工作在方式3的時候,T1不論是工作在方式0還是方式1方式2,都缺失了兩個控制位,一個是TR位,另一個就是TF位,也就是說,什么時候啟動,這個是無法控制的,這無法控制的啟停,另一個就是無法知道什么時候溢出,一般,我們在這時候,都是讓這個T1工作在自動的這種工作方式下,這時候T1就是自動處于一個工作方式,周而復(fù)始的會產(chǎn)生這種溢出信號。即一般當(dāng)T0工作在方式3的時候,我們一般讓T1工作在方式2這種八位常數(shù)自動重裝入方式下,作為波特律發(fā)生器來使用,所以下面接著是串行口。

其實其它的都可以作為波特利發(fā)生器使用,但是方式2是最為靈活的,最為準(zhǔn)確的一種方式。剛才我們已經(jīng)介紹過了,8倍長數(shù)自動重裝入所產(chǎn)生的定時時間精度是最高的。

四種工作方式的總結(jié)

下面就對這個定時計數(shù)器的四種工作方式做一個簡單的總結(jié)。

方式0,是一個13位的定時計數(shù)器,大家要注意到的,是TL就是T1或者是T0當(dāng)中的低8位只有5位參與計數(shù),高8位同時參與計數(shù),所以是構(gòu)成一個13位的定時計數(shù)器。

方式1,是一個16位的定時計數(shù)器,使用和方式0是完全相同的,只不過是參與計數(shù)的T0這個寄存器當(dāng)中參與計數(shù)的位數(shù)不同,一個是13位,一個是16位。 方式2,是一個常數(shù)自動重裝入的八位定時計數(shù)器,特點就是可以把計數(shù)常數(shù)/計數(shù)初值,是由硬件自動的裝入進(jìn)來的,每一次溢出之后,硬件自動的把TH中的內(nèi)容裝入到TL當(dāng)中,使得這個八位定時計數(shù)器能夠在一個固定的初值的基礎(chǔ)上參與計數(shù),那這樣的話,能夠產(chǎn)生一個時間比較準(zhǔn)確的一個定時。

方式3,是T0分成兩個獨立的八位計數(shù)器,其中,TL0是作為定時計數(shù)器來使用,TH0是只能作為定時器來使用。TL0的控制使用了原先T0,?TH0占用了原先T1的那些控制位,TR1和TF1,同時還占用了定時器T1的中斷源。此時,T0工作在方式3的時候,T1可以工作在方式0~方式2,溢出的時候,這種溢出信號,自動的送到了串行口,經(jīng)常是作為串行口的波特律發(fā)生器來使用,在T1作為波特率發(fā)生器使用的時候,是可以工作在方式0,方式一,方式二都可以,但是最好的一種工作方式是讓T1工作在方式2,這時候的波特率是最為穩(wěn)定的。

定時計數(shù)器對輸入信號的要求

下面我們來看一個定時計數(shù)器對輸入信號的要求。 作為一個定時計數(shù)器來說,一方面可以對內(nèi)部的一個機器周期計數(shù),另一方面,可以對一個管角上所來的一個脈沖信號進(jìn)行計數(shù)。

我們首先看一下,當(dāng)定時計數(shù)器工作于定時器方式的時候,因為是對內(nèi)部的時鐘信號,對內(nèi)部的機器周期計數(shù),每一個機器周期,計數(shù)值加1,比如說我如果采用一個12兆的晶振的話,機器周期就是一微秒,也就一味著,每一微秒的這個計數(shù)值會加1。 由于定時的精度是取決于輸入脈沖的周期的,所以要想提高這種定時期的分辨率,就必須選用頻率比較高的晶振才可以,對于51來說,最高的晶振就是12兆,除非是你選用一些特殊的型號才可以。 這一點我們在學(xué)數(shù)字電路的時候有過印象,如果要想記錄的時間更加準(zhǔn)確的話,產(chǎn)生一個時間非常準(zhǔn)的這樣的一個信號的話,就要求時鐘源頻率越高,時間的分辨率才越高,比如說如果對一個兩秒鐘這樣的一個信號進(jìn)行計數(shù)的話,那時間分辨率就是兩秒,就是2秒之內(nèi)就無法區(qū)分出來。定時時間的精度是與時鐘源的精度有關(guān)的。 對于51單片機來說,定時器的精度就取決于了這個外界的這個晶振的頻率,外界晶振的頻率是每個機器周期加1的。

下面我們看,如果要是工作于計數(shù)器方式的話,是怎樣的一個工作過程。

當(dāng)定數(shù)計數(shù)器作為計數(shù)器使用的時候,計數(shù)脈沖是來自外部的輸入引腳,T0或者是T1,當(dāng)輸入信號產(chǎn)生從1~0的這種下調(diào)沿的時候,計數(shù)值會增1,也就是說,計數(shù)器是對外部引腳的一個脈沖信號計數(shù),所記錄的是這個引腳上所出現(xiàn)的下調(diào)沿的個數(shù)。 這個51單片機是如何判斷這個引腳上出現(xiàn)了一個下調(diào)沿?是每個機器周期對這個引腳的電平信號進(jìn)行一次采樣,每個機器周期對這個電平信號采樣一次,當(dāng)這個機器周期采樣得到的電平是高電平,而下一個機器周期樣得到電平是低電平的話,它認(rèn)為在這個過程當(dāng)中引腳上出現(xiàn)了一個下調(diào)沿,就會使得內(nèi)部的計數(shù)器的值加1。

由此,大家可以看到,51工作在計數(shù)器方式的時候,對這個外部輸入引腳的電平是有要求的,第一個要求,就是必須要高低電平的持續(xù)時間必須大于一個機器周期,因為只有大于一個機器周期的話,51單片機才能夠可靠的識別出這個引腳的電平狀態(tài),因為每一個機周期只采樣一次,只有當(dāng)這個電頻信號持續(xù)的時間大于一個機器周期的話,才能夠被51單片機所識別出來。 正是因為有了這樣的一個要求,如果我要是選用的是一個6兆頻率的這樣的一個晶體的話,允許輸入脈沖的頻率是多少?是250K赫茲,如果選用的是12兆頻率晶體的話,允許輸入的最高的外部脈沖就是500K赫茲,為什么是這樣?

大家看一下,如果你選用的是一個12兆晶振的話,一個機器周期就是1微秒,對外部的技術(shù)脈沖的要求是什么?高電平持續(xù)時間要大于1微秒,低電平持續(xù)時間也要大于1微秒,這樣的話,這個脈沖的頻率是多少?高電平1微秒,低電平1微秒,這個脈沖的周期,就是2微秒。 周期是2微秒,對應(yīng)的頻率是多少?就是500K赫茲,也就是說,對于當(dāng)你單片機所使用的晶振是12MHz的話,作為計數(shù)器使用的時候,所能記錄的最高的這個脈沖的頻率是500K赫茲。

這個就是我們所畫的一個簡單的一個示意圖,在這個圖當(dāng)中,大家可以看到作為計數(shù)器使用的時候,要求這個高低電平的持續(xù)的時間必須是大于一個機器周期,這樣的話,這個高低電平信號才能夠被51單片機可靠的識別出來,從而才能夠判斷出什么時候出現(xiàn)了這個下降沿,才能保證計數(shù)器能夠可靠的工作,不會發(fā)生定脈沖的事件。

定時計數(shù)器對的編程的一個要求

下面我們看一下定時計數(shù)器對的編程的一個要求,如何使用這個定時計數(shù)器。

首先,要對進(jìn)行初始化,根據(jù)要求給方式寄存器TMOD送一個方式控制字,以設(shè)定定時器的工作方式。 你讓這個定時計數(shù)器工作在什么方式,是8位的,16位的還是13位的?就是定工作方式。

  • 根據(jù)需要給TH和TL當(dāng)中送,就是作為一個定時器使用的話,你需要定時時間是多長? 就需要從一個初值開始記錄,能夠產(chǎn)生這個定時時間,就是要寫有一個初值的問題。
  • 根據(jù)需要給中斷允許寄存器IE送中斷控制字,以開放相應(yīng)的中斷也可以用查詢的方式來響應(yīng)這個定時器。 第三步是什么?你已經(jīng)寫完初值了,然后你就可以讓它工作了,緊接著,你要知道這個定時計數(shù)器工作之后,你如何來判斷這個定時時間到了,就是記錄的數(shù)據(jù)到達(dá)你所設(shè)的個數(shù),如何來判斷的問題。一方面,作為這種定時器的響應(yīng),可以用中斷來作為的一個響應(yīng)。

中斷系統(tǒng),我們在后面要說要講到這個中斷系統(tǒng),在這里,只是給大家簡單介紹一下。 ?專門有一個中斷源是定時計數(shù)器所使用的這樣一個中斷源,如果你用一個中斷處理子程序來處理這個定時計數(shù)器的這個溢出這個事件的話,就要求你首先要開放這個中斷源,要允許中斷。其次,要把你的中斷子程序?qū)懭氲焦潭ǖ闹袛嗳肟谀莻€位置上去,就這兩個要求,希望大家在這里就是要有一個印象,就是如果你要是用一個中斷來作為這種定時器溢出事件的響應(yīng)的話,你怎么樣來編寫這個中斷子程序?就中斷子程序有對中斷子程序有什么樣的要求?第一個要求,就是說你要開放中斷,要允許這個中斷,第二個,就是說要把這個中斷處理子程序,放入到固定的位置上去,就這兩個要求。 或者是你可以通過查詢的方法來作為這個定時計數(shù)器溢出的一個響應(yīng)事件,所謂的查詢方式就是可以查詢這個TF標(biāo)志位,因為在前面的介紹當(dāng)中,大家都知道說對于一個定時計數(shù)器,一旦開始啟動之后開始計數(shù),當(dāng)發(fā)生溢出的時候,TF位會有一個標(biāo)志會被置1,只要我在編程當(dāng)中,可以判斷這個TF位的狀態(tài),如果TF位是高電平,那就表示這個定時計數(shù)器已經(jīng)到了,到溢出已經(jīng)記錄的時間到了,那可以調(diào)用我的這個處理子程序,處理程序去處理,去響應(yīng)這個定時計數(shù)器溢出的時間。

最后,就是給TCON這個命令寄存器當(dāng)中送啟動位,讓它啟動,就是TR位給置1,就開始啟動,就開始計數(shù)了。

這就是定時計數(shù)器使用編程的一個步驟,就首先,要確定的工作方式,是8位,16位還是13位,第二個,是根據(jù)你的定時時間的長度,確定的初值,第三個是編寫一段程序,這段程序是作為定時計數(shù)器溢出事件的一個響應(yīng)的一個程序,第四個是啟動的定時計數(shù)器,讓開始計數(shù)。

關(guān)于初值計算的問題

下面,我們看一下關(guān)于初值計算的問題,在前面給大家說過,工作在51的定時計數(shù)器是一個加計數(shù),加計數(shù)每一次當(dāng)發(fā)生溢出的時候,才會有一個明確的標(biāo)志,明確的標(biāo)志就是TF未被置1,這樣的話就存在一個問題,就是我需要記錄的時間長度如何換算成的計數(shù)初值的問題,是從一定初值開始記,才能夠得到你的那個計數(shù)的時間長度。

我們看一下有這樣的一個計算公式,希望大家能夠給記錄下來,以后在使用當(dāng)中可以直接寫這個公式。

如果作為一個計數(shù)器來使用的話,計數(shù)器的初值應(yīng)該是如何的?

設(shè)計數(shù)的模值為M,這個M就是指的是8位計數(shù)器,16位計數(shù)器還是13位計數(shù)器,如果是8位計數(shù)器的話,模值就是2的8次方,16位就是2的16次方,以此類推。

所需要的計數(shù)值是C,我需要記C個數(shù)的話,計數(shù)初值是多少?我們一般應(yīng)該寫的計數(shù)初值是,如果是T/C的話,應(yīng)該等于是M-C。

什么意思?你比如說我讓這個定時計數(shù)器工作在八位方式,我現(xiàn)在去需要記錄250個數(shù),你寫初值的時候,可以把250這個數(shù)直接寫入到的初值計數(shù)器當(dāng)中嗎?就是寫入到這個TH當(dāng)中去嗎?很顯然是不行的,因為你如果要是把250寫入到了這個初值計數(shù)器當(dāng)中,記錄多少個數(shù)將會賣溢出?記錄6個250,在250的基礎(chǔ)上開始記251、?252,當(dāng)記錄到255再來一個脈沖的時候,變成00,255對應(yīng)的是FF,再來一個又變成00,會產(chǎn)生溢出,也就是說,如果你把你需要的計數(shù)值寫入到初始計數(shù)器當(dāng)中的話,你得不到你所需要的那個時間長度,因為是一個加計數(shù)。 在這里,通過這個公式計算,大家都知道,如果你需要記錄250個數(shù)據(jù)的話,250個脈沖的話,記錄250個脈沖的話,所寫的初值,T/C這個位置應(yīng)該放多少?應(yīng)該是模值是2的八次方,就是讓定時計數(shù)器工作在八位方之下的話,模值是2的八次方減掉你所需要記錄的這250個數(shù),T/C應(yīng)該等于是6,也就是說,你應(yīng)該在這個初值寄存器當(dāng)中,就是T0,T1在的這個存放初值這個寄存器里,放的是6這個數(shù),而不能說是放250這個數(shù),這就是你需要記錄的計數(shù)值和你寫入到初值計算器當(dāng)中的計數(shù)值是不一樣的,那不一樣有一個換算,就通過這個公式,可以直接的換算出來,根據(jù)你的定時計數(shù)器的位數(shù),根據(jù)你所需要的計數(shù)值,可以換算出的數(shù)值來,就是采用這樣一個公式。

同樣的看一下,如果要是讓定時計數(shù)器工作在定時器方式的話,初值應(yīng)該如何計算?

設(shè)定時計數(shù)器的模值為M,需要的定時時間為T,定時器的初值T等于什么?T/C等于的是M減去大T除小T,大T是定時時間,小T是你的機器周期,要除以一下這個機器周期,這個換算的過程大家可以對照計數(shù)器的數(shù)值,可以看一下它們兩個有相同之處。

大家在使用的時候,,就是完全可以根據(jù)這兩個公式來直接計算出的初值,那就不需要再手工的去其采用其方法去換算就不用了,這個公式用起來還是比較方便的,這是關(guān)于初值的計算的問題,給了大家兩個公式,可以直接,根據(jù)你的定時計數(shù)器工作的位數(shù),根據(jù)你所需要的定時和計數(shù)的這個長度,然后,計算出的這個初值來。 ?

4種工作方式的最大定時時間的大小

下面我們再看一下幾種工作方式的最大定時時間的大小是多少?

如果要是定時器的初值為0的時候,這時候的定時時間是最大的,因為將是從0開始,一直記錄到滿為止這個計數(shù)時間,定時和計數(shù)時間是最長的。 如果要是外接的晶振是12MHz的話,幾種方式下最大的定時間是多少?

如果要是對應(yīng)的是一個方式0的話,所能夠產(chǎn)生的最大定時時間,是8.192ms,方式0是一個13位的,這樣的一個接定時計數(shù)器。

方式一的話,實際上工作在16位方式下,最多得到的時間長度可以達(dá)到65.536ms。 方式2方式3都是一個八位的定時計數(shù)器方式,所能夠達(dá)到的最大時間是0.256ms。

把這個告訴大家主要的一個目的就是根據(jù)你的定時時間長度,可以確定我讓這個定時計數(shù)器工作在什么方式下,你比如說我現(xiàn)在如果產(chǎn)想產(chǎn)生一個30ms的這樣的一個是定時時間的話,很顯然你只能讓定時計數(shù)器工作在方式1;只能工作在方式1。 如果你要是讓這個定時計數(shù)器產(chǎn)生一個0.1ms這樣的一個定時時間的話,那你既可以讓工作方式1,也可以工作方式0,也可以工作方式二、方式三都可以,這個就是說是你確定工作方式的一個依據(jù)。 這幾個數(shù)據(jù)就是在外界晶振為12MHz的時候,所能夠達(dá)到的最大時間,實際上計算是比較簡單的,外界晶振12兆表示一個機器周期是1微秒,對于方式一來說,定時計數(shù)器的位數(shù)是16位的,最大記錄時間就是2的16次方乘以1微秒,2的16次方對應(yīng)的就是65536,然后再乘以1微秒,對應(yīng)的時間就變成了這個65.36ms。就是這么計算出來的,其的都是以此類推。

下面我們再看一個初始計算的例子,比如說現(xiàn)在外界晶振是12MHz,我現(xiàn)在需要產(chǎn)生的這個定時時間是2ms,希望大家,來計算一下我這個定時計數(shù)器的初值是多少?

對于方式二和方式三來說,就是這個八位的定時計數(shù)器,所能夠產(chǎn)生的最大時間,剛才領(lǐng)大家算了一下,看了一下是0.256ms,很顯然,這個是不滿足要求的,我要產(chǎn)生一個2ms的信號,你這個工作在8位方式,最多才是0.256ms,這是不能夠使用的。

再看一下方式0的時候,這是可以的,最大時間是大于2ms,最大是8ms多,所以的計數(shù)初值是多少?是2的13次方,方式0是一個13位的定時計數(shù)期,所以的模值是2的13次方,然后減去定時時間長度是2ms除以機器周期,機器周期是1微秒,外接晶振為12兆的時候,機器周期是1微秒,所以,初值的公式就可以寫成2的13次方減去2微秒除以1微秒,最后,等于的是6192。換算16進(jìn)制數(shù)是1830H,寫成初值的形式,寫的是C1H和10H,高八位放的是C1,低8位放的是10。

這塊就是提醒大家注意的一點,當(dāng)工作在13位方式下,是低八位寄存器當(dāng)中只有5位參與基數(shù)。高8位當(dāng)中是8位都參與計數(shù),所以你得到的這個16進(jìn)制數(shù)在放的時候你要會放。把低五位放完之后,低八位當(dāng)中的高三位是不管的,接著往高八位當(dāng)中放數(shù)據(jù),最后,把這個1830給換算過來才可以,比如說在這里這個1830,這對應(yīng)的是0001,8是1000,3是0011,然后最后一個0是0000。

這是1830這個16進(jìn)制數(shù),我們放取的時候,是低五位取過來就變成10000,然后,在剩下的8位1100?0001給寫入到高八位這個寄存器當(dāng)中,對應(yīng)的正好是這樣的這八位正好是C1,然后低5位是10000寫入到寄存器當(dāng)中后高三位是無關(guān)位,我們給寫成0。最后,對應(yīng)的這個初值就是C110。

注意就是在工作的13位方式的時候,大家計算所得到的這樣的一個16位的初值,在往這個數(shù)值寄存器當(dāng)中寫的時候,不能把這個16位的數(shù)值直接寫進(jìn)去,還要再進(jìn)行一下變換,是寫成低5位和高8位的形式,然后給寫進(jìn)去才行。

如果要是工作在16位方式下,就比較簡單了。計數(shù)初值是2的16次方減去2ms除以1微秒,最后等于6336。轉(zhuǎn)換成16進(jìn)制就是F830,寫初值的時候,就可以直接寫高8位寫的是F8,低8位寫的是30H,這就可以了。

由此可見,大家應(yīng)該明白,就是定時計數(shù)器工作的時候,實際上方式一,應(yīng)該是時間比較長的時候,讓定時計數(shù)器直接工作在16位方式下是比較經(jīng)濟比較合算的,因為這時候,無論是你的初值的計算,還是你初值的這個直接的書寫,往定寄存器當(dāng)中寫這個初值都是比較方便的,比較簡單的,而13位相對比較麻煩一下,計算出來的值和往初值寄存器當(dāng)中所寫的是還要再進(jìn)行一次變換,這一點要注意,就是16位的和8位的使用起來是最靈活的,13位是一個過渡階段,這個13位的定時計數(shù)器,主要是51單片機為了和48系列單片機相兼容所保留的這樣的一種工作方式。

這就是的關(guān)于初值計算的一些問題。

關(guān)于編程方式的問題

下面再看一下關(guān)于編程方式的問題。

一種編程方式是可以采用查詢的方式,程序一直檢測這個TF位,因為定時計數(shù)器一旦工作之后,我們唯一能夠判斷定時計數(shù)器工作狀態(tài),就是通過TF位,這是一個唯一的一個窗口,TF位所指示的就是是否溢出這樣的一個信息,所以我們在編程序的時候,就可以在程序當(dāng)中指令當(dāng)中就專門就有這樣的一條指令,就是查詢TF位。如果TF位為1的話,表示定時時間已經(jīng)到了,在如果你要是采用這種查詢方式,就是我靠我指令去查詢TF位,從而判斷定時計數(shù)器是否溢出。

如果用這種方法的話,要注意的是在編程當(dāng)中要及時的對TF位進(jìn)行清零,因為TF位是定時計數(shù)器如果溢出是由硬件置1的,而如果要是用你人為的用編寫的一段程序,就是非中斷方式去響應(yīng)的話,去作為的一個處理程序的話,需要你在程序當(dāng)中有清除TF位的指令,這種方法又叫做硬件置1軟件清零。在后面我們再講標(biāo)志位的時候,有一些標(biāo)志位就是有這樣的一個要求,就是有是硬件置1的,但是需要你的響應(yīng)程序通過一條指令,就是通過軟件去清理。

第二種方式,就是說采用中斷的方式來作為的響應(yīng),這個是相對比較簡單,你只要把這個定時計數(shù)器的中斷給開放了,允許響應(yīng)這個中斷事件就可以了,是不是開放的中斷,然后把你的處理這個定時計數(shù)器事件的這段程序,放入規(guī)定位置,這個規(guī)定位置就是指的是的中斷入口這個位置,CPU在運行的時候,當(dāng)如果要是定時計數(shù)器真的溢出了,會自動的調(diào)用這段中斷子程序去處理這個事件,去響應(yīng)這個事件。如果要是用采用這種中斷的方法,作為定時計數(shù)器溢出的響應(yīng)的處理程序的話,這個TF位,就不再需要你用指令去對清零了,的特性就是硬件置1硬件清零,在進(jìn)入中斷的時候,是由硬件自動的清除TF位,所以我們應(yīng)該說,就是用中斷作為這個定時計數(shù)器的一個響應(yīng),應(yīng)該是相對比較簡單的,無論使用還是它的編程都是比較簡單的。

這是的兩種編程方式,無論是查詢還是中斷,我們在后面的例子當(dāng)中,都要給大家有所介紹。

實例分析

實例1

下面我們看一個第一個例子,就是一個方式0的一個應(yīng)用。

現(xiàn)在要求選用T1讓工作在方式0,產(chǎn)生一個500微秒的定時,在P1.1輸出周期為1ms的方波,p1.1是P1口的第1引腳,我要求在p1.1這個引腳上輸出一個周期是1ms的方波,高電平500微秒,低電平500微秒這樣的一個方波。這個單片機的晶振是6MHz。

當(dāng)使用到T1的時候,有一點就是提醒大家注意的,這時候,我們沒有用到T0,大家給T0在寫這個命令寄存器的時候,你不要任意的去寫,不要讓T0,比如說一個誤操作,讓T0工作在方式3了,在前面所說的就是方式寄存器,如果要是控制設(shè)成工作方式3的話,T0是分解成兩個8位的定時計數(shù)器,某些資源T1就無法用了,我們說了T1的啟動位、停止位,啟動位和溢出標(biāo)志位被T0所使用了。所以,如果在沒有使用到T0的時候,千萬不要讓T0進(jìn)入到方式3,這是一個原則。 禁止進(jìn)入方式3,一般給設(shè)成方式0,就是如果我使用到的是T1這個定時計數(shù)器的話,大家對T0如何處理,一定要讓T0設(shè)一個默認(rèn)值是方式0,而不要讓寫成方式3。

下面看一下初值的計算,在這里,你看我們的題目的要求,告訴你的工作方式了,那剩下的就是看一下的技術(shù)初值應(yīng)該是多少。 計數(shù)初值應(yīng)該等于的是2的13次方,方式0嘛,對應(yīng)的是一個13位的定時計數(shù)期,然后減掉計數(shù)的定時時間是500每秒,再除以機器周期6MHz晶振下,其周期是2微秒,最后得到的計數(shù)的常數(shù)是計數(shù)的初值是7942。7942對應(yīng)的16進(jìn)制數(shù)是1F06。 然后把這個1F06這個16位的數(shù)給寫成低5位和高8位的形式,就把低五位摘出來放到一個寄存器當(dāng)中,然后再取前八位取出來放到高8位寄存器當(dāng)中,所對應(yīng)的一個16位的寄存器的初值是F806。

這點要注意就是到13位這塊,大家計算得到的初值和實際寫入到初值寄存器當(dāng)中的值,中間是需要變換一下,這一點大家要注意!對于一個初學(xué)者,建議大家直接使用16位的定時計數(shù)器,就不要使用這個13位的

下面看一下如何對進(jìn)行編程。 這是它的主程序:

PS:以下是用匯編語言作為一個講解示例,學(xué)C語言的伙伴只需了解它的程序邏輯即可,不用糾結(jié)某些符號所代表的意思。

對于我們在前面的介紹當(dāng)中說過了,首先要設(shè)工作方式,現(xiàn)在讓T1是工作在方式0。

我們看一下工作方式寄存器TMOD。

在寫的時候,大家需要記錄測量外部脈沖的寬度嗎?不需要,所以門控位為0。 門控位一定是在需要測量外部脈沖寬度的時候使用門控位,其它的情況下都不使用門控位,所以這位為0。

然后再看C/T這一位,T1是工作在定時器方式,所以這一位為0,如果1的話就表示計數(shù)器方式.

然后看工作方式M1、M0,因為我現(xiàn)在就要求工作的方式0,所以這兩位寫的是0 0。

對于T0,沒有使用到T0這個定時計數(shù)器可以都寫成0,在前面說過了,對于沒有使用到的定時計數(shù)器,把的所有位數(shù)都寫成0就可以了。

這樣的話,大家可以判斷一下,這個TMOD這個寄存的命令字是什么?是0000?0000,所以我們直接寫的是MOV TMOD,#0,這是的命令字。

在這里,才是我們所學(xué)的這個51單片機當(dāng)中,就給SFR寫命令字,這是第一個,第一個命令字是TMOD。 第二個看就是我要寫初值,剛才我們的計算已經(jīng)計算清楚了(拉上去看看我們算出來的),是F806,所以要寫的是MOV TL1,低8位放的是什么?是06H,高八位當(dāng)中放的是什么?MOV TH1放的是0F8H,這個0是由于是書寫16位的一個規(guī)范。#號后面,如果這個立即數(shù)的首位是介于A到F之間的話,要求前面再最加一個0,再追加一個0,所以是0F8H。

這是寫完初值了,下面該干什么了?

確定的工作方式,確定的初值應(yīng)該是啟動讓它開始工作了。

啟動定時計數(shù)器,直接使用的是SETB,因為TR1如果置1的話,就意味著啟動這個定時計數(shù)器T1,TR0是T0的啟動控制位。在后面,如果我們用到T0的話,應(yīng)該是SET?TR0,就是啟動T0在這里。因為使用到的是T1,所以執(zhí)行的是SET?TR1這樣的一個指令。

下面再看,啟動之后,我們在前面介紹功能部件的時候說過,就是由這個SFR自動的去控制管理這個定時計數(shù)器的工作了,而CPU根本就不需要理會,CUP繼續(xù)執(zhí)行你的指令就可以了。在這里,我們在這個編程當(dāng)中是采用一種查詢的方法來判斷定時計數(shù)器是否溢出,用查詢的方法來判斷的。所以這塊,CPU在執(zhí)行的時候,采用了這樣一條指令,JBC?TF1, PF0。?JBC指令是為操作指令當(dāng)中的一個,它的指令的含義就是把后面這一位的信息拿過來判斷一下是否為1。等于1嗎?如果要是等于1的話,則轉(zhuǎn)移,同時,把這一位清0。

在介紹JBC指令的時候說過,是非常有用的一條指令,主要功能就是把后面的一位取出來,判斷是否為1,如果是為1的話,則轉(zhuǎn)移,同時把這一位的信息清零。如果要是定時計數(shù)器時間到了,TF1將被置1。

現(xiàn)在我把TF1拿過來之后,開始判斷是否為1,很顯然剛開始程序運行的時候,沒有到這500每秒時間,所以應(yīng)該是為零的,如果是為零的話,將順序執(zhí)行進(jìn)行下來,執(zhí)行的是SJMP Loop跳轉(zhuǎn)指令,又跳轉(zhuǎn)回來了,接著又執(zhí)行JBC?TF1, PF0,又取出PF0,接著來判斷的話,這個這兩條指令的一個含義就是什么?讓這個程序循環(huán),在等待,始終是取TF1這一位來判斷,如果是0的話,表明定時時間沒到,就回過頭來再取TF1,再判斷,然后再取,再判斷,這樣直到TF1這一位為1為止。TF1這位為1意味著什么?意味著定時時間到了,500位秒到了。

如果要是說這時候這個定時時間到了的話,TF1位被置1,發(fā)生長期跳轉(zhuǎn),跳轉(zhuǎn)到PF這個位置來,所以就是跳轉(zhuǎn)到了這條指令這跳轉(zhuǎn)到這條指令

這在這里你看是如何做的,是MOV TL1, #06H,接著MOV TH1?#0F8H,這兩條指令是干什么用的?叫重新寫初值。 剛才我們說過了,如果要是讓這個定時計數(shù)器產(chǎn)生一個周期的這樣的一個信號的話,那就存在著我再次對寫入初值的問題。除非是你讓這個定時計數(shù)器工作在8位常數(shù)自動重裝入方式下,每一次溢出這個計數(shù)初值是自動寫入的,由硬件自動寫入的,工作在方式0和方式1都需要你在指令當(dāng)中給寫入,再次寫入數(shù)值,在這里,就是當(dāng)發(fā)生溢出的時候,通過JBC指令及時的把這個TF位的信息給清零了,同時要把這個計數(shù)初值再重新的寫入到這個TL1和TH1當(dāng)中去,寫入的仍然是F806,就是還讓再產(chǎn)生一個500微秒這樣的一個時間長度。

然后接著是CPL?P1.1,CPL是一個取反指令,對P1.1取反,這塊,就是我們在前面的硬件結(jié)構(gòu)當(dāng)中介紹的時候說過,對于P1口來說,上電復(fù)位之后,初始狀態(tài)是1,都是高電平。也就是說P1.1上電復(fù)位之后,就是高電平。當(dāng)程序這個定時計數(shù)器啟動之后,執(zhí)行到這一條的時候,就到500每秒的時候,對它取反,從高電平變成了低電平,變成低電平之后,AJMP?loop循環(huán)回來,又循環(huán)回來了,循環(huán)回來之后接著取TF1這一位,JBC只能接著取T1這位,判斷是否為1。

很顯然,在剛開始第一次循環(huán)回來的時候,這個TF位肯定是為0,沒到500微秒,當(dāng)?shù)?00微秒的時候,怎么樣?程序又執(zhí)行下來,再把的初值重新寫一遍,然后又取反,取反的結(jié)果就是讓又變成了高電平,這樣的話,這個低電平持續(xù)時間是多長時間?是500微秒。 然后,變成高電平之后,再過500微秒之后,又變成了低電平,然后這個時間,也是500微秒,從而得到了一個周期是1ms這樣的一個方波信號。

在這里,大家應(yīng)該注意到這個我在這個定時計數(shù)器的應(yīng)用當(dāng)中,我是采用查詢的方法。 始終在主程序當(dāng)中有一個判斷指令,取出這個TF位,然后進(jìn)行判斷,也就是說,通過指令取這個TF位來判斷是否為1,這個叫做查詢的方法來作為定時計數(shù)器溢出的一個處理程序。

如果要是采用這種方式的話,要注意及時的對TF位進(jìn)行清零,置1是發(fā)生在定時計數(shù)器的溢出時刻,只有在軟件當(dāng)中及時的清零,才能夠捕捉到下一次的溢出時刻,這是要注意的,就是如果采用的是查詢的方法來作為定時計數(shù)器溢出的響應(yīng)的處理程序的話,那要及時的對TF位清零,在這里,是通過JBC指令,既判斷什么時候為1了,然后又可以及時的清零,采用的是這個指令來完成的。

第二個大家要注意的是,如果要是定時計數(shù)器工作在非方式2的工作方式下,也就是說工作在不是8位乘數(shù)自動沖撞入這種方式下的時候,方式0,方式1等等工作在這些方式下,大家要注意及時進(jìn)行及時的寫初值。

在第一次啟動之前,你一定是給寫入初值,然后啟動了,當(dāng)溢出之后,如果你還想產(chǎn)生剛才所設(shè)定的長的定時時間的話,那就要求在第一次溢出之后,再次的把那個計數(shù)數(shù)值,通過指令給寫進(jìn)來,這樣的話才能夠產(chǎn)生一個你所需要的那個定時時間,就是關(guān)于初值的再次寫入的問題,這是需要注意的,只要你不是工作在這個方式2的話,都存在著一個初值重新寫入的問題。

實例2

下面再看再看一個例子,在這里,是讓T0是工作在計數(shù)器方式,然后T1工作在定時器方式,同時,都是工作在方式二,方式二是我們在定時計數(shù)器使用當(dāng)中,經(jīng)常使用到的一種工作方式,就是一個是方式一,一個是方式二,這兩個是工經(jīng)常使用的,我們看一下工作在方式二的情況。

T0工作在計數(shù)器方式,然后T1工作在定時器方式。我們再看一下這個題目,要求從P3.4引腳,P3.4是T0引腳,輸入低頻脈沖(作為一個計數(shù)器使用嘛,那就要求輸入一個低頻脈沖),要求該脈沖,每發(fā)生一次跳變,由p1.0輸出一個500微秒的負(fù)脈沖。 然后與此同時,p1.1輸出一個寬度為1ms的正脈沖,晶振6MHz。什么意思?

就是T0是工作在一個計數(shù)器方式T0外接的引腳如果有出現(xiàn)了一個計數(shù)脈沖的話,就要求p1.0輸出一個500微秒的一個負(fù)脈沖。然后P1.1這個引腳輸出一個一毫秒的一個正脈。

就是每當(dāng)我T0這個引腳,就是P3.4這個引腳輸入一個脈沖的話,那就在p1.0和P1.1這兩個引腳上就分別出現(xiàn)一個正脈沖和一個負(fù)脈沖,這是我們題目的要求。 我們設(shè)的時候,就是要求是T0工作在計數(shù)器方式嘛,所以就設(shè)T0為計數(shù)器方式,而且工作在方式二,初值我們給設(shè)成FF,設(shè)成FF有一個好處,只要有一個脈沖的話就會溢出。

我就可以判斷出來什么時候溢出,因為你如果要是初值給設(shè)成的是F0的話,T0這個引腳來一個脈沖,你根本無法判斷出來什么時候來一個脈沖,F0變成F1,溢出標(biāo)志位不會被置1,只有發(fā)生溢出的時候,這個溢出標(biāo)志位才會被注銷。 所以,我現(xiàn)在想每當(dāng)這個引腳來一個脈沖,我就能夠識別出來,能夠判斷出來,如果要達(dá)到這個目的的話,就要求你讓這個計數(shù)的初值是FF,這樣的話,每當(dāng)有一個脈沖,就是加1就變成00嘛,就要產(chǎn)生溢出嘛。 然后,當(dāng)外部輸入一個脈沖的時候,計數(shù)器加1產(chǎn)生溢出,使得TF0=1,引起CPU的T0中斷。

用中斷來作為這個計數(shù)器的一個響應(yīng),然后中斷服務(wù)程序內(nèi)是對定時器T1設(shè)初值,用T1工作在這個方式2,給設(shè)一個初值,讓T1產(chǎn)生這個規(guī)定的這個500微秒這樣的一個脈沖,產(chǎn)生這個500微秒的定時,從而在這個P1.1和P1.0這個引腳上得到這個正負(fù)脈沖。

本節(jié)先講到這兒,下節(jié)繼續(xù)!

如有問題課可評論區(qū)留言或者私信,謝謝!

http://www.risenshineclean.com/news/54029.html

相關(guān)文章:

  • 做室內(nèi)裝修的網(wǎng)站seo排名優(yōu)化培訓(xùn)價格
  • 酷炫網(wǎng)站設(shè)計風(fēng)格北京做網(wǎng)站推廣
  • 網(wǎng)站建設(shè)這個工作怎么樣天津建站網(wǎng)
  • 公司網(wǎng)站建設(shè)方案詳細(xì)方案軟文推廣產(chǎn)品
  • 北京網(wǎng)站開發(fā)網(wǎng)站開發(fā)公司seo網(wǎng)站優(yōu)化培訓(xùn)找哪些
  • 通遼做家教的網(wǎng)站seo營銷優(yōu)化
  • 貼吧廣告投放seo前線
  • 武漢網(wǎng)站建設(shè) 網(wǎng)站制作市場營銷的策劃方案
  • 做外包的網(wǎng)站有哪些優(yōu)化大師官方下載
  • 高端定制網(wǎng)站開發(fā)網(wǎng)站模板設(shè)計關(guān)鍵詞搜索愛站網(wǎng)
  • seo 服務(wù)如何優(yōu)化網(wǎng)站
  • 高校后勤網(wǎng)站建設(shè)要求二級域名和一級域名優(yōu)化難度
  • 網(wǎng)站建設(shè)資料準(zhǔn)備標(biāo)準(zhǔn)江西seo推廣軟件
  • 網(wǎng)站建設(shè)免湖南seo網(wǎng)站開發(fā)
  • 設(shè)計公司網(wǎng)站建設(shè)2022年最近十大新聞
  • 唐山房產(chǎn)網(wǎng)站建設(shè)東莞網(wǎng)絡(luò)推廣平臺
  • 微信網(wǎng)站建設(shè)公司衡水seo優(yōu)化
  • 怎么做彩票網(wǎng)站seol英文啥意思
  • 棗莊網(wǎng)站設(shè)計怎么有自己的網(wǎng)站
  • 三亞高端服務(wù)網(wǎng)站輕松seo優(yōu)化排名 快排
  • 企業(yè)做網(wǎng)站建設(shè)鎮(zhèn)江網(wǎng)站建設(shè)
  • 廣州市網(wǎng)站建設(shè)制作設(shè)計平臺廣州今天新聞
  • 蘄春做網(wǎng)站google瀏覽器入口
  • b2b貿(mào)易網(wǎng)站公司推廣渠道
  • 硬盤做網(wǎng)站空間漢中seo培訓(xùn)
  • 武漢網(wǎng)站建設(shè)哪家好電腦培訓(xùn)班附近有嗎
  • pcb設(shè)備網(wǎng)站怎么做適合seo軟件
  • 鄭州高端建站公司中國搜索引擎有哪些
  • 如何建立新聞網(wǎng)站搜索引擎bing
  • 西安php網(wǎng)站開發(fā)培訓(xùn)班信息流廣告哪個平臺好