找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4303|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

匯編很容易之說說對定時(shí)器的理解與編程思路

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:266429 發(fā)表于 2023-3-20 22:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這里說一說定時(shí)器的理解學(xué)習(xí)思路。
  定時(shí)器其實(shí)就是個(gè)計(jì)數(shù)器,我們用得最多的是用于計(jì)時(shí),計(jì)時(shí)這個(gè)東西我們應(yīng)該都明白是個(gè)什么東西,手機(jī)里的秒表就屬于這個(gè)東西。手機(jī)上是怎么用的?一,調(diào)出手機(jī)的秒表功能,二歸零,三按下開始,四盯著看看到?jīng)]到我們預(yù)定的時(shí)間值。
  單片機(jī)里是一樣的流程,先將其設(shè)置成計(jì)時(shí)功能,然后呃不是歸零而是設(shè)置起始值(初始值),三給個(gè)信號讓其開始,四不停地查詢看其是否計(jì)數(shù)滿值了。這樣一說,計(jì)時(shí)器是不是在你眼中變得很低級?
  知道了計(jì)時(shí)器的工作原理,編程時(shí)具體怎么做?查芯片說明書啊,管它什么芯片,都一個(gè)查字:計(jì)時(shí)器功能設(shè)置在哪個(gè)單元,找地址嘛;初始值要放在哪個(gè)單元,啟動(dòng)信號在哪個(gè)單元,計(jì)滿信號(溢出信號)在哪個(gè)單元,還是個(gè)查字。查到之后,就是修改,怎么修改,還是查說明書啊。
  說說為什么要弄個(gè)初始值,對于十六位的計(jì)時(shí)器來說,計(jì)時(shí)最大值就是65535,再加1就漫出了(溢出)。51單片機(jī)的設(shè)計(jì)上,計(jì)數(shù)方式是加加加,也就是計(jì)數(shù)單元中的值是增加方式,如果我們想計(jì)數(shù)100,從0開始也不是不行,但你要去不斷地判斷其值是否到了99,這個(gè)也不是不行,但有更好的方法,那就是從65436開始,計(jì)到溢出,而計(jì)數(shù)器本身設(shè)計(jì)了一個(gè)功能,就是溢出后就給出一個(gè)溢出信號,這個(gè)信號存在某一個(gè)單元之中(稱之為溢出標(biāo)志,51單片機(jī)存在某個(gè)單元的某一位上,稱之為溢出標(biāo)志位),程序運(yùn)行中只需要盯著這個(gè)標(biāo)志位的值就行了,用不著盯計(jì)數(shù)值。
  談點(diǎn)芯片設(shè)計(jì)人員的思路,上面說的是計(jì)數(shù)值加加加,那采用計(jì)數(shù)值減減減的方式可以不可以實(shí)現(xiàn)呢?這個(gè)問題并不復(fù)雜,我在這里就不羅嗦了。
  可以說,這個(gè)溢出標(biāo)志的設(shè)計(jì),是很好的設(shè)計(jì),定時(shí)器的中斷功能,也是在這個(gè)基礎(chǔ)上弄出來的。
  有了以上的知識,那我們在應(yīng)用定時(shí)器進(jìn)行編程時(shí),思路也就很清楚了,首先使用前別忘了標(biāo)志位應(yīng)該是零啊,啟動(dòng)位當(dāng)然也要是零,然后把初始值送進(jìn)去,然后設(shè)置(也可以說是調(diào)出)其計(jì)時(shí)功能(十六位的或八位的,按你的需要),然后把啟動(dòng)位設(shè)置成開始(啟動(dòng)),然后不停查詢標(biāo)志位的值。哦還有一點(diǎn),單片機(jī)的定時(shí)器不止一個(gè),以上這些動(dòng)作,只對你所選擇的那個(gè)定時(shí)器進(jìn)行編程。再有一點(diǎn),計(jì)時(shí)完成之后,啟動(dòng)位、溢出標(biāo)志位等是否需要人工處理,這個(gè)要看說明書。
