(玩電子(zi)) 電子(zi)技(ji)術學習(xi)與(yu)研究
當前位置︰單片機教程網 >> 基礎教程 >> 瀏覽文章

梦之城APP官网

作(zuo)者:佚名   來(lai)源(yuan):本站原創(chuang)   點擊數:x  更(geng)新時間︰2020年02月23日   【字體︰

   通過前面的學習(xi),我們qie)丫 私飭說? 誆康慕 梗 ?qie)也已(yi)經知道,要(yao)控制單片機,讓它為(wei)我們干學,要(yao)用指(zhi)令,我們qie)蜒 思ji)條指(zhi)令,但很零散(san),從現在開(kai)始,我們將要(yao)系統地學習(xi)8051單片機的指(zhi)令部份。

一、概(gai)述

1、指(zhi)令的格式

   我們qie)閻  yao)讓計算機做事(shi),就得(de)給(gei)計算機以指(zhi)令,並且(qie)我們qie)閻  撲慊塴氨俊保 荒芏dong)得(de)數字,如前面我們寫(xie)進機器的75H,90H,00H等等,所以指(zhi)令的第(di)一種zhi)袷驕褪shi)機器碼格式,也說是(shi)數字的形wen)健5 庵中問(wen)絞翟謔shi)為(wei)難我們人了,太難記了,于是(shi)有另一種zhi)袷劍 zhu)記符格式,如MOV P1,#0FFH,這樣(yang)就好記了。 這兩種zhi)袷街 淶墓叵的兀 頤遣荒牙(ya)斫猓 局噬縴峭耆quan)等價,只是(shi)形wen)講灰謊yang)而已(yi)。

2、匯編

  我們寫(xie)指(zhi)令使(shi)用匯編格式,而計算機和單片機只懂(dong)機器碼格式,所以要(yao)將我們寫(xie)的匯編格式的指(zhi)令轉換為(wei)機器碼格式,這種轉換有兩種辦法︰手工匯編和機器匯編。手工匯編實際上就是(shi)查表,因為(wei)這兩種zhi)袷醬看(kan)饈shi)格式不一樣(yang),所以是(shi)qie)灰歡雜ying)的,查一張表格就行了。不過手工查表總是(shi)嫌麻(ma)煩,所以就有了計算機軟件,用計算機軟件來(lai)替(ti)代(dai)手工查表,這就是(shi)機器匯編。

二、單片機的尋址

  讓我們先來(lai)復習(xi)一下我們學過的一些指(zhi)令︰MOV P1,#0FFH,MOV R7,#0FFH這些指(zhi)令都(du)是(shi)將一些數據送到對應(ying)的位置中去,為(wei)什麼要(yao)送數據呢?第(di)一個因為(wei)送入的數能讓燈全(quan)滅掉,第(di)二個是(shi)為(wei)了要(yao)實現延時,從這里我們能看(kan)出來(lai),在用單片機的編程語言編程時,經常要(yao)用到數據的傳遞(di),事(shi)實上數據傳遞(di)是(shi)單片機編程時的一項重要(yao)工作(zuo),一共有28條指(zhi)令(單片機共111條指(zhi)令)。下面我們就從數據傳遞(di)類指(zhi)令開(kai)始吧(ba)。

  分(fen)析一下MOV P1,#0FFH這條指(zhi)令,我們不難得(de)出結論,第(di)一個詞MOV是(shi)命令動詞,也就是(shi)決定做什麼事(shi)情的,MOV是(shi)MOVE少(shao)寫(xie)了一個E,所以就是(shi)“傳遞(di)”,這就是(shi)指(zhi)令,規定做什麼事(shi)情,後面還有一些參wen) fen)析一下,數據傳遞(di)必須要(yao)有一個“源(yuan)”也就是(shi)你(ni)要(yao)送什麼數,必須要(yao)有一個“目的”,也就是(shi)你(ni)這個數要(yao)送到什麼地方(fang)去,顯(xian)然(ran)在上面那條單片機指(zhi)令中,要(yao)送的數(源(yuan))就是(shi)0FFH,而要(yao)送達的地方(fang)(目的地)就是(shi)P1這個寄(ji)存器。在數據傳遞(di)類指(zhi)令中,均將目的地寫(xie)在指(zhi)令的後面,而將源(yuan)寫(xie)在最後。

  這條指(zhi)令中,送給(gei)P1是(shi)這個數本身,換言之,做完這條指(zhi)令後,我們能明確地知道,P1中的值是(shi)0FFH,但是(shi)並不是(shi)任何wen)焙hou)都(du)ji)苤苯癰gei)出數本身的。例如,在我們前面給(gei)出的單片機延時程序例是(shi)這樣(yang)寫(xie)的︰

