




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
本文來自平庸的單片機(jī)單片機(jī)入門教程有感于自己自學(xué)單片機(jī)的難過經(jīng)歷,以及對目前單片機(jī)教材和教課方法的思疑,決定做這一版,以幫助那些和我相同,想入單片機(jī)之門身旁卻沒有一個(gè)老師能夠問的人。本版將分兩大塊:自編教程和為讀者供給盡可能詳細(xì)的教課資料。準(zhǔn)備工作在你決定學(xué)習(xí)單片機(jī)從前,請做好以下準(zhǔn)備工作:一、硬件準(zhǔn)備:計(jì)算機(jī)一臺(tái)。編程器一只、89C51一片,實(shí)驗(yàn)板一塊,再準(zhǔn)備一只仿真機(jī),其余慣例工具。假如你想學(xué)單片機(jī),而又不肯做這些投資,我勸你最好仍是放棄,不然可能只會(huì)傷害你學(xué)習(xí)的踴躍性和浪費(fèi)你的時(shí)間。幸虧這些投資其實(shí)不算多。計(jì)算機(jī):你能上網(wǎng),計(jì)算機(jī)自然有了。編程器:商品化的一般起碼伍、六百以上。但此刻網(wǎng)上有好多朋友都供給編程器的資料,如果你身旁有能手,不如請他們幫助你做一個(gè)吧!可是幾十元的代價(jià)。假如沒有這個(gè)條件,我介紹你用丁丁工作室的51串行燒寫器,可讀寫WINBOND和ATMEL企業(yè)生產(chǎn)的40腿8位單片機(jī),如w78e51,w78e52,w77e58,89c51,89c52,80f51,80f52,87f51,87f52,89c2051,89c1051等,價(jià)錢廉價(jià)。仿真機(jī):商品化的一般上千,我介紹一種吧,電子設(shè)計(jì)工具的51ST-32K系列,思路與傳統(tǒng)的仿真機(jī)截然相反,用一塊具在線可編程(ISP)的芯片,并供給一段單片機(jī)代碼和一個(gè)PC機(jī)軟件,你能夠直接將要輸出的變量在計(jì)算機(jī)上顯示出來。我們用TC或其余語言編程時(shí),常常在不清楚的地方加一條PRINT語句,看一下輸出,什么都清楚了,這個(gè)仿真機(jī)就是這個(gè)思路。價(jià)錢也很廉價(jià),既可作入門用,也適合于做產(chǎn)品開發(fā)。51ST-32K的說明。教課內(nèi)容:單片機(jī)概括1、何謂單片機(jī)一臺(tái)能夠工作的計(jì)算機(jī)要有這樣幾個(gè)部份構(gòu)成:CPU(進(jìn)行運(yùn)算、控制)、RAM(數(shù)據(jù)儲(chǔ)存)、ROM(程序儲(chǔ)存)、輸入/輸出設(shè)施(比如:串行口、并行輸出口等)。在個(gè)人計(jì)算機(jī)上這些部份被分紅若干塊芯片,安裝一個(gè)稱之為主板的印刷線路板上。而在單片機(jī)中,這些部份,所有被做到一塊集成電路芯片中了,所以就稱為單片(單芯片)機(jī),并且有一些單片機(jī)中除了上述部份外,還集成了其余部份如A/D,D/A等。天!PC中的CPU一塊就要賣幾千塊錢,這么多東西做在一同,還不得買個(gè)天價(jià)!再說這塊芯片也得特別大了。不,價(jià)錢其實(shí)不高,從幾元人民幣到幾十元人民幣,體積也不大,一般用40腳封裝,自然功能多一些單片機(jī)也有引腳比許多的,如68引腳,功能少的只有10多個(gè)或20多個(gè)引腳,有的甚至只8只引腳。為何會(huì)這樣呢?功能有強(qiáng)弱,打個(gè)比方,市場上邊有的組合音響一套才賣幾百塊錢,但是有的一臺(tái)功放機(jī)就要賣好幾千。此外這類芯片的生產(chǎn)量很大,技術(shù)也很成熟,51系列的單片機(jī)已經(jīng)做了十幾年,所以價(jià)錢就低了。既然這樣,單片機(jī)的功能必定不強(qiáng),干嗎要學(xué)它呢?話不可以這樣說,實(shí)質(zhì)工作中其實(shí)不是任何需要計(jì)算機(jī)的場合都要求計(jì)算機(jī)有很高的性能,一個(gè)控制電冰箱溫度的計(jì)算機(jī)莫非要用PIII?應(yīng)用的重點(diǎn)是看能否夠用,能否有很好的性能價(jià)錢比。所以8051出來十多年,依舊沒有被裁減,還在不斷的發(fā)展中。2、MCS51單片機(jī)和8051、8031、89C51等的關(guān)系我們平時(shí)老是講8051,又有什么8031,此刻又有89C51,它們之間終究是什么關(guān)系?MCS51是指由美國INTEL企業(yè)(對了,就是赫赫有名的INTEL)生產(chǎn)的一系列單片機(jī)的總稱,這一系列單片機(jī)包含了好些品種,如8031,8051,8751,8032,8052,8752等,此中8051是最早最典型的產(chǎn)品,該系列其余單片機(jī)都是在8051的基礎(chǔ)長進(jìn)行功能的增、減、改變而來的,所以人們習(xí)慣于用8051來稱號MCS51系列單片機(jī),而8031是前些年在我國最流行的單片機(jī),所以好多場合會(huì)看到8031的名稱。INTEL企業(yè)將MCS51的核心技術(shù)受權(quán)給了好多其余企業(yè),所以有好多企業(yè)在做以8051為核心的單片機(jī),自然,功能或多或罕有些改變,以知足不同的需求,其中89C51就是這幾年在我國特別流行的單片機(jī),它是由美國ATMEL企業(yè)開發(fā)生產(chǎn)的。此后我們將用89C51來達(dá)成一系列的實(shí)驗(yàn)。實(shí)驗(yàn)板:我供給一個(gè)吧,電路原理圖和印制板圖壓在一同了,DOS版本,什么軟件都能看的。與我的教材配套。很簡單,一些LED,一些按鈕,數(shù)碼管。特色是單面板,自已制作很方便,下載相關(guān)說明。對不起,前面供給的印制板圖有些小錯(cuò)誤,LM324構(gòu)成的振蕩器不可以起振,請得新下載改正后的圖。二、軟件準(zhǔn)備:一些常用軟件是一定具備的。如INTEL的51匯編器,在教課資猜中有對于它的說明。軟件仿真器(用來做數(shù)字運(yùn)算類實(shí)驗(yàn)或進(jìn)行算法考證時(shí)很好用),我供給偉福的隨機(jī)軟件,因?yàn)槲沂诌呌袀ジ5姆抡鏅C(jī),供給的是DOS版本軟件,我感覺比WINDOWS版本的更穩(wěn)固一些。其余如畫圖用的PROTELFORDOS、HEXBIN2(將HEX文件轉(zhuǎn)為機(jī)器碼文件)。學(xué)了一段時(shí)間以后,有朋友或許感覺可是癮了,老是紙上談兵,用個(gè)LED亮亮,有什么意思。。。下邊我們就準(zhǔn)備讓大家實(shí)戰(zhàn)一場了,敬請關(guān)注實(shí)戰(zhàn)之一:流水燈(此次是用真的電燈了,小心啦,沒接觸過強(qiáng)電的千萬別試,爆了管子可別怪我。。。)。單片機(jī)的內(nèi)部、外面結(jié)構(gòu)(一)一、單片機(jī)的外面結(jié)構(gòu)拿到一塊芯片,想要使用它,第一一定要知道如何連線,我們用的一塊稱之為89C51的芯片,下邊我們就看一下如何給它連線。1.電源:這自然是必不可以少的了。單片機(jī)使用的是5V電源,此中正極接40引腳,負(fù)極(地)接20引腳。振蒎電路:單片機(jī)是一種時(shí)序電路,一定供給脈沖信號才能正常工作,在單片機(jī)內(nèi)部已集成了振蕩器,使用晶體振蕩器,接18、19腳。只需買來晶振,電容,連上就能夠了,按圖1接上即可。復(fù)位引腳:按圖1中畫法連好,至于復(fù)位是何含義及為何需要復(fù)要復(fù)位,在單片機(jī)功能中介紹。EA引腳:EA引腳接到正電源端。至此,一個(gè)單片機(jī)就接好,通上電,單片機(jī)就開始工作了。二、任務(wù)剖析我們的第一個(gè)任務(wù)是要用單片機(jī)點(diǎn)亮一只發(fā)光二極管LED,明顯,這個(gè)LED一定要和單片機(jī)的某個(gè)引腳相連,不然單片機(jī)就無法控制它了,那么和哪個(gè)引腳相連呢?單片機(jī)上除了方才用掉的5個(gè)引腳,還有35個(gè),我們將這個(gè)LED和1腳相連。(見圖1,此中R1是限流電阻)依據(jù)這個(gè)圖的接法,當(dāng)1腳是高電平時(shí),LED不亮,只有1腳是低電平時(shí),LED才發(fā)亮。因此要1腳我們要能夠控制,也就是說,我們要能夠讓1引腳按要求變?yōu)楦呋虻碗娖?。即然我們要控?腳,就得給它起個(gè)名字,總不可以就叫它一腳吧?叫它什么名字呢?設(shè)計(jì)51芯片的INTEL企業(yè)已經(jīng)起好了,就叫它P1.0,這是規(guī)定,不可以夠由我們來改正。名字有了,我們又如何讓它變'高'或變'低'呢?叫人做事,說一聲就能夠,這叫公布命令,要計(jì)算機(jī)做事,也得要向計(jì)算機(jī)發(fā)命令,計(jì)算機(jī)能聽得懂的命令稱之為計(jì)算機(jī)的指令。讓一個(gè)引腳輸出高電平的指令是SETB,讓一個(gè)引腳輸出低電平的指令是CLR。所以,我們要P1.0輸出高電平,只需寫SETBP1.0,要P1.0輸出低電平,只需寫CLRP1.0就能夠了。此刻我們已經(jīng)有方法讓計(jì)算機(jī)去將P10輸出高或低電平了,但是我們?nèi)绾尾拍苡?jì)算機(jī)履行這條指令呢?總不可以也對計(jì)算機(jī)也說一聲了事吧。要解決這個(gè)問題,還得有幾步要走。第一,計(jì)算機(jī)看不懂SETBCLR之類的指令,我們得把指令翻譯成計(jì)算機(jī)能懂的方式,再讓計(jì)算機(jī)去讀。計(jì)算機(jī)能懂什么呢?它只懂相同東西——數(shù)字。所以我們得把SETBP10變?yōu)椋ǎ?,把CLRP10變?yōu)椋ǎ?,至于為何是這兩個(gè)數(shù)字,這也是由51芯片的設(shè)計(jì)者--INTEL規(guī)定的,我們不去研究。第二步,在獲得這兩個(gè)數(shù)字后,如何讓這兩個(gè)數(shù)字進(jìn)入單片機(jī)的內(nèi)部呢?這要借助于一個(gè)硬件工具"編程器"。我們將編程器與電腦連好,運(yùn)轉(zhuǎn)編程器的軟件,而后在編著區(qū)內(nèi)寫入(),寫入好,拿下片子,把片子插入做好的電路板,接通電源什么?燈不亮?這就對了,因?yàn)槲覀儗戇M(jìn)去的指令就是讓P10輸出高電平,燈自然不亮,假如亮就錯(cuò)了。此刻我們再撥下這塊芯片,從頭放回到編程器上,將編著區(qū)的內(nèi)容改為(),也就是CLRP1.0,寫片,拿下片子,把片子插進(jìn)電路板,接電,好,燈亮了。因?yàn)槲覀儗懭氲模ǎ┚褪亲孭10輸出低電平的指令。這樣我們看到,硬件電路的連線沒有做任何改變,只需改變寫入單片機(jī)中的內(nèi)容,就能夠改變電路的輸出成效。三、單片機(jī)內(nèi)部結(jié)構(gòu)剖析我們來思慮一個(gè)問題,當(dāng)我們在編程器中把一條指令寫進(jìn)單片要內(nèi)部,而后取下單片機(jī),單片機(jī)就能夠履行這條指令,那么這條指令必定保留在單片機(jī)的某個(gè)地方,并且這個(gè)地方在單片機(jī)掉電后依舊能夠保持這條指令不會(huì)丟掉,這是個(gè)什么地方呢?這個(gè)地方就是單片機(jī)內(nèi)部的只讀存儲(chǔ)器即ROM(READONLYMEMORY)。為何稱它為只讀儲(chǔ)存器呢?方才我們不是明顯把兩個(gè)數(shù)字寫進(jìn)去了嗎?本來在89C51中的ROM是一種電可擦除的ROM,稱為FLASHROM,方才我們是用的編程器,在特別的條件下由外面設(shè)施對ROM進(jìn)行寫的操作,在單片機(jī)正常工作條件下,只好從那面讀,不可以把數(shù)據(jù)寫進(jìn)去,所以我們?nèi)允前阉Q為ROM。單片機(jī)的內(nèi)外面結(jié)構(gòu)剖析(二)一、程序的完美前一次我們的程序?qū)嵲谑菦]什么用,要燈亮還要重寫一下片子,下邊我們要讓燈不斷地閃耀,這就有必定的適用價(jià)值了,比方能夠把它當(dāng)作汽車上的一個(gè)信號燈用了。如何才能讓燈不斷地閃爍呢?實(shí)質(zhì)上就是要燈亮一段時(shí)間,再滅一段時(shí)間,也就是說要P10不斷地輸出高和低電平。怎樣實(shí)現(xiàn)這個(gè)要求呢?請考慮用下邊的指令能否可行:SETBP10CLRP10這是不可以的,有兩個(gè)問題,第一,計(jì)算機(jī)履行指令的時(shí)間很快,履行完SETBP10后,燈是滅了,但在極短時(shí)間(微秒級)后,計(jì)算機(jī)又履行了CLRP10指令,燈又亮了,所以根安分辨不出燈曾滅過。第二,在履行完
CLRP10
后,不會(huì)再去履行
SETBP10指令,所以此后再也沒有機(jī)會(huì)讓滅了。為認(rèn)識(shí)決這兩個(gè)問題,我們能夠做以下假想,第一,在履行完SETBP10后,延時(shí)一段時(shí)間(幾秒或零點(diǎn)幾秒)再履行第二條指令,就能夠分辨出燈曾滅過了。第二在履行完第二條指令后,讓計(jì)算機(jī)再去履行第一條指令,不斷地在原地兜圈,我們稱之為"循環(huán)",這樣就能夠達(dá)成任務(wù)了。以下先給出程序(后邊括號中的數(shù)字是為了便于解說而寫的,實(shí)質(zhì)不用輸入):;主程序LOOP:SETBP10;(1)LCALLDELAY;(2)CLRP10;(3)LCALLDELAY;(4)AJMPLOOP;(5);以下子程序DELAY:MOVR7,#250;(6)D1:MOVR6,#250;(7)D2:DJNZR6,D2;(8)DJNZR7,D1;(9)RET;(10)END;(11)按上邊的假想剖析一下前面的五條指令。第一條是讓燈滅,第二條應(yīng)該是延時(shí),第三條是讓燈亮,第四條和第二條如出一轍,也是延時(shí),第五條應(yīng)該是轉(zhuǎn)去履行第一條指令。第二和第四條實(shí)現(xiàn)的原理稍后談,先看第五條,是一條指令,意思是轉(zhuǎn)移,往什么地方轉(zhuǎn)移呢?后邊跟的是LOOP,看一下,什么地方還有
LJMPLOOP,對了,在第一條指令的前面有一個(gè)LOOP,所以很直觀地,我們能夠認(rèn)識(shí)到,它要轉(zhuǎn)到第一條指令處。這個(gè)第一條指令前面的LOOP被稱之為標(biāo)號,它的用途就是給這一行起一個(gè)名字,便于使用。能否必定要給它起名叫LOOP呢?自然不是,起什么名字,完好由編程序的人決定,能夠稱它為A,X等等,自然,這時(shí),第五條指令LJMP后邊的名字也得隨著改了。第二條和第四條指令的用途是延時(shí),它是如何實(shí)現(xiàn)的呢?指令的形式是LCALL,這條指令稱為調(diào)用子程序指令,看一下指令后邊跟的是什么,DELAY,找一下DELAY,在第六條指令的前面,明顯,這也是一個(gè)標(biāo)號。這條指令的作用是這樣的:當(dāng)履行LCALL指令時(shí),程序就轉(zhuǎn)到LCALL后邊的標(biāo)號所標(biāo)定的程序處履行,假如在履行指令的過程中碰到RET指令,則程序就返回到LCALL指令的下邊的一條指令持續(xù)履行,從第六行開始的指令中,能夠看到的確有RET指令。在履行第二條指令后,將轉(zhuǎn)去履行第6條指令,而在履行完6,7,8,9條指令后將碰到第10條令:RET,履行該條指令后,程序?qū)⒒貋砺男械谌龡l指令,立刻P10清零,使燈亮,而后又是第四條指令,履行第四條指令就是轉(zhuǎn)去履行第6,7,8,9,10條指令,而后回來履行第5條指令,第5條指令就是讓程序回到第1條開始履行,這樣循環(huán)往復(fù),燈就在不斷地亮、滅了。在標(biāo)號DELAY標(biāo)記的這一行到RET這一行中的所有程序,這是一段延時(shí)程序,大體延時(shí)零點(diǎn)幾秒,至于詳細(xì)的時(shí)間,此后我們再學(xué)習(xí)如何計(jì)算。程序的最后一行是END,這不是一條指令,它不過告訴我們程序到此結(jié)束,它被稱為"偽指令"。二、單片機(jī)內(nèi)部結(jié)構(gòu)剖析:為了知道延時(shí)程序是如何工作的,我們必要第一認(rèn)識(shí)延時(shí)程序中出現(xiàn)的一些符號,就從R1開始,R1被稱之為工作寄存器。什么是工作寄存器呢?讓我們從現(xiàn)實(shí)生活中來找找答案。假如出一道數(shù)學(xué)題:123+567,讓你回答結(jié)果是多少,你會(huì)立刻答出是690,再看下邊一道題:123+567+562,要讓你要上回答,就不這么簡單了吧?我們會(huì)如何做呢?假若有張紙,就簡單了,我們先算出123+567=690,把690寫在紙上,而后再算690+562獲得結(jié)果是1552。這此中1552是我們想要的結(jié)果,而690并不是我們所要的結(jié)果,但是為了獲得最后結(jié)果,我們又不得不先算出690,并記下來,這其實(shí)是一此中間結(jié)果,計(jì)算機(jī)中做運(yùn)算和這個(gè)近似,為了要獲得最后結(jié)果,常常要做好多步的中間結(jié)果,這些中間結(jié)果要有個(gè)地方放才行,把它們放哪呢?放在前面提到過的ROM中能夠嗎?明顯不可以,因?yàn)橛?jì)算機(jī)要將結(jié)果寫進(jìn)去,而ROM是不可以夠?qū)懙?,所以在單片機(jī)中還有一個(gè)地區(qū)稱為RAM區(qū)(RAM是隨機(jī)存取儲(chǔ)存器的英文縮寫),它能夠?qū)?shù)據(jù)寫進(jìn)去。特別地,在MCS-51單片機(jī)中,將RAM中分出一塊地區(qū),稱為工作寄存器區(qū)。半導(dǎo)體儲(chǔ)存器一、幾個(gè)基本觀點(diǎn)數(shù)的實(shí)質(zhì)和物理現(xiàn)象。我們知道,計(jì)算機(jī)能夠進(jìn)行數(shù)學(xué)運(yùn)算,這可令我們特別的難以理解,計(jì)算機(jī)嗎,我們雖不了解它的構(gòu)成,但它總不過一些電子元器件,怎么能夠進(jìn)行數(shù)學(xué)運(yùn)算呢?我們做數(shù)學(xué)題如37+45是這樣做的,先在紙上寫37,而后在下邊寫45,而后大腦運(yùn)算,最后寫出結(jié)果,運(yùn)算的原資料:37、45和結(jié)果:82都是寫在紙上的,計(jì)算機(jī)中又是放在什么地方呢?為認(rèn)識(shí)決這個(gè)問題,先讓我們做一個(gè)實(shí)驗(yàn):這里有一盞燈,我們知道燈要么亮,要么不亮,就有兩種狀態(tài),我們能夠用’0’和’1’來取代這兩種狀態(tài),規(guī)定亮為’1’,不亮為’0’。此刻放上兩盞燈,一共有幾種狀態(tài)呢?我們列表來看一下:狀態(tài)表達(dá)00011011請大家自已寫上3盞燈的狀況我們來看,這個(gè)000,001,101不就是我們學(xué)過的的二進(jìn)制數(shù)嗎?本來,燈的亮和滅不過一種物理現(xiàn)象,可當(dāng)我們把它們按一按的次序排更好后,燈的亮和滅就代表了數(shù)字了。讓我們再抽象一步,燈為何會(huì)亮呢?看電路1,是因?yàn)檩敵鲭娐份敵龈唠娖?,給燈通了電。所以,燈亮和滅就能夠用電路的輸出是高電平仍是低電平來代替了。這樣,數(shù)字就和電平的高、低聯(lián)系上了。(請想一下,我們還看到過什么樣的近似的例子呢?(海軍之)燈語、旗語,電報(bào),甚至紅、綠燈)位的含義:經(jīng)過上邊的實(shí)驗(yàn)我們已經(jīng)知道:一盞燈亮或許說一根線的電平的高低,能夠代表兩種狀態(tài):0和1。實(shí)質(zhì)上這就是一個(gè)二進(jìn)制位,所以我們就把一根線稱之為一“位”,用BIT表示。字節(jié)的含義:一根線能夠表于0和1,兩根線能夠表達(dá)00,01,10,11四種狀態(tài),也就是能夠表于0到3,而三根能夠表達(dá)0-7,計(jì)算機(jī)中往常用8根線放在一同,同時(shí)計(jì)數(shù),就能夠表過到0-255一共256種狀態(tài)。這8根線或許8位就稱之為一個(gè)字節(jié)(BYTE)。不要問我為何是8根而不是其余數(shù),因?yàn)槲乙膊恢馈#ㄓ?jì)算機(jī)世界是一個(gè)人造的世界,不是自然界,好多事情你無法問為何,只能說:它是一種規(guī)定,大家在此后的學(xué)習(xí)過程中也要注意這個(gè)問題)二、儲(chǔ)存器的工作原理:1、儲(chǔ)存器結(jié)構(gòu)儲(chǔ)存器就是用來寄存數(shù)據(jù)的地方。
它是利用電平的高低來寄存數(shù)據(jù)的,
也就是說,它寄存的其實(shí)是電平的高、低,而不是我們所習(xí)慣以為的
1234這樣的數(shù)字,這樣,我們的一個(gè)謎團(tuán)就解開了,計(jì)算機(jī)也沒什么神奇的嗎。圖2圖3讓我們看圖2。這是一個(gè)儲(chǔ)存器的表示圖:一個(gè)儲(chǔ)存器就象一個(gè)個(gè)的小抽屜,一個(gè)小抽屜里有八個(gè)小格子,每個(gè)小格子就是用來寄存“電荷”的,電荷經(jīng)過與它相連的電線傳進(jìn)來或開釋掉,至于電荷在小格子里是如何存的,就不用我們費(fèi)心了,你能夠把電線想象成水管,小格子里的電荷就象是水,那就好理解了。儲(chǔ)存器中的每個(gè)小抽屜就是一個(gè)放數(shù)據(jù)的地方,我們稱之為一個(gè)“單元”。有了這么一個(gè)結(jié)構(gòu),我們就能夠開始寄存數(shù)據(jù)了,想要放進(jìn)一個(gè)數(shù)據(jù)12,也就是00001100,我們只需把第二號和第三號小格子里存滿電荷,而其余小格子里的電荷給放掉就行了(看圖3)。但是問題出來了,看圖2,一個(gè)儲(chǔ)存器有好多單元,線是并聯(lián)的,在放入電荷的時(shí)候,會(huì)將電荷放入所有的單元中,而開釋電荷的時(shí)候,會(huì)把每個(gè)單元中的電荷都放掉,這樣的話,不論儲(chǔ)存器有多少個(gè)單元,都只好放同一個(gè)數(shù),這自然不是我們所希望的,所以,要在結(jié)構(gòu)上稍作變化,看圖2,在每個(gè)單元上有個(gè)控制線,我想要把數(shù)據(jù)放進(jìn)哪個(gè)單元,就給一個(gè)信號這個(gè)單元的控制線,這個(gè)控制線就把開關(guān)翻開,這樣電荷就能夠自由流動(dòng)了,而其余單元控制線上沒有信號,所以開關(guān)不翻開,不會(huì)遇到影響,這樣,只需控制不同單元的控制線,就能夠向各單元寫入不同的數(shù)據(jù)了,相同,假如要某個(gè)單元中取數(shù)據(jù),也只需翻開相應(yīng)的控制開關(guān)就行了。儲(chǔ)存器譯碼那么,我們?nèi)绾蝸砜刂聘鱾€(gè)單元的控制線呢?這個(gè)還不簡單,把每個(gè)單元元的控制線都引到集成電路的外面不就行了嗎?事情可沒那么簡單,一片27512儲(chǔ)存器中有65536個(gè)單元,把每根線都引出來,這個(gè)集成電路就得有6萬多個(gè)腳?不可以,怎么辦?要想法減少線的數(shù)目。我們有一種方法稱這為譯碼,簡單介紹一下:一根線能夠代表2種狀態(tài),2根線能夠代表4種狀態(tài),3根線能夠代表幾種,256種狀態(tài)又需要幾根線代表?8種,8根線,所以65536種狀態(tài)我們只需要16根線就能夠代表了。圖4儲(chǔ)存器的選片及總線的觀點(diǎn)至此,譯碼的問題解決了,讓我們再來關(guān)注此外一個(gè)問題。送入每個(gè)單元的八根線是用從什么地方來的呢?它就是從計(jì)算機(jī)上接過來的,一般地,這八根線除了接一個(gè)儲(chǔ)存器以外,還要接其余的器件,如圖4所示。這樣問題就出來了,這八根線既然不是儲(chǔ)存器和計(jì)算機(jī)之間專用的,假如老是將某個(gè)單元接在這八根線上,就不好了,比方這個(gè)儲(chǔ)存器單元中的數(shù)值是0FFH另一個(gè)儲(chǔ)存器的單元是00H,那么這根線究竟是處于高電平,仍是低電平?莫非要打斗看誰歷害了?所以我們要讓它們分別。方法自然很簡單,當(dāng)外面的線接到集成電路的引腳進(jìn)來后,不直接接到各單元去,中間再加一組開關(guān)(參照圖4)就行了。平時(shí)我們讓開關(guān)翻開著,假如的確是要向這個(gè)儲(chǔ)存器中寫入數(shù)據(jù),或要從儲(chǔ)存器中讀出數(shù)據(jù),再讓開關(guān)接通就行了。這組開關(guān)由三根引線選擇:讀控制端、寫控制端和片選端。要將數(shù)據(jù)寫入片中,先選中該片,而后發(fā)出寫信號,開關(guān)就合上了,并將傳過來的數(shù)據(jù)(電荷)寫入片中。假如要讀,先選中該片,而后發(fā)出讀信號,開關(guān)合上,數(shù)據(jù)就被送出去了。注企圖4,讀和寫信號同時(shí)還接入到另一個(gè)儲(chǔ)存器,但是因?yàn)槠x端不同,所以雖有讀或?qū)懶盘?,但沒有片選信號,所以另一個(gè)儲(chǔ)存器不會(huì)“誤解”而開門,造成矛盾。那么會(huì)不同時(shí)選中兩片芯片呢?只假如設(shè)計(jì)好的系統(tǒng)就不會(huì),因?yàn)樗怯捎?jì)算控制的,而不是我們?nèi)藖砜刂频?,假如真的出現(xiàn)同時(shí)出現(xiàn)選中兩片的狀況,那就是電路出了故障了,這不在我們的討論之列。從上邊的介紹中我們已經(jīng)看到,用來傳達(dá)數(shù)據(jù)的八根線其實(shí)不是專用的,而是好多器件大家共用的,所以我們稱之為數(shù)據(jù)總線,總線英文名為BUS,總即公交車道,誰者能夠走。而十六根地址線也是連在一同的,稱之為地點(diǎn)總線。半導(dǎo)體儲(chǔ)存器的分類按功能能夠分為只讀和隨機(jī)存取儲(chǔ)存器兩大類:所謂只讀,從字面上理解就是只好夠從里面讀,不可以寫進(jìn)去,它近似于我們的書籍,發(fā)到我們手回以后,我們只好讀里面的內(nèi)容,不可以夠任意改正書籍上的內(nèi)容。只讀儲(chǔ)存器的英文縮寫為ROM(READONLYMEMORY)所謂隨機(jī)存取儲(chǔ)存器,即隨時(shí)能夠改寫,也能夠讀出里面的數(shù)據(jù),它近似于我們的黑板,我能夠隨時(shí)寫東西上去,也能夠用黑板擦擦掉重寫。隨機(jī)儲(chǔ)存器的英文縮寫為RAM(READRANDOMMEMORY)這兩種儲(chǔ)存器的英文縮寫必定要記牢。注意:所謂的只讀和隨機(jī)存取都是指在正常工作狀況下而言,也就是在使用這塊儲(chǔ)存器的時(shí)候,而不是指制造這塊芯片的時(shí)候。不然,只讀儲(chǔ)存器中的數(shù)據(jù)是怎么來的呢?其實(shí)這個(gè)道理也很好理解,書籍拿到我們手里是不可以改了,能夠當(dāng)它仍是原資料——白紙的時(shí)候,自然能夠由印刷廠印上去了。趁便解說一下其余幾個(gè)常有的觀點(diǎn)。PROM,稱之為可編程儲(chǔ)存器。這就象我們的練習(xí)本,買來的時(shí)候是空白的,能夠?qū)憱|西上去,可一旦寫上去,就擦不掉了,所以它只好用寫一次,假如寫錯(cuò)了,就報(bào)銷了。EPROM,稱之為紫外線擦除的可編程只讀儲(chǔ)存器。它里面的內(nèi)容寫上去以后,假如感覺不滿意,能夠用一種特別的方法去掉后重寫,這就是用紫外線照耀,紫外線就象“消字靈”,可以把字去掉,而后再重寫。自然消的次數(shù)多了,也就不靈光了,所以這類芯片能夠擦除的次數(shù)也是有限的——幾百次吧。FLASH,稱之為閃速儲(chǔ)存器,它和EPROM近似,寫上去的東西也能夠擦掉重寫,但它要方便一些,不需要光照了,只需用電學(xué)方法就能夠擦除,所以就方便很多,并且壽面也很長(幾萬到幾十萬次不等)。再次重申,這里的所有的寫都不是指在正常工作條件下。不論是PROM、EPROM仍是FLASHROM,它們的寫都要有特別的條件,一般我們用一種稱之為“編程器”的設(shè)施來做這項(xiàng)工作,一旦把它裝到它的工作地點(diǎn),就不可以隨意改寫了。單片機(jī)第五課:單片機(jī)的內(nèi)外面結(jié)構(gòu)剖析(三)一、延時(shí)程序剖析前一次課中,我們已經(jīng)知道,程序中的符號R7、R6是代表了一個(gè)個(gè)的RAM單元,是用來放一些數(shù)據(jù)的,下邊我們再來看一下其余符號的含義。DELAY:MOVR7,#250;(6)D1:MOVR6,#250;(7)D2:DJNZR6,D2;(8)DJNZR7,D1;(9)RET;(10)MOV:這是一條指令,意思是傳達(dá)數(shù)據(jù)。說到傳達(dá),我們都很清楚,傳東西要從一個(gè)人的手上傳到另一個(gè)人的手上,也就是說要有一個(gè)接受者,一個(gè)傳達(dá)者和相同東西。從指令MOVR7,#250中來剖析,R7是一個(gè)接受者,250是被傳達(dá)的數(shù),傳達(dá)者在這條指令中被省略了(注意:其實(shí)不是每一條傳達(dá)指令都會(huì)省的,事實(shí)上大部份數(shù)據(jù)傳達(dá)指令都會(huì)有傳達(dá)者)。它的意義也很明顯:將數(shù)據(jù)
250送到
R7中去,所以履行完這條指令后,
R7單元中的值就應(yīng)該是
250。在
250前面有個(gè)
#號,這又是什么意思呢?這個(gè)
#就是用來說明
250就是一個(gè)被傳達(dá)的東西自己,而不是傳達(dá)者。那么
MOVR6,#250
是什么意思,應(yīng)該不用剖析了吧。2.DJNZ:這是另一條指令,我們來看一下這條指令后邊隨著的兩個(gè)東西,一個(gè)是
R6,一個(gè)是D2,R6我們自然已知是什么了,查一下D2是什么。D2在本行的前面,我們已學(xué)過,這稱之為標(biāo)號。標(biāo)號的用途是什么呢?就是給本行起一個(gè)名字。DJNZ指令的履行過程是這樣的,它將后來面的第一個(gè)參數(shù)中的值減1,而后看一下,這個(gè)值能否等于0,假如等于0,就往下履行,假如不等于0,就轉(zhuǎn)移,轉(zhuǎn)到什么地方去呢?可能大家已猜到了,轉(zhuǎn)到第二個(gè)參數(shù)所指定的地方去(請大家用自已的話講一下這條語句是如何履行的)。本條指令的最后履行結(jié)果就是,在原地轉(zhuǎn)圈250次。履行完了DJNZR6,D2以后(也就是R6的值等于0以后),就會(huì)去履行下邊一行,也就4.
是DJNZR7,D1,請大家自行剖析一下這句話履行的結(jié)果。(轉(zhuǎn)去履行MOVR6,#250,同時(shí)R7中的值減1),最后DJNZR6,D2這句話將被履行250*250=62500次,履行這么多次同一條指令干嗎?就是為了延時(shí)。一個(gè)問題:假如在R6中放入0,會(huì)有什么樣的結(jié)果。二、時(shí)序剖析:前面我們介紹了延時(shí)程序,但這還不完美,因?yàn)?,我們只知道DJNZR6,D2這句話會(huì)被履行62500次,但是履行這么多次需要多長時(shí)間呢?能否知足我們的要求呢?我們還不知道,所以下面要來解決這個(gè)問題。先提一個(gè)問題:我們學(xué)校里什么是最重要的。(鈴聲)校長能夠出差,老師能夠歇息,但學(xué)校一日無鈴聲必然大亂。整個(gè)學(xué)校就是在鈴聲的一致指揮下,步伐一致,一致協(xié)調(diào)地工作著。這個(gè)鈴是按必定的時(shí)間安排來響的,我們能夠稱之為“時(shí)序時(shí)間的次序”。一個(gè)由人構(gòu)成的單位尚且要有必定的時(shí)序,計(jì)算機(jī)自然更要有嚴(yán)格的時(shí)序。事實(shí)上,計(jì)算機(jī)更象一個(gè)大鐘,什么時(shí)候分針動(dòng),什么時(shí)候秒針動(dòng),什么時(shí)候時(shí)針動(dòng),都有嚴(yán)格的規(guī)定,一點(diǎn)也不可以亂。計(jì)算機(jī)要達(dá)成的事更復(fù)雜,所以它的時(shí)序也更復(fù)雜。我們已知,計(jì)算機(jī)工作時(shí),是一條一條地從ROM中取指令,而后一步一步地履行,我們規(guī)定:計(jì)算機(jī)接見一次儲(chǔ)存器的時(shí)間,稱之為一個(gè)機(jī)器周期。這是一個(gè)時(shí)間基準(zhǔn),好象我們?nèi)擞谩懊搿弊鳛槲覀兊臅r(shí)間基準(zhǔn)相同,為何不干脆用“秒”,多好,很習(xí)慣,學(xué)下去我們就會(huì)知道用“秒”反而不習(xí)慣。一個(gè)機(jī)器周期包含12個(gè)時(shí)鐘周期。下邊讓我們算一下一個(gè)機(jī)器周期是多長時(shí)間吧。設(shè)一個(gè)單片機(jī)工作于12M晶振,它的時(shí)鐘周期是1/12(微秒)。它的一個(gè)機(jī)器周期是12*(1/12)也就是1微秒。(請計(jì)算一個(gè)工作于6M晶振的單片機(jī),它的機(jī)器周期是多少)。MCS-51單片機(jī)的所有指令中,有一些達(dá)成得比較快,只需一個(gè)機(jī)器周期就行了,有一些完成得比較慢,得要2個(gè)機(jī)器周期,還有兩條指令要4個(gè)機(jī)器周期才行。這也不難再解,不是嗎?我讓你掃地的履行要達(dá)成總得比要你達(dá)成擦黑板的指令時(shí)間要長。為了恒量指令履行時(shí)間的長短,又引入一個(gè)新的觀點(diǎn):指令周期。所謂指令周期就是指履行一條指令的時(shí)間。INTEL對每一條指令都給出了它的指令周期數(shù),這些數(shù)據(jù),大部份不需要我們?nèi)ビ洃?,但是有一些指令是需要記著的,如DJNZ指令是雙周期指令。下邊讓我們來計(jì)算方才的延時(shí)。第一一定要知道晶振的頻次,我們設(shè)所用晶振為12M,則一個(gè)機(jī)器周期就是1微秒。而DJNZ指令是雙周期指令,所以履行一次要2個(gè)微秒。一共履行62500次,正好125000微秒,也就是125毫秒。練習(xí):設(shè)計(jì)一個(gè)延時(shí)100毫秒的延時(shí)程序。重點(diǎn)剖析:1、一個(gè)單元中的數(shù)能否能夠超出255。2、如何分派兩個(gè)數(shù)。三、復(fù)位電路任何單片機(jī)在工作從前都要有個(gè)復(fù)位的過程,復(fù)位是什么意思呢?它就象是我們上課從前打的預(yù)備鈴。預(yù)備鈴一響,大家就自動(dòng)地從操場、其余地方進(jìn)入教室了,在這一段時(shí)間里,是沒有老師干涉的,對單片機(jī)來說,是程序還沒有開始履行,是在做準(zhǔn)備工作。明顯,準(zhǔn)備工作不需要太長的時(shí)間,復(fù)位只需要5ms的時(shí)間就能夠了。如何進(jìn)行復(fù)位呢?只需在單片機(jī)的RST引腳上加上高電平,就能夠了,按上邊所說,時(shí)間許多于5ms。為了達(dá)到這個(gè)要求,能夠用好多種方法,這里供給一種供參照,見圖1。實(shí)質(zhì)上,我們在前一次實(shí)驗(yàn)的圖中已見到過了。圖1:復(fù)位電路這類復(fù)位電路的工作原理是:通電時(shí),電容兩頭相當(dāng)于是短路,于是RST引腳上為高電平,而后電源經(jīng)過電阻對電容充電,RST端電壓慢慢降落,降到必定程序,即為低電平,單片機(jī)開始正常工作。單片機(jī)的內(nèi)外面結(jié)構(gòu)剖析(四)第三個(gè)實(shí)驗(yàn)上兩次我們做過兩個(gè)實(shí)驗(yàn),都是讓P1.0這個(gè)引腳使燈亮,我們能夠假想:既然P1.0能夠讓燈亮,那么其余的引腳可不可以夠呢?看一以下圖1,它是8031單片機(jī)引腳的說明,在P1.0旁邊有P1.1,,它們能否都能夠讓燈亮呢?除了以P1開頭的外,還有以P0,P2,P3開頭的,數(shù)一下,一共是32個(gè)引腳,前面我們以學(xué)過7個(gè)引腳,加上這32個(gè)這39個(gè)了。它們都以字開頭,不過后邊的數(shù)字不相同,它們能否有什么聯(lián)系呢?它們能不可以都讓燈亮呢?在我們的實(shí)驗(yàn)板上,除了P10以外,還有P11P17都與LED相連,下邊讓我們來做一個(gè)實(shí)驗(yàn),程序以下:;試驗(yàn)程序MAIN:MOVP1,#0FFHLCALLDELAYMOVP1,#00HLCALLDELAYLJMPMAINDELAY:MOVR7,#250D1:MOVR6,#250D2:DJNZR6,D2DJNZR7,D1RETEND將這段程序轉(zhuǎn)為機(jī)器碼,用編程器寫入芯片中,結(jié)果如何?通電此后我們能夠看到8只LED所有在閃耀。所以,P10P17是所有能夠點(diǎn)亮燈的。事實(shí)上,凡以P開頭的這32個(gè)引腳都是可以點(diǎn)亮燈的,也就是說:這32個(gè)引腳都能夠作為輸出使用,假如不用來點(diǎn)亮LED,能夠用來控制繼電器,能夠用來控制其余的履行機(jī)構(gòu)。程序剖析:這段程序和前面做過的程序比較,只有兩處不相同:第一句:本來是SETBP1.0此刻改為MOVP1,#0FFH,第三句:本來是CLRP1.0,此刻改為MOVP1.0,#00H。從中能夠看出,P1是的全體的代表,一個(gè)P1就表示了所有的這八個(gè)管腳了。自然用的指令也不相同了,是用MOV指令。為何用這條指令?看圖2,我們把P1作為一個(gè)整體,就把它看作是一個(gè)儲(chǔ)存器的單元,對一個(gè)單元送進(jìn)一個(gè)數(shù)能夠用MOV指令。
,二、第四個(gè)實(shí)驗(yàn)除了能夠作為輸出外,這32個(gè)引腳還可以夠做什么呢?下邊再來做一個(gè)實(shí)驗(yàn),程序以下:實(shí)驗(yàn)程序MAIN:MOVP3,#0FFHLOOP:MOVA,P3MOVP1,ALJMPLOOP先看一下實(shí)驗(yàn)的結(jié)果:所有燈所有不亮,而后我按下一個(gè)按鈕,第()個(gè)燈亮了,再按下另一個(gè)按鈕,第()個(gè)燈亮了,松開按鈕燈就滅了。從這個(gè)實(shí)驗(yàn)現(xiàn)象聯(lián)合電路來剖析一下程序。從硬件電路的連線能夠看出,有四個(gè)按鈕被接入到P3口的P32,P33,P34,P35。第一條指令的用途我們能夠猜到:使P3口所有為高電平。第二條指令是MOVA,P3,此中MOV已經(jīng)見,是送數(shù)的意思,這條指令的意思就是將P3口的數(shù)送到A中去,我們能夠把A當(dāng)作是一此中間單元(看圖3),第三句話是將A中的數(shù)又送到P1口去,第四句話是循環(huán),就是不斷地重復(fù)這個(gè)過程,這我們已見過。當(dāng)我們按下第一個(gè)按鈕時(shí),第(3)只燈亮了,所以P12口應(yīng)該輸出是低電平,為何P12口會(huì)輸出低電平呢?我們看一下有什么被送到了P1口,只有從P3口進(jìn)來的數(shù)送到A,又被送到了P1口,所以,必定是P3口進(jìn)來的數(shù)使得P12位輸出電平的。P3口的P32位的按鈕被按下,使得P32位的電平為低,經(jīng)過程序,又使P12口輸出低電平,所以P3口起來了一個(gè)輸入的作用。考證:按第二、三、四個(gè)按鈕,同時(shí)按下2個(gè)、3個(gè)、4個(gè)按鈕都能夠獲得相同的結(jié)論,所以P3口的確起到了輸入作用,這樣,我們能夠看到,以P字開頭的管腳,不單能夠用作輸出,還可以夠用作輸入,其余的管腳能否能夠呢?是的,都能夠。這32個(gè)引腳就稱之為并行口,下邊我們就對并行口的結(jié)構(gòu)作一個(gè)剖析,看一下它是如何實(shí)現(xiàn)輸入和輸出的。并行口結(jié)構(gòu)剖析:1、輸出結(jié)構(gòu)先看P1口的一位的結(jié)構(gòu)表示圖(只畫出了輸出部份):從圖中能夠看出,開關(guān)的翻開和合上代表了引腳輸出的高和低,假如開關(guān)合上了,則引腳輸出就是低,假如開關(guān)翻開了,則輸出高電平,這個(gè)開關(guān)是由一根線來控制的,這根數(shù)據(jù)總線是出自于CPU,讓我們回憶一下,數(shù)據(jù)總線是一根大家公用的線,好多的器件和它連在一同,在不同的時(shí)候,不同的器件自然需要不同的信號,如某一時(shí)刻我們讓這個(gè)引腳輸出高電平,并要求保持若干時(shí)間,在這段時(shí)間里,計(jì)算機(jī)自然在忙個(gè)不斷,在與其余器件進(jìn)行聯(lián)系,這根控制線上的電平未必能保持本來的值不變,輸出就會(huì)發(fā)生變化了。怎么解決這個(gè)問題呢?我們在儲(chǔ)存器一節(jié)中學(xué)過,儲(chǔ)存器中是能夠寄存電荷的,我們不如也加一個(gè)小的儲(chǔ)存器的單元,并在它的前面加一個(gè)開關(guān),要讓這一位輸出時(shí),就把開關(guān)打開,信號就進(jìn)入儲(chǔ)存器的單元,而后立刻封閉開關(guān),這樣這一位的狀態(tài)就被保留下來,直到下一次命令讓它把開關(guān)再翻開為止。這樣就能使這一位的狀態(tài)與其余器件沒關(guān)了,這么一個(gè)小單元,我們給它一個(gè)很形象的名字,稱之為“鎖存器”。2、輸入結(jié)構(gòu)這是并行口的一位的輸出結(jié)構(gòu)表示圖,再看,除了輸出以外,還有兩根線,一根從外面引腳接入,另一根從鎖存器的輸出接出,分別注明讀引腳和讀鎖存器。這兩根線是用于從外面接收信號的,為何要兩根呢?本來,在51單片機(jī)中輸入有兩種方式,分別稱為‘讀引腳’和‘讀鎖存器’,第一種方式是將引腳作為輸入,那是真切地從外面引腳讀進(jìn)輸入的值,第二種方式是該引腳處于輸出狀態(tài)時(shí),有時(shí)需要改變這一位的狀態(tài),則其實(shí)不需要真切地讀引腳狀態(tài),而不過讀入鎖存器的狀態(tài),而后作某種變換后再輸出。請注意輸入結(jié)構(gòu)圖,假如將這一根引線作為輸進(jìn)口使用,我們其實(shí)不可以保證在任何時(shí)刻都能得到正確的結(jié)果(為何?)參照圖2輸入表示圖。接在外面的開關(guān)假如翻開,則應(yīng)該是輸入1,而假如閉合開關(guān),則輸入0,但是,假如單片機(jī)內(nèi)部的開關(guān)是閉合的,那么不論外面的開關(guān)是開仍是閉,單片機(jī)接遇到的數(shù)據(jù)都是0??梢?,要讓這一端口作為輸入使用,要先做一個(gè)‘準(zhǔn)備工作’,就是先讓內(nèi)部的開關(guān)斷開,也就是讓端口輸出‘1’才行。正因?yàn)橐茸鲞@么一個(gè)準(zhǔn)備工作,所以我們稱之為“準(zhǔn)雙向I/O口”。以上是P1口的一位的結(jié)構(gòu),P1口其余各位的結(jié)構(gòu)與之相同,而其余三個(gè)口:P0、P2、P3則除入作為輸入輸出口以外還有其余用途,所以結(jié)構(gòu)要稍復(fù)雜一些,但其用于輸入、輸出的結(jié)構(gòu)是相同的。看圖()。對我們來說,這些附帶的功能不用由我們來控制,所以我們就不去關(guān)懷它了。單片機(jī)內(nèi)部結(jié)構(gòu)剖析(五)經(jīng)過前面的學(xué)習(xí),我們已知單片機(jī)的內(nèi)部有ROM、有RAM、有并行I/O東西以外,單片機(jī)內(nèi)部終究還有些什么,這些個(gè)瑣碎的東西怎么連在一同的,內(nèi)部作一個(gè)完好的剖析吧!
口,那么,除了這些讓我們來對單片機(jī)看圖(1)(本圖太大,請大家找本書看吧,一般講單片機(jī)的書,隨意哪本都有)。從圖中我們能夠看出:在51單片機(jī)內(nèi)部有一個(gè)CPU用來運(yùn)算、控制,有四個(gè)并行I/O口,分別是P0、P1、P2、P3,有ROM,用來寄存程序,有RAM,用來寄存中間結(jié)果,其余還有準(zhǔn)時(shí)/計(jì)數(shù)器,串行I/O口,中止系統(tǒng),以及一個(gè)內(nèi)部的時(shí)鐘電路。在一個(gè)51單片機(jī)的內(nèi)部包含了這么多的東西。對上邊的圖進(jìn)前進(jìn)一步的剖析,我們已知,對并行I/O口的讀寫只需將數(shù)據(jù)送入到相應(yīng)口的鎖存器就能夠了,那么對于準(zhǔn)時(shí)/計(jì)數(shù)器,串行I/O口等怎么用呢?在單片機(jī)中有一些獨(dú)立的儲(chǔ)存單元是用來控制這些器件的,被稱之為特別功能寄存器(SFR)。
I/O事實(shí)上,我們已接觸過P1這個(gè)特別功能寄存器了,還有哪些呢?看表1:表1:特別功能寄存器符號地點(diǎn)功能介紹BF0HB寄存器ACCE0H累加器PSWD0H程序狀態(tài)字IPB8H中止優(yōu)先級控制寄存器P3B0HP3口鎖存器IEA8H中止同意控制寄存器P2A0HP2口鎖存器SBUF99H串行口鎖存器SCON98H串行口控制寄存器P190HP1口鎖存器TH18DH準(zhǔn)時(shí)器/計(jì)數(shù)器1(高8位)TH08CH準(zhǔn)時(shí)器/計(jì)數(shù)器1(低8位)TL18BH準(zhǔn)時(shí)器/計(jì)數(shù)器0(高8位)TL08AH準(zhǔn)時(shí)器/計(jì)數(shù)器0(低8位)TMOD89A準(zhǔn)時(shí)器/計(jì)數(shù)器方式控制寄存器TCON88H準(zhǔn)時(shí)器/計(jì)數(shù)器控制寄存器DPH83H數(shù)據(jù)地點(diǎn)指針(高8位)DPL82H數(shù)據(jù)地點(diǎn)指針(低8位)SP81H貨倉指針P080HP0口鎖存器PCON87H電源控制寄存器表1下邊,我們介紹一下幾個(gè)常用的SFR,看圖2。ACC:累加器,往常用A表示。這是個(gè)什么東西,可不可以從名字上理解,它是一個(gè)寄存器,而不是一個(gè)做加法的東西,為何給它這么一個(gè)名字呢?或許是因?yàn)樵谶\(yùn)算器做運(yùn)算時(shí)此中一個(gè)數(shù)必定是在ACC中的緣由吧。它的名字特別,身份也特別,稍后我們將學(xué)到指令,能夠發(fā)現(xiàn),所有的運(yùn)算類指令都離不開它。B:一個(gè)寄存器。在做乘、除法時(shí)放乘數(shù)或除數(shù),不做乘除法時(shí),隨你怎么用。3.PSW:程序狀態(tài)字。這是一個(gè)很重要的東西,里面放了CPU工作時(shí)的好多狀態(tài),借此,我們能夠認(rèn)識(shí)CPU的目前狀態(tài),并作出相應(yīng)的辦理。它的各位功能請看表2表2:PSW
各位功能D7
D6
D5
D4
D3
D2
D1
D0CY
AC
F0
RS1
RS0
OV
P下邊我們逐個(gè)介紹各位的用途(1)CY:進(jìn)位標(biāo)記。
8051中的運(yùn)算器是一種
8位的運(yùn)算器,我們知道,
8位運(yùn)算器只好表示到0-255,假如做加法的話,兩數(shù)相加可能會(huì)超出
255,這樣最高位就會(huì)丟掉,造成運(yùn)算的錯(cuò)誤,怎么辦?最高位就進(jìn)到這里來。這樣就沒事了。例:78H+97H(01111000+10010111
)(2)AC:半進(jìn)位標(biāo)記。例:57H+3AH(01010111+00111010)3)F0:用戶標(biāo)記位,由我們(編程人員)決定什么時(shí)候用,什么時(shí)候不用。4)RS1、RS0:工作寄存器組選擇位。這個(gè)我們已知了。5)0V:溢出標(biāo)記位。什么是溢出我們稍后再談吧。6)P:奇偶校驗(yàn)位:它用來表示ALU運(yùn)算結(jié)果中二進(jìn)制數(shù)位“1”的個(gè)數(shù)的奇偶性。若為奇數(shù),則P=1,不然為0。例:某運(yùn)算結(jié)果是78H(01111000),明顯1的個(gè)數(shù)為偶數(shù),所以P=0。4、DPTR(DPH、DPL):數(shù)據(jù)指針,能夠用它來接見外面數(shù)據(jù)儲(chǔ)存器中的任一單元,假如不用,也能夠作為通用寄存器來用,由我們自已決定如何使用。5、P0、P1、P2、P3:這個(gè)我們已經(jīng)知道,是四個(gè)并行輸入/輸出口的寄存器。它里面的內(nèi)容對應(yīng)著管腳的輸出。6、SP:貨倉指針。貨倉介紹:平時(shí)生活中,我們都注意到過這樣的現(xiàn)象,家里洗的碗,一只一只摞起來,最晚放上去的放在最上邊,而最早放上去的則放在最下邊,在取的時(shí)候正好相反,先從最上邊取,這類現(xiàn)象我們用一句話來歸納:“先進(jìn)后出,后進(jìn)先出”。請大家想一想,還有什么地方有這類現(xiàn)象?其實(shí)俯拾皆是,建筑工地上堆放的磚頭、資料,庫房里放的貨物,都是“先進(jìn)后出,后進(jìn)先出”,這實(shí)質(zhì)是一種存取物件的規(guī)則,我們稱之為“貨倉”。在單片機(jī)中,我們也能夠在RAM中結(jié)構(gòu)這樣一個(gè)地區(qū),用來寄存數(shù)據(jù),這個(gè)地區(qū)寄存數(shù)據(jù)的規(guī)則就是“先進(jìn)后出,后進(jìn)先出”,我們稱之為“貨倉”。為何需要這樣來寄存數(shù)據(jù)呢?儲(chǔ)存器自己不是能夠按地點(diǎn)來寄存數(shù)據(jù)嗎?對,知道了地點(diǎn)的確就能夠知道里面的內(nèi)容,但假如我們需要寄存的是一批數(shù)據(jù),每一個(gè)數(shù)據(jù)都需要知道地點(diǎn)那不是麻煩嗎?假如我們讓數(shù)據(jù)一個(gè)接一個(gè)地?cái)R置,那么我們只需知道第一個(gè)數(shù)據(jù)所在地點(diǎn)單元就能夠了(看圖2)假如第一個(gè)數(shù)據(jù)在27H,那么第二、三個(gè)就在28H、29H了。所以利用貨倉這類方法來放數(shù)據(jù)能夠簡化操作那么51中貨倉什么地方呢?單片機(jī)中能寄存數(shù)據(jù)的地區(qū)有限,我們不可以夠特意分派一塊地方做貨倉,所以就在內(nèi)存(RAM)中開拓一塊地方,用于貨倉,但是用內(nèi)存的哪一塊呢?仍是不好定,因?yàn)?1是一種通用的單片機(jī),各人的實(shí)質(zhì)需求各不相同,有人需要多一些貨倉,而有人則不需要那么多,所以怎么分派都不適合,如何來解決這個(gè)問題?分不好干脆就不分了,把分的權(quán)益給用戶(編程者),依據(jù)自已的需要去定吧,所以51單片機(jī)中貨倉的地點(diǎn)是能夠變化的。而這類變化就表此刻SP中值的變化,看圖2,SP中的值等于27H不就相當(dāng)于是一個(gè)指針指向27H單元嗎?自然在真切的51機(jī)中,開始指針?biāo)傅牡攸c(diǎn)并不是就是數(shù)據(jù)寄存的地點(diǎn),而是數(shù)據(jù)寄存的前一個(gè)地點(diǎn),比方一開始指針是指向27H單元的,那么第一個(gè)數(shù)據(jù)的地點(diǎn)是28H單元,而不是27H單元,為何會(huì)這樣,我們在學(xué)貨倉命令時(shí)再說明。圖2其余的SFR,我們在用到時(shí)再介紹。(尋址方式與指令系統(tǒng))經(jīng)過前面的學(xué)習(xí),我們已經(jīng)認(rèn)識(shí)了單片機(jī)內(nèi)部的結(jié)構(gòu),并且也已經(jīng)知道,要控制單片機(jī),讓它為我們干學(xué),要用指令,我們已學(xué)了幾條指令,但很零落,從此刻開始,我們將要系統(tǒng)地學(xué)習(xí)8051的指令部份。一、概括1、指令的格式我們已知,要讓計(jì)算機(jī)做事,就得給計(jì)算機(jī)以指令,并且我們已知,計(jì)算機(jī)很“笨”,只好懂得數(shù)字,如前面我們寫進(jìn)機(jī)器的75H,90H,00H等等,所以指令的第一種格式就是機(jī)器碼格式,也說是數(shù)字的形式。但這類形式實(shí)在是犯難我們?nèi)肆耍y記了,于是有另一種格式,助記符格式,如MOVP1,#0FFH,這樣就好記了。這兩種格式之間的關(guān)系呢,我們不難理解,實(shí)質(zhì)上它們完好等價(jià),不過形式不相同而已。2、匯編我們寫指令使用匯編格式,而計(jì)算機(jī)只懂機(jī)器碼格式,所以要將我們寫的匯編格式的指令轉(zhuǎn)換為機(jī)器碼格式,這類變換有兩種方法:手工匯編和機(jī)器匯編。手工匯編實(shí)質(zhì)上就是查表,因?yàn)檫@兩種格式純粹是格式不同,所以是一一對應(yīng)的,查一張表格就行了??墒鞘止げ楸砝鲜窍勇闊跃陀辛擞?jì)算機(jī)軟件,用計(jì)算機(jī)軟件來代替手工查表,這就是機(jī)器匯編。二、尋址讓我們先來復(fù)習(xí)一下我們學(xué)過的一些指令:MOVP1,#0FFH,MOVR7,#0FFH這些指令都是將一些數(shù)據(jù)送到相應(yīng)的地點(diǎn)中去,為何要送數(shù)據(jù)呢?第一個(gè)因?yàn)樗腿氲臄?shù)能夠讓燈全滅掉,第二個(gè)是為了要實(shí)現(xiàn)延時(shí),從這里我們能夠看出來,在用單片機(jī)的編程語言編程時(shí),常常要用到數(shù)據(jù)的傳達(dá),事實(shí)上數(shù)據(jù)傳達(dá)是單片機(jī)編程時(shí)的一項(xiàng)重要工作,一共有28條指令(單片機(jī)共111條指令)。下邊我們就從數(shù)據(jù)傳達(dá)類指令開始吧。剖析一下MOVP1,#0FFH這條指令,我們不難得出結(jié)論,第一個(gè)詞MOV是命令動(dòng)詞,也就是決定做什么事情的,MOV是MOVE少寫了一個(gè)E,所以就是“傳達(dá)”,這就是指令,規(guī)定做什么事情,后邊還有一些參數(shù),剖析一下,數(shù)據(jù)傳達(dá)一定要有一個(gè)“源”也就是你要送什么數(shù),一定要有一個(gè)“目的”,也就是你這個(gè)數(shù)要送到什么地方去,明顯在上邊那條指令中,要送的數(shù)(源)就是0FFH,而要送到的地方(目的地)就是P1這個(gè)寄存器。在數(shù)據(jù)傳達(dá)類指令中,均將目的地寫在指令的后邊,而將源寫在最后。這條指令中,送給P1是這個(gè)數(shù)自己,換言之,做完這條指令后,我們能夠明確地知道,P1中的值是0FFH,但是其實(shí)不是任何時(shí)候都能夠直接給出數(shù)自己的。比如,在我們前面給出的延時(shí)程序例是這樣寫的:表1表2MAIN:SETBP1.0;(1)MAIN:SETBP1.0;(1)LCALLDELAY;MOV30H,#255(2)LCALLDELAY;CLRP1.0;(3)CLRP1.0;(3)LCALLDELAY;(4)MOV30H,#200AJMPMAIN;(5)LCALLDELAY;(4);以下子程序AJMPMAIN;(5)DELAY:MOVR7,#250;(6);以下子程序D1:MOVR6,#250;(7)DELAY:MOVR7,30H;(6)D2:DJNZR6,D2;(8)D1:MOVR6,#250;(7)DJNZR7,D1;(9)D2:DJNZR6,D2;(8)RET;(1DJNZR7,D1;(9)0)RET;(10)END;(11)END;(11)這樣一來,我每次調(diào)用延時(shí)程序延時(shí)的時(shí)間都是相同的(大概都是0.13S),假如我提出這樣的要求:燈亮后延不時(shí)間為0.13S燈滅,燈滅后延時(shí)0.1秒燈亮,這樣循環(huán),這樣的程序還可以知足要求嗎?不可以,怎么辦?我們能夠把延時(shí)程序改成這樣(見表2):調(diào)用則見表2中的主程,也就是先把一個(gè)數(shù)送入30H,在子程序中R7中的值其實(shí)不固定,而是依據(jù)30H單元中傳過來的數(shù)確立。這樣就能夠知足要求。從這里我們能夠得出結(jié)論,在數(shù)據(jù)傳達(dá)中要找到被傳達(dá)的數(shù),好多時(shí)候,這個(gè)數(shù)其實(shí)不可以直接給出,需要變化,這就引出了一個(gè)觀點(diǎn):如何找尋操作數(shù),我們把找尋操作數(shù)所在單元的地點(diǎn)稱之為尋址。在這里我們直接使用數(shù)所在單元的地點(diǎn)找到了操作數(shù),所以稱這類方法為直接尋址。除了這類方法以外,還有一種,假如我們把數(shù)放在工作寄存器中,從工作寄存器中找尋數(shù)據(jù),則稱之為寄存器尋址。例:MOVA,R0就是將R0工作寄存器中的數(shù)據(jù)送到累加器A中去。提一個(gè)問題:我們知道,工作寄存器就是內(nèi)存單元的一部份,假如我們選擇工作寄存器組0,則R0就是RAM的00H單元,那么這樣一來,MOVA,00H,和MOVA,R0不就沒什么差別了嗎?為何要加以劃分呢?的確,這兩條指令履行的結(jié)果是完好相同的,都是將00H單元中的內(nèi)容送到A中去,但是履行的過程不同,履行第一條指令需要2個(gè)周期,而第二條則只需要1個(gè)周期,第一條指令變?yōu)樽詈蟮哪繕?biāo)碼要兩個(gè)字節(jié)(E5H00H),而第二條則只需一個(gè)字節(jié)(E8h)就能夠了。這么錙銖必較!不就差了一個(gè)周期嗎,假如是12M的晶振的話,也就1個(gè)微秒時(shí)間了,一個(gè)字節(jié)又能有多少?不對,假如這條指令只履行一次,或許無所謂,但一條指令假如履行上1000次,就是1毫秒,假如要履行1000000萬次,就是1S的偏差,這就很可觀了,單片機(jī)做的是及時(shí)控制的事,所以一定這樣“錙銖必較”。字節(jié)數(shù)相同這樣。再來提一個(gè)問題,此刻我們已知,找尋操作數(shù)能夠經(jīng)過直接給的方式(立刻尋址)和直接給出數(shù)所在單元地點(diǎn)的方式(直接尋址),這就夠了嗎?看這個(gè)問題,要求從30H單元開始,取20個(gè)數(shù),分別送入A累加器。就我們目前掌握的方法而言,要從30H單元取數(shù),就用MOVA,30H,那么下一個(gè)數(shù)呢?是31H單元的,怎么取呢?仍是只好用MOVA,31H,那么20個(gè)數(shù),不是得20條指令才能寫完嗎?這里只有20個(gè)數(shù),假如要送200個(gè)或2000個(gè)數(shù),那豈不要寫上200條或2000條命令?這不免太笨了吧。為何會(huì)出現(xiàn)這樣的狀況?是因?yàn)槲覀冎粫?huì)把地點(diǎn)寫在指令中,所以就沒方法了,假如我們不是把地點(diǎn)直接寫在指令中,而是把地點(diǎn)放在此外一個(gè)寄存器單元中,依據(jù)這個(gè)寄存器單元中的數(shù)值決定該到哪個(gè)單元中取數(shù)據(jù),比方,目前這個(gè)寄存器中的值是30H,那么就到30H單元中去取,假如是31H就到31H單元中去取,就能夠解決這個(gè)問題了。怎么個(gè)解決法呢?既然是看的寄存器中的值,那么我們就能夠經(jīng)過必定的方法讓這里面的值發(fā)生變化,比方取完一個(gè)數(shù)后,將這個(gè)寄存器單元中的值加1,仍是履行同一條指令,但是取數(shù)的對象卻不相同了,不是嗎。通過例子來說明吧。例子:MOVR7,#20MOVR0,#30HLOOP:MOVA,@R0INCR0DJNZR7,LOOP這個(gè)例子中大部份指令我們是能看懂的,第一句,是將立刻數(shù)20送到R7中,履行完后R7中的值應(yīng)該是20。第二句是將立刻數(shù)30H送入R0工作寄存器中,所以履行完后,R0單元中的值是30H,第三句,這是看一下R0單元中是什么值,把這個(gè)值作為地點(diǎn),取這個(gè)地點(diǎn)單元的內(nèi)容送入A中,此時(shí),履行這條指令的結(jié)果就相當(dāng)于MOVA,30H。第四句,沒學(xué)過,就是把R0中的值加1,所以履行完后,R0中的值就是31H,第五句,學(xué)過,將R7中的值減1,看能否等于0,不等于0,則轉(zhuǎn)到標(biāo)號LOOP處持續(xù)履行,所以,履行完這句后,將轉(zhuǎn)去履行MOVA,@R0這句話,此時(shí)相當(dāng)于履行了MOVA,31H(因?yàn)榇藭r(shí)的R0中的值已經(jīng)是31H了),這樣,直到R7中的值逐次相減等于0,也就是循環(huán)20次為止,就實(shí)現(xiàn)了我們的要求:從30H單元開始將20個(gè)數(shù)據(jù)送入A中。這也是一種找尋數(shù)據(jù)的方法,因?yàn)閿?shù)據(jù)是間接地被找到的,
所以就稱之為間址尋址。注意,
在間址尋址中,只好用R0或R1寄存等找尋的數(shù)據(jù)。二、指令數(shù)據(jù)傳達(dá)類指令1)以累加器為目的操作數(shù)的指令以累加器為目的操作數(shù)的部分指令:MOVA,RnMOVA,directMOVA,@RiMOVA,#data第一條指令中,Rn代表的是R0-R7。第二條指令中,direct就是指的直接地點(diǎn),而第三條指令中,就是我們方才講過的。第四條指令是將立刻數(shù)data送到A中。下邊我們經(jīng)過一些例子加以說明:例子:匯編指令說明MOVA,R1;將工作寄存器R1中的值送入A,R1中的值保持不變。MOVA,30H;將內(nèi)存30H單元中的值送入A,30H單元中的值保持不變。;先看R1中是什么值,把這個(gè)值作為地點(diǎn),并將這個(gè)地點(diǎn)單元中的值送MOVA,@R1入A中。如履行命令前R1中的值為20H,則是將20H單元中的值送入A中。MOVA,#34H;將立刻數(shù)34H送入A中,履行完本條指令后,A中的值是34H。2)以寄存器Rn為目的操作的指令以寄存器Rn為目的操作的指令:匯編指令說明MOVRn,A;將A中的值送入工作寄存器Rn,Rn中的值保持不變。MOVRn,direct
;將內(nèi)存單元
direct
中的值送入
A,內(nèi)存單元
direct
中的值保持不變。MOVRn,#data
;將立刻數(shù)
data送入工作寄存器
Rn。這組指令功能是把源地點(diǎn)單元中的內(nèi)容送入工作寄存器,源操作數(shù)不變。單片機(jī)指令(二)數(shù)據(jù)傳達(dá)類指令3)以直接地點(diǎn)為目的操作數(shù)的指令匯編指令
例子
說明MOVdirect,A
MOV20H,AMOVdirect,Rn
MOV20H,R1MOVdirect1,direct2
MOV20H,30HMOVdirect,@Ri
MOV20H,@R1MOVdirect,#data
MOV20H,#34H(4)以間接地點(diǎn)為目的操作數(shù)的指令匯編指令
例子
說明MOV@Ri,A
MOV@R0,AMOV@Ri,direct
MOV@R1,20HMOV@Ri,#data
MOV@R0,#34H(5)十六位數(shù)的傳達(dá)指令匯編指令例子說明MOVDPTR,#data16MOVDPTR,#1324H8051是一種8位機(jī),這是獨(dú)一的一條16位立刻數(shù)傳達(dá)指令,其功能是將一個(gè)16位的立刻數(shù)送入DPTR中去。此中高8位送入DPH,低8位送入DPL。例:MOVDPTR,#1234H,則履行完了以后DPH中的值為12H,DPL中的值為34H。反之,假如我們分別向DPH,DPL送數(shù),則結(jié)果也一樣。若有下邊兩條指令:MOVDPH,#35H,MOVDPL,#12H。則就相當(dāng)于履行了MOVDPTR,#3512H。綜合練習(xí):給出每條指令履行后的結(jié)果匯編指令履行后的結(jié)果正確答案MOV23H,#30H(23h)=?(23h)=30hMOV12H,#34H(12h)=?(12h)=34hMOVR0,#23H(R0)=?(R0)=23HMOVR7,#22H(R7)=?(R7)=22HMOVR1,12H(R1)=?(R1)=34HMOVA,@R0(A)=?(A)=30HMOV34H,@R1(34H)=?(34H)=34HMOV45H,34H(45H)=?(45H)=34HMOVDPTR,#6712H(DPTR)=?(DPTR)=6712HMOV12H,DPH(12H)=?(12H)=67HMOVR0,DPL(R0)=?(R0)=12HMOVA,@R0(A)=?(A)=67H說明:上表中各條指令次序履行;用括號括起來代表內(nèi)容,如(23H)則代表內(nèi)部RAM23H單元中的值,(A)則代表累加器A單元中的值。上機(jī)練習(xí):進(jìn)入DOS狀態(tài),進(jìn)入WAVE所在的目錄,例D:\WAVE鍵入MCS51,出現(xiàn)以下畫面圖13.按File->Open,出現(xiàn)對話框后,在Name處輸入一個(gè)文件名(見圖2),假如是下邊列表中已存在的,則翻開這個(gè)文件,假如不存在這個(gè)文件,則新建一個(gè)文件(見圖3)圖2圖34.在空白處將上邊的程序輸入。
見圖
4。用ALT+A匯編經(jīng)過。用F8即可單步履行,在履行過程中注意察看屏幕左側(cè)的工作寄存器及
A累加器中的值的變化。圖45.內(nèi)存中值的變化在此是看不到的,能夠用以下方法察看(看圖5):將鼠標(biāo)移到DATA,雙擊,則光標(biāo)進(jìn)入此行,此時(shí)能夠鍵盤上的上下光標(biāo)鍵上下翻動(dòng)來察看內(nèi)存值的變化。本行的最前面DATA后邊的數(shù)據(jù)代表的是“一段”的開始地點(diǎn),如此刻為20H,再看屏幕的最上方,數(shù)字從0到F,顯示二者相加就等于真切的地點(diǎn)值,如此刻圖上所示的內(nèi)存20H、21H、22H、23H中的值分別是FBH、0EH、E8H、30H。圖5當(dāng)運(yùn)轉(zhuǎn)完程序后,即進(jìn)入它的反匯編區(qū),不是我們想要的東西。為了再從頭開始,能夠用CTRL+F2功能鍵復(fù)位PC值。注意此時(shí)不會(huì)看到本來的窗口,為看到本來的窗口,請用ALT+4或ALT+5等來切換。自然以上操作也能夠菜單進(jìn)行。CTRL+F2是程序復(fù)位,用RUN菜單。窗口用WINDOWS菜單。此次大家就用用熟這個(gè)軟件吧,說真話,我其實(shí)不很喜愛它,操作起來不方便,但給我的機(jī)器只好上這個(gè),沒方法,下次再給網(wǎng)友獨(dú)自介紹一個(gè)好一點(diǎn)的吧。本頁圖片許多,假如大家無法忍耐它的等候,請下載單片機(jī)指令(三)2、累加器A與片外RAM之間的數(shù)據(jù)傳達(dá)類指令匯編指令書寫格式例子說明MOVXA,@RiMOVX@Ri,AMOVXA,@DPTRMOVX@DPTR,A說明:1.1)在51中,與外面儲(chǔ)存器RAM打交道的只好夠是A累加器。所有需要送入外面RAM的數(shù)據(jù)必要要經(jīng)過A送去,而所有要讀入的外面RAM中的數(shù)據(jù)也必要經(jīng)過A讀入。在此我們能夠看出內(nèi)外面RAM的差別了,內(nèi)部RAM間能夠直接進(jìn)行數(shù)據(jù)的傳達(dá),而外面則不可以,比方,要將外面RAM中某一單元(設(shè)為0100H單元的數(shù)據(jù))送入另一個(gè)單元(設(shè)為0200H單元),也一定先將0100H單元中的內(nèi)容讀入A,而后再送到0200H單元中去。2.要讀或?qū)懲饷娴腞AM,自然也一定要知道RAM的地點(diǎn),在后兩條指令中,地點(diǎn)是被直接放在DPTR中的。而前兩條指令,因?yàn)镽i(即R0或R1)不過一個(gè)8位的寄存器,所以只供給低8位地點(diǎn)。因?yàn)橛袝r(shí)擴(kuò)展的外面RAM的數(shù)目比較少,少于或等于256個(gè),就只需要供給8位地點(diǎn)就夠了。3.使用時(shí)應(yīng)該第一將要讀或?qū)懙牡攸c(diǎn)送入DPTR或Ri中,而后再用讀寫命令。例:將外面RAM中100H單元中的內(nèi)容送入外面RAM中200H單元中。匯編指令說明MOVDPTR,#0100HMOVXA,@DPTRMOVDPTR,#0200HMOVX@DPTR,A3、程序儲(chǔ)存器向累加器A傳遞指令匯編指令書寫格式例子說明MOVCA,@DPTR本指令是將ROM中的數(shù)送入A中。本指令也被稱為查表指令,常用此指令來查一個(gè)已做幸虧ROM中的表格說明:1.此條指令引出一個(gè)新的尋址方法:變址尋址。本指令是要在ROM的一個(gè)地點(diǎn)單元中找出數(shù)據(jù),明顯一定知道這個(gè)單元的地點(diǎn),這個(gè)單元的地點(diǎn)是這樣確立的:在履行本指令立腳點(diǎn)DPTR中有一個(gè)數(shù),A中有一個(gè)數(shù),履行指令時(shí),將A和DPTR中的數(shù)加起為,就成為要查找的單元的地點(diǎn)。2.查找到的結(jié)果被放在A中,所以,本條指令履行前后,A中的值不必定相同。例:有一個(gè)數(shù)在R0中,要求用查表的方法確立它的平方值(此數(shù)的取值范圍是0-5)匯編指令說明MOVDPTR,#TABLEMOVA,R0MOVCA,@A+DPTR..TABLE:DB0,1,4,9,16,25設(shè)R0中的值為2,送入A中,而DPTR中的值則為TABLE,則最后確立的ROM單元的地點(diǎn)就是TABLE+2,也就是到這個(gè)單元中去取數(shù),取到的是4,明顯它正是2的平方。其余數(shù)據(jù)也能夠類推。標(biāo)號的真切含義:從這個(gè)地方也能夠看到另一個(gè)問題,我們使用了標(biāo)號來代替詳細(xì)的單元地址。事實(shí)上,標(biāo)號的真切含義就是地點(diǎn)數(shù)值。在這里它代表了,0,1,4,9,16,25這幾個(gè)數(shù)據(jù)在ROM中寄存的起點(diǎn)地點(diǎn)。而在從前我們學(xué)過的如LCALLDELAY指令中,DELAY則代表了以DELAY為標(biāo)號的那段程序在ROM中寄存的開端地點(diǎn)。事實(shí)上,CPU正是經(jīng)過這個(gè)地點(diǎn)才找到這段程序的。能夠經(jīng)過以下的例子再來看一看標(biāo)號的含義:匯編指令說明MOVDPTR,#100HMOVA,R0MOVCA,@A+DPTR...ORG0100HDB0,1,4,9,16,25...假如R0中的值為
2,則最后地點(diǎn)為
100H+2為
102H,到
102H單元中找到的是
4。這個(gè)能夠看懂了吧?那為何不這樣寫程序,要用標(biāo)號呢?不是增添迷惑嗎?假如這樣寫程序的話,在寫程序時(shí),我們就一定確立這張表格在ROM中的詳細(xì)的地點(diǎn),假如寫完程序后,又想在這段程序前插入一段程序,那么這張表格的地點(diǎn)就又要變了,要改ORG100H這句話了,我們是常常需要改正程序的,那多麻煩,所以就用標(biāo)號來代替,只需一編譯程序,位置就自動(dòng)發(fā)生變化,我們把這個(gè)麻煩事交給計(jì)算機(jī)指PC機(jī)去做了。4、貨倉操作匯編指令說明PUSHdirectPOPdirect第一條指令稱之為推入,就是將direct中的內(nèi)容送入貨倉中,第二條指令稱之為彈出,就是將貨倉中的內(nèi)容送回到
direct
中。推入指令的履行過程是,
第一將
SP中的值加
1,而后把
SP中的值看作地點(diǎn),將
direct
中的值送進(jìn)以
SP中的值為地點(diǎn)的
RAM單元中。例:匯編指令說明MOVSP,#5FHMOVA,#100MOVB,#20PUSHACCPUSHB則履行第一條PUSHACC指令是這樣的:將到60H單元中,所以履行完本條指令后,內(nèi)存是將SP+1,即變?yōu)?1H,而后將B中的值送入到
SP中的值加1,即變?yōu)?0H,而后將60H單元的值就是100,相同,履行61H單元中,即履行完本條指令后,
A中的值送PUSHB時(shí),61H單元中的值變?yōu)?/p>
20。POP指令的履行是這樣的,第一將
SP中的值作為地點(diǎn),并將此地點(diǎn)中的數(shù)送到
POP指令后面的那個(gè)
direct
中,而后
SP減1。接上例:匯編指令說明POPBPOPACC則履行過程是:將SP中的值(此刻是61H)作為地點(diǎn),取61H單元中的數(shù)值(此刻是20),送到B中,所以履行完本條指令后B中的值是20,而后將SP減1,所以本條指令履行完后,SP的值變?yōu)?0H,而后履行POPACC,將SP中的值(60H)作為地點(diǎn),從該地點(diǎn)中取數(shù)(此刻是100),并送到ACC中,所以履行完本條指令后,ACC中的值是100。這有什么意義呢?ACC中的值本來就是100,B中的值本來就是20,是的,在本例中,的確沒存心義,但在實(shí)質(zhì)工作中,則在PUSHB后常常要履行其余指令,并且這些指令會(huì)把A中的值,B中的值改掉,所以在程序的結(jié)束,假如我們要把A和B中的值恢還原值,那么這些指令就存心義了。還有一個(gè)問題,假如我不用貨倉,比方說在PUSHACC指令處用MOV60H,A,在PUSHB處用指令MOV61H,B,而后用MOVA,60H,MOVB,61H來代替兩條POP指令,不是也相同嗎?是的,從結(jié)果上看是相同的,但是從過程看是不相同的,PUSH和POP指令都是單字節(jié),單周期指令,而MOV指令則是雙字節(jié),雙周期指令。更況且,貨倉的作用不只于此,所以一般的計(jì)算機(jī)上都設(shè)有貨倉,而我們在編寫子程序,需要保留數(shù)據(jù)時(shí),往常也不采納后邊的方法,而是用貨倉的方法來實(shí)現(xiàn)。例:寫出以下程序的運(yùn)轉(zhuǎn)結(jié)果匯編指令說明MOV30H,#12(30H)<=12MOV31H,#23(30H)<=23PUSH30H將30H單元的內(nèi)容(即12)壓入貨倉PUSH31H將31H單元的內(nèi)容(即23)壓入貨倉POP30H將貨倉頂?shù)膬?nèi)容(即23)彈出到30H單元內(nèi)POP31H將貨倉頂?shù)膬?nèi)容(即12)彈出到31H單元內(nèi)結(jié)果是30H中的值變?yōu)?3,而31H中的值則變?yōu)?2。也就二者進(jìn)行了數(shù)據(jù)互換。從這個(gè)例子能夠看出:使用貨倉時(shí),入棧的書寫次序和出棧的書寫次序一定相反,才能保證數(shù)據(jù)被送回原位,不然就要犯錯(cuò)了。作業(yè):在MCS51下履行上邊的例程,注意察看內(nèi)存窗口和貨倉的變化。單片機(jī)指令(四)算術(shù)運(yùn)算類指令不帶進(jìn)位位的加法指令A(yù)DDA,#DATA例:ADDA,#10HADDA,direct例:ADDA,10HADDA,Rn例:ADDA,R7ADDA,@Ri例:ADDA,@R02.用途:將A中的值與后來面的值相加,最后結(jié)果否是回到A中。例:MOVA,#30HADDA,#10H則履行完本條指令后,A中的值為40H。下邊的題目自行練習(xí)MOV34H,#10HMOVR0,#13HMOVA,34HADDA,R0MOVR1,#34HADDA,@R17.帶進(jìn)位位的加法指令A(yù)DDCA,RnADDCA,directADDCA,@RiADDCA,#data用途:將A中的值和后來面的值相加,并且加長進(jìn)位位C中的值。說明:因?yàn)?1單片機(jī)是一種8位機(jī),所以只好做8位的數(shù)學(xué)運(yùn)算,但8位運(yùn)算的范圍只有0-255,這在實(shí)質(zhì)工作中是不夠的,所以就要進(jìn)行擴(kuò)展,一般是將2個(gè)8位的數(shù)學(xué)運(yùn)算合起來,成為一個(gè)16位的運(yùn)算,這樣,能夠表達(dá)的數(shù)的范圍就能夠達(dá)到0-65535。如何歸并呢?其實(shí)很簡單,讓我們看一個(gè)10進(jìn)制數(shù)的例子:66+78。這兩個(gè)數(shù)相加,我們根本不在乎這的過程,但事實(shí)上我們是這樣做的:先做6+8(低位),而后再做6+7,這是高位。做了兩次加法,不過我們做的時(shí)候并無故意分紅兩次加法來做罷了,或許說我們并沒存心識(shí)到我們做了兩次加法。之所以要分紅兩次來做,是因?yàn)檫@兩個(gè)數(shù)超出了一位數(shù)所能表達(dá)的范置(0-9)。在做低位時(shí)產(chǎn)生了進(jìn)位,我們做的時(shí)候是在適合的地點(diǎn)點(diǎn)一下,而后在做高位加法是將這一點(diǎn)加進(jìn)去。那么計(jì)算機(jī)中做16位加法時(shí)相同這樣,先做低8位的,假如兩數(shù)相加產(chǎn)生了進(jìn)位,也要“點(diǎn)一下”做個(gè)標(biāo)記,這個(gè)標(biāo)記就是進(jìn)位位C,在PSW中。在進(jìn)行高位加法是將這個(gè)C加進(jìn)去。例:1067H+10A0H,先做67H+A0H=107H,而107H明顯超出了0FFH,所以最后保留在A中的是7,而1則到了PSW中的CY位了,換言之,CY就相當(dāng)于是100H。而后再做10H+10H+CY,結(jié)果是21H,所以最后的結(jié)果是2107H。帶借位的減法指令SUBBA,RnSUBBA,directSUBBA,@RiSUBBA,#data設(shè)(每個(gè)H,(R2)=55H,CY=1,履行指令SUBBA,R2以后,A中的值為73H。說明:沒有不帶借位的減法指令,假如需要做不帶位的減法指令(在做第一次相減時(shí)),只需將CY清零即可。12.乘法指令MULAB此指令的功能是將A和B中的兩個(gè)8位無符號數(shù)相乘,兩數(shù)相乘結(jié)果一般比較大,所以最后結(jié)果用1個(gè)16位數(shù)來表達(dá),此中高8位放在B中,低8位放在A中。在乘積大于FFFFFH(65535)時(shí),0V置1(溢出),不然OV為0,而CY老是0。例:(A)=4EH,(B)=5DH,履行指令MULAB后,乘積是1C56H,所以在B中放的是1CH,而A中放的則是56H。17.除法指令DIVAB19.此指令的功能是將A中的8位無符號數(shù)除了B中的8位無符號數(shù)(A/B)。除法一般會(huì)出現(xiàn)小數(shù),但計(jì)算機(jī)中可無法直接表達(dá)小數(shù),它用的是我們小學(xué)生還沒接觸到小數(shù)時(shí)用的商和余數(shù)的觀點(diǎn),如13/5,其商是2,余數(shù)是3。除了此后,商放在A中,余數(shù)放在B中。CY和OV都是0。假如在做除法前B中的值是00H,也就是除數(shù)為0,那么0V=1。20.加1指令I(lǐng)NCAINCRnINCdirectINC@RiINCDPTR用途很簡單,就是將后邊目標(biāo)中的值加1。例:(A)=12H,(R0)=33H,(21H)=32H,34H)=22H,DPTR=1234H。履行下邊的指令:INCA(A)=13HINCR2(R0)=34HINC21H(21H)=33HINC@R0(34H)=23HINCDPTR(DPTR)=1235H23.后結(jié)果如上所示。24.說明:從結(jié)果上看INCA和ADDA,#1差不多,但I(xiàn)NCA是單字節(jié),單周期指令,而ADD#1則是雙字節(jié),雙周期指令,并且INCA不會(huì)影響PSW位,如(A)=0FFH,INCA后(A)=00H,而CY依舊保持不變。假如是ADDA,#1,則(A)=00H,而CY必定是1。所以加1指令其實(shí)不適合做加法,事實(shí)上它主假如用來做計(jì)數(shù)、地點(diǎn)增添等用途。此外,加法類指令都是以A為核心的此中一個(gè)數(shù)一定放在A中,而運(yùn)算結(jié)果也一定放在A中,而加1類指令的對象則寬泛得多,能夠是寄存器、內(nèi)存地點(diǎn)、間址尋址的地點(diǎn)等等。減1指令DECADECRNDECdirectDEC@Ri與加1指令近似,就不多說了。綜合練習(xí):MOVA,#12HMOVR0,#24HMOV21H,#56HADDA,#12HMOVDPTR,#4316HADDA,DPHADDA,R0CLRCSUBBA,DPLSUBBA,#25HINCASETBCADDCA,21HINCR0SUBBA,R0MOV24H,#16HCLRCADDA,@R0先寫出每步運(yùn)轉(zhuǎn)結(jié)果,而后將以上題目建入,并在軟件仿真中運(yùn)轉(zhuǎn),察看寄存器及相關(guān)單元的內(nèi)容的變化,能否與自已的預(yù)料結(jié)果相同。三、邏輯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 聯(lián)合國國際合同使用電子通信公約
- 貨物運(yùn)輸保險(xiǎn)合同書
- 舞蹈教師全職崗位聘用合同
- 泉州工程職業(yè)技術(shù)學(xué)院《工程美學(xué)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古美術(shù)職業(yè)學(xué)院《數(shù)據(jù)挖掘分析課程設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安電力高等??茖W(xué)?!断冗M(jìn)加工理論》2023-2024學(xué)年第二學(xué)期期末試卷
- 福州職業(yè)技術(shù)學(xué)院《移動(dòng)媒體營銷》2023-2024學(xué)年第二學(xué)期期末試卷
- 7《靜夜思》(教學(xué)設(shè)計(jì))-2023-2024學(xué)年統(tǒng)編版語文一年級下冊
- 青島濱海學(xué)院《地圖學(xué)與遙感》2023-2024學(xué)年第二學(xué)期期末試卷
- 紹興文理學(xué)院《微處理器原理》2023-2024學(xué)年第二學(xué)期期末試卷
- 江蘇省南通市海安中學(xué)2025屆高一下生物期末綜合測試試題含解析
- 2024年漯河食品職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫附答案
- 廣東省深圳市2023年中考英語試題(含答案與解析)
- 《看看我們的地球》
- 吉林省地方教材家鄉(xiāng)小學(xué)一年級下冊家鄉(xiāng)教案
- 蘇教版數(shù)學(xué)五年級(下冊)第1課時(shí) 單式折線統(tǒng)計(jì)圖
- 實(shí)驗(yàn)經(jīng)濟(jì)學(xué)實(shí)驗(yàn)設(shè)計(jì)案例
- 東軟入職合同
- 護(hù)理責(zé)任組長競聘
- 衛(wèi)生監(jiān)督村醫(yī)培訓(xùn)課件
- 2024年新青島版(六三制)四年級下冊科學(xué)全冊精編復(fù)習(xí)資料
評論
0/150
提交評論