吐槽一下:現(xiàn)有的教材都是告訴你有這些特殊功能寄存器、如何設(shè)置這些寄存器,卻沒怎么講解為什么機(jī)器中存在這些寄存器、為什么需要設(shè)置這些項(xiàng)目,這樣的結(jié)果,自然是讓人不容易理解掌握,不能理解的結(jié)果,就只能是死記硬背,反正本人特?zé)┧烙浻脖,沒法,記性比別人差,于是只能逼著自己去理解原理,理解了原理,編程就是心中長了竹子。
好了,下面我們就查表,首先是計(jì)時(shí)功能設(shè)置的單元,教材中稱之為定時(shí)器工作方式寄存器,俗名TMOD,設(shè)計(jì)在片內(nèi)數(shù)據(jù)存儲單元中,歸于特殊功能寄存器,對這類單元只能直接尋址,不能間接尋址,該單元沒有設(shè)計(jì)位尋址功能,其地址編號為89H,這個(gè)單元控制兩個(gè)定時(shí)器的工作模式(標(biāo)準(zhǔn)的51機(jī)有兩個(gè)定時(shí)器),高四位控制定時(shí)器1,低四位控制定時(shí)器0。這四個(gè)位的功能在一般的教材上都有講解,反正如果你想使用十六位計(jì)時(shí)功能時(shí),將四位設(shè)成0001就行了。因?yàn)椴荒芪粚ぶ,那一次就得送入一整個(gè)字節(jié),所以如果你若讓定時(shí)器1閑著而用定時(shí)器0,那就得把00000001B送入89H單元中,可以用MOV命令將00000001B作為立即數(shù)送入89H中(當(dāng)然你也可以將其先存于某個(gè)單元之中再送入),前面說了對于特殊功能寄存器89H這個(gè)單元只能直接尋址,那么這個(gè)單元的地址就必須直接寫在這條語句中,所以這條命令是這樣寫的:MOV   89H,#00000001B,當(dāng)然,89H這個(gè)單元你可以不用數(shù)據(jù)地址,而是用其俗名來代替,這個(gè)俗名,程序編輯器中已經(jīng)有了一個(gè),就是“TMOD”,于是,這條命令就可以這樣寫:MOV  TMOD,#00000001B。也當(dāng)然,如果你不喜歡TMOD這個(gè)俗名,你自己取一個(gè)自己喜歡自己好記的名字也行。
再就是計(jì)數(shù)數(shù)據(jù)單元了,它是十六位,就是兩個(gè)字節(jié),51機(jī)是每個(gè)單元里面存的是一個(gè)字節(jié)的數(shù)據(jù),那十六位就得兩個(gè)字節(jié),就得占用兩個(gè)單元;51機(jī)每個(gè)單元都有一個(gè)地址編號,那兩個(gè)單元就得兩個(gè)地址編號。查說明書,這兩個(gè)計(jì)數(shù)單元也屬于“特殊功能寄存器”的范疇,不可位尋址,只能直接尋址,所以可以同上面一樣的格式編寫語句將初始值送入。定時(shí)器0的高字節(jié)地址編號為8CH,俗名TH0;低字節(jié)為8AH,俗名TL0。
再接下來就是啟動(dòng)設(shè)置,還有溢出標(biāo)志,這兩個(gè)放在一起講,是因?yàn)?/font>51機(jī)芯片設(shè)計(jì)中將這兩個(gè)放在了同一個(gè)單元中,只是在不同的位。查說明書,仍屬于“特殊功能寄存器”,只能直接尋址,可位尋址,單元地址編號88H,俗名TCON,這一個(gè)單元控制兩個(gè)定時(shí)器,其中的第5位(注意,現(xiàn)有教材中的規(guī)定是最低位編號為第0位,最高位編號為第7位)是定時(shí)器0的啟動(dòng)設(shè)置位,這一位的地址編號為8CH,俗名TR0;第6位是定時(shí)器0的溢出標(biāo)志位,這一位的地址編號為8DH,俗名TF0。所以,對這兩個(gè)位的操作,我們既可以一次送入一個(gè)字節(jié)到TCON中去,也可以直接操作位。位的操作蠻簡單,在51機(jī)中,所有的位尋址是只能直接尋址(即在任何時(shí)候編寫程序時(shí),都只能將其地址直接寫在語句中),不具有任何其它的尋址方式。對位的操作51機(jī)設(shè)計(jì)的動(dòng)作比較少,常用的有兩種動(dòng)作:清零和置位(置位就是置1),51機(jī)對位的清零操作碼是C2H,匯編助記符CLR;置位的操作碼是D3H,匯編助記符為SETB。前面說了,寫程序時(shí),只能直接在語句中寫它的位地址,所以,編寫時(shí),在操作碼后面直接寫上其位地址就行了,即SETB   8CH(SETB  TR0)啟動(dòng)定時(shí)器0,CLR  8DH(SETB  TF0)清零定時(shí)器0的溢出標(biāo)志。
解釋一下51機(jī)芯片的位尋址設(shè)計(jì)。51機(jī)的片內(nèi)數(shù)據(jù)存儲單元中,有一部分單元的位,是統(tǒng)一編有地址的,這個(gè)地址是8位地址,編號從0開始,最大255,所以其最多只能對256個(gè)位給予地址編號(即最多只有32個(gè)單元能有位尋址功能),有了這個(gè)地址編號,我們就可以依據(jù)這個(gè)地址編號,直接找到這個(gè)位并進(jìn)行操作。接下來我們就有了一個(gè)疑惑,片內(nèi)數(shù)據(jù)存儲單元的編號也是從0到255,那么機(jī)器是怎么區(qū)分這兩者而不會(huì)弄混的?答案就在操作碼上,51機(jī)的操作碼本身就暗含了接下來的操作的對象是單元還是位,可以這樣理解:對單元進(jìn)行操作的操作碼打開的是一道門,門后通向單元;對位進(jìn)行操作的操作碼打開的是另一道門,門后通向位。另外說一句,其它種類的單片機(jī)不一定是這樣設(shè)計(jì)的,如stm32的設(shè)計(jì),它是統(tǒng)一編號,不管是單元還是位,它們的地址全在0到4G的編號之內(nèi)。
寫得好辛苦啊,沒想到會(huì)寫出這么多。定時(shí)器的自動(dòng)重載和中斷,就不寫了,有了以上的知識,自己應(yīng)該可以推理出來吧?

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂4 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:149799 發(fā)表于 2023-3-21 07:37 | 只看該作者
辛苦樓主了,看你講解能看懂,不像有些資料講解的云里霧里的,謝謝分享。
回復(fù)