MAIN︰ SETB P1.0     ;(1)

   LCALL DELAY ;(2)

    CLR P1.0      ;(3)

   LCALL DELAY   ;(4)

    AJMP MAIN    ;(5)

;以下子(zi)程序

DELAY︰ MOV R7,#250   ;(6)

D1︰ MOV R6,#250   ;(7)

D2︰ DJNZ R6,D2    ;(8)

   DJNZ R7,D1   ;(9)

   RET        ;(10)

   END        ;(11)

表1

-----------------------------------------------------

 MAIN︰ SETB P1.0     ;(1)

   MOV 30H,#255

    LCALL DELAY ;

    CLR P1.0      ;(3)

    MOV 30H,#200

    LCALL DELAY   ;(4)

    AJMP MAIN    ;(5)

;以下子(zi)程序

DELAY︰ MOV R7,30H   ;(6)

D1︰ MOV R6,#250   ;(7)

D2︰ DJNZ R6,D2    ;(8)

   DJNZ R7,D1   ;(9)

   RET        ;(10)

   END        ;(11)

表2

 這樣(yang)一來(lai),我每kan)蔚饔醚郵背絛蜓郵鋇氖奔潿du)是(shi)相同的(大致(zhi)都(du)是(shi)0.13S),如果我提(ti)出這樣(yang)的要(yao)求︰燈亮(liang)後延時時間為(wei)0.13S燈滅,燈滅後延時0.1秒燈亮(liang),如此(ci)循環,這樣(yang)的程序還能滿足要(yao)求嗎?不能,怎麼chuang)歟課(ke)頤悄馨蜒郵背絛蚋某燒庋yang)(見表2)︰調用則見表2中的主程,也就是(shi)先把一個數送入30H,在子(zi)程序中R7中的值並不固定,而是(shi)根據30H單元中xie) lai)的數確定。這樣(yang)就能滿足要(yao)求。

 

   從這里我們能得(de)出結論,在數據傳遞(di)中要(yao)找(zhao)到被(bei)傳遞(di)的數,很多時候(hou),這個數並不能直接給(gei)出,需(xu)要(yao)變化,這就引出了一個概(gai)念(nian)︰如何尋找(zhao)操作(zuo)數,我們把尋找(zhao)操作(zuo)數所在單元的地址稱之為(wei)尋址。在這里我們直接使(shi)用數所在單元的地址找(zhao)到了操作(zuo)數,所以稱這種辦法為(wei)直接尋址。除了這種辦法之外,還有一種,如果我們把數放(fang)在工作(zuo)寄(ji)存器中,從工作(zuo)寄(ji)存器中尋找(zhao)數據,則稱之為(wei)寄(ji)存器尋址。例︰MOV A,R0就是(shi)將R0工作(zuo)寄(ji)存器中的數據送到累加器A中去。提(ti)一個問(wen)題︰我們知道,工作(zuo)寄(ji)存器就是(shi)內存單元的一部份,如果我們選擇工作(zuo)寄(ji)存器組0,則R0就是(shi)RAM的00H單元,那麼這樣(yang)一來(lai),MOV A,00H,和MOV A,R0不就沒什麼區別(bie)了嗎?ke)wei)什麼要(yao)加以區別(bie)呢?的確,這兩條指(zhi)令執行的結果是(shi)完全(quan)相同的,都(du)是(shi)將00H單元中的內容(rong)送到A中去,但是(shi)執行的過程不一樣(yang),執行第(di)一條指(zhi)令需(xu)要(yao)2個周期,而第(di)二條則只需(xu)要(yao)1個周期,第(di)一條指(zhi)令變成最終的目標碼要(yao)兩個字節(E5H 00H),而第(di)二條則只要(yao)一個字節(E8h)就能了。

 

  這麼斤(jin)斤(jin)計較!不就差了一個周期嗎,如果是(shi)12M的晶體震蕩器的話,也就1個微秒時間了,一個字節又(you)能有多少(shao)?

   不對,如果這條指(zhi)令只執行一次,也許無所謂,但一條指(zhi)令如果執行上1000次,就是(shi)1毫(hao)秒,如果要(yao)執行1000000萬(wan)次,就是(shi)1S的誤差,這就很可(ke)觀了,單片機做的是(shi)實時控制的事(shi),所以必須如此(ci)“斤(jin)斤(jin)計較”。字節數同樣(yang)如此(ci)。