使用道具 舉報(bào)

板凳
ID:266429 發(fā)表于 2023-3-21 08:09 | 只看該作者
王秋冬 發(fā)表于 2023-3-21 07:37
辛苦樓主了,看你講解能看懂,不像有些資料講解的云里霧里的,謝謝分享。

謝謝鼓勵(lì)。
回復(fù)

使用道具 舉報(bào)

地板
ID:266429 發(fā)表于 2023-3-21 09:05 | 只看該作者
    昨天忘了說在啟動(dòng)計(jì)時(shí)器之后如何盯溢出標(biāo)志位了。
這個(gè)問題,我們先不看書,而是自己先思考,把自己放在芯片設(shè)計(jì)者的位置,思考如何設(shè)計(jì)這個(gè)機(jī)器指令。
    方法是多種多樣的,既然51機(jī)的這個(gè)標(biāo)志位可以直接尋址,那我們可以把這個(gè)位值取出來,看看是不是1,如果還是零,那就回去再取,直到其變成1,就表示時(shí)間到了,這個(gè)方法,取值與判斷都耽誤了些時(shí)間,對于精度自然有了影響,也讓程序變長了。
    另一種方法,那就是直接看著這個(gè)標(biāo)志位,直到其變成1。
    我們自己有了兩種方法(當(dāng)然你可能還會(huì)想到別的方法),接下來就是看看51機(jī)是怎么設(shè)計(jì)相關(guān)的指令的,怎么做,還是查說明書查表啊。51機(jī)的指令,按機(jī)器操作碼分,總數(shù)是256個(gè);按匯編指令分,有111條,分為數(shù)據(jù)傳送類、算術(shù)運(yùn)算類、邏輯運(yùn)算類、自加自減類、控制轉(zhuǎn)移類、位操作類這幾類指令(當(dāng)然也有其它的分類法),我們要用到的這個(gè)指令,初步判斷應(yīng)該屬于對位進(jìn)行操作的控制轉(zhuǎn)移類,然后我們就在這兩個(gè)分類里面找,看操作功能欄,然后發(fā)現(xiàn)里面有兩條與位值有關(guān)的條件轉(zhuǎn)移指令,一個(gè)是直接尋址位為1則轉(zhuǎn)移,一個(gè)是直接尋址位不為1則轉(zhuǎn)移,這兩條指令,其匯編指令格式一個(gè)是JB  bit,rel,一個(gè)是JNB  bit,rel。這里的bit就是被操作的位的位地址編號,而rel這個(gè)東西說起來稍微復(fù)雜點(diǎn),它的實(shí)質(zhì),是程序接下來要執(zhí)行的命令的首地址,這個(gè)地址不是指數(shù)據(jù)存儲器的地址,而是程序存儲器的地址,這個(gè)首地址里面存儲的數(shù)據(jù),單片機(jī)在運(yùn)行時(shí),是當(dāng)作操作碼的。
    “rel”其實(shí)只是個(gè)指令格式代號,在編程過程中,如果你知道這個(gè)首地址的地址值,你可以直接寫成這個(gè)地址,如果你不知道,你就在這個(gè)條件轉(zhuǎn)移語句中的條件成立后接下來要執(zhí)行的那條語句的前面加一個(gè)英文標(biāo)號作為標(biāo)記(別忘了標(biāo)號后面必須得有冒號),然后你在編寫那條轉(zhuǎn)移語句時(shí)用這個(gè)標(biāo)號代替rel就行了,編譯器在編譯時(shí),會(huì)記住標(biāo)號標(biāo)記處該語句存在程序存儲器中的地址值,然后在編譯這條條件轉(zhuǎn)移語句時(shí),將語句中的標(biāo)號用這個(gè)地址值替換。
    好了,接下來我們該怎么編程就很清楚了。
    你看,其實(shí)我們并不需要死記硬背什么指令,你只需要清楚你想干什么,然后查指令表就行了,這樣的學(xué)習(xí)方法是不是很容易就能著手編程實(shí)踐?至于記住指令,實(shí)踐多了自然就記住了。所以說你只要懂了其原理,匯編不過是順手的事。
回復(fù)

使用道具 舉報(bào)

5#
ID:149799 發(fā)表于 2023-4-1 19:09 | 只看該作者
謝謝樓主,有機(jī)會(huì)整理一下,俺次序從頭開始講解一下,在做成PDF文檔,時(shí)最好不過的了。
回復(fù)

使用道具 舉報(bào)

6#
ID:996773 發(fā)表于 2023-4-14 09:05 | 只看該作者
俺天生愚昧,實(shí)在沒辦法通過計(jì)時(shí)器來計(jì)算波形需要的時(shí)間,我編程的時(shí)候只能用笨辦法

,例如,編寫紅外解碼,實(shí)在無法知道下一個(gè)低電平到達(dá)的時(shí)間,就反復(fù)執(zhí)行短時(shí)間的延時(shí)

程序,再讀取有沒有低電平,直到有低電平了,再看延時(shí)程序執(zhí)行了多少次。就知道了。

我智商太低的人實(shí)在不會(huì)算,就這樣死腦筋湊數(shù)
回復(fù)

使用道具 舉報(bào)

7#
ID:689425 發(fā)表于 2023-5-4 09:55 | 只看該作者
hi等你 發(fā)表于 2023-4-14 09:05
俺天生愚昧,實(shí)在沒辦法通過計(jì)時(shí)器來計(jì)算波形需要的時(shí)間,我編程的時(shí)候只能用笨辦法

,例如,編寫紅外解 ...

牛X,一力降十會(huì)
回復(fù)

使用道具 舉報(bào)

8#
ID:237471 發(fā)表于 2023-11-12 08:41 | 只看該作者
贊,大贊,單片機(jī)基石文章
回復(fù)

使用道具 舉報(bào)

9#
ID:1111542 發(fā)表于 2024-3-2 10:14 | 只看該作者
慢慢思考 發(fā)表于 2023-3-21 09:05
昨天忘了說在啟動(dòng)計(jì)時(shí)器之后如何盯溢出標(biāo)志位了。
這個(gè)問題,我們先不看書,而是自己先思考,把自己放 ...

樓主既分享了知識,又分享了學(xué)習(xí)方法,贊!
回復(fù)

使用道具 舉報(bào)

10#
ID:908670 發(fā)表于 2024-4-20 12:14 | 只看該作者
好資料講的很明白
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表