再來(lai)提(ti)一個問(wen)題,現在我們qie)閻  罷zhao)操作(zuo)數能通過直接給(gei)的方(fang)式(立即尋址)和直接給(gei)出數所在單元地址的方(fang)式(直接尋址),這就夠(gou)了嗎?

看(kan)這個問(wen)題,要(yao)求從30H單元開(kai)始,取(qu)20個數,分(fen)別(bie)送入A累加器。

   就我們目前掌握的辦法而言,要(yao)從30H單元取(qu)數,就用MOV A,30H,那麼下一個數呢?是(shi)31H單元的,怎麼取(qu)呢?還是(shi)只能用MOV A,31H,那麼20個數,不是(shi)得(de)20條指(zhi)令才(cai)能寫(xie)完嗎?這里只有20個數,如果要(yao)送200個或(huo)2000個數,那豈不要(yao)寫(xie)上200條或(huo)2000條命令?這未免太笨了吧(ba)。為(wei)什麼會出現這樣(yang)的狀況?是(shi)qie)蛭wei)我們只會把地址寫(xie)在指(zhi)令中,所以就沒辦法了,如果我們不是(shi)把地址fen)苯有xie)在指(zhi)令中,而是(shi)把地址放(fang)在另外一個寄(ji)存器單元中,根據這個寄(ji)存器單元中的數值決定該到哪個單元中取(qu)數據,比如,當前這個寄(ji)存器中的值是(shi)30H,那麼就到30H單元中去取(qu),如果是(shi)31H就到31H單元中去取(qu),就能解決這個問(wen)題了。怎麼個解決法呢?既然(ran)是(shi)看(kan)的寄(ji)存器中的值,那麼我們就能通過一定的辦法讓這里面的值發生變化,比如取(qu)完一個數後,將這個寄(ji)存器單元中的值加1,還是(shi)執行同一條指(zhi)令,可(ke)是(shi)取(qu)數的對象卻不一樣(yang)了,不是(shi)嗎。通過例程來(lai)說de)靼ba)。

MOV R7,#20

   MOV R0,#30H

LOOP︰MOV A,@R0

   INC R0

   DJNZ R7,LOOP

    這個例程中xie)蟛糠 zhi)令我們是(shi)能看(kan)懂(dong)的,第(di)一句,是(shi)將立即數20送到R7中,執行完後R7中的值應(ying)當是(shi)20。第(di)二句是(shi)將立即數30H送入R0工作(zuo)寄(ji)存器中,所以執行完後,R0單元中的值是(shi)30H,第(di)三句,這是(shi)看(kan)一下R0單元中是(shi)什麼值,把這個值作(zuo)為(wei)地址,取(qu)這個地址單元的內容(rong)送入A中,此(ci)時,執行這條指(zhi)令的結果就相當于MOV A,30H。第(di)四句,沒學過,就是(shi)把R0中的值加1,因此(ci)執行完後,R0中的值就是(shi)31H,第(di)五句,學過,將R7中的值減(jian)1,看(kan)是(shi)否(fu)等于0,不等于0,則轉到標號LOOP處繼(ji)續(xu)執行,因此(ci),執行完這句後,將轉去執行MOV A,@R0這句話,此(ci)時相當于執行了MOV A,31H(因為(wei)此(ci)時的R0中的值已(yi)是(shi)31H了),如此(ci),直到R7中的值逐次相減(jian)等于0,也就是(shi)循環20次為(wei)止,就實現了我們的要(yao)求︰從30H單元開(kai)始將20個數據送入A中。

這也是(shi)qie)恢盅罷zhao)數據的辦法,由于數據是(shi)間接地被(bei)找(zhao)到的,所以就稱之為(wei)間址尋址。注意,在間址尋址fen)校 荒苡0或(huo)R1存放(fang)等尋找(zhao)的數據。

發表評論】【告訴好友】【收藏此(ci)文】【關閉窗(chuang)口

梦之城APP官网

梦之城APP官网 | 下一页