




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、新8051教程目錄新8051教程1前言1單片機課程體系改革總體規(guī)劃3教學內容:單片機概述6單片機的內部、外部結構(一)8單片機的內外部結構分析(二)11單片機的內外部結構分析(三)13單片機的內外部結構分析(四)15單片機內部結構分析(五)18尋址方式與指令系統(tǒng)22單片機指令(二)28單片機指令(三)33單片機指令(四)算術運算類指令37三、邏輯運算類指令:42四、控制轉移類指令50條件轉移指令:54位及位操作指令58計數(shù)器與定時器65中斷系統(tǒng)70串行接口89常用接口電路及其編程99動態(tài)掃描顯示接口107鍵盤接口與編程117前言傳統(tǒng)的單片機教學,均是以單片機的結構為主線,先講單片機的硬件結構,
2、然后是指令,然后是軟件編程,然后是單片機系統(tǒng)的擴展和各種外圍器件的應用,最后再講一些實例。按照此種教學結構,按照這種結構,學生普遍感到難學。試想,一個從未接觸過計算機結構的人,甚至數(shù)字電路也是剛剛接觸的人,要他去理解單片機內部結構,這實在不是個容易的事,至于很多書一開始就提出的總線、地址等概念,更是初學者難以理解的不管用什么巧妙的比方都不容易理解。于是糊里糊涂地學完了第一部份,第二部份一開始就是尋址方式,更抽象,好多人直到學完單片機還不能理解尋址方式究竟是什么意思,為什么需要這么多尋址方式,剛開始學當然更不懂了。然后是指令,111條指令,又不分個重點,反正全是要記住的,等到指令全部學完,大部份
3、人已對單片機望爾生畏,開始打退堂鼓了。第三部份是編程,如果說前面的東西不能理解,還能靠記憶來獲得知識的話,這部份就純是理解和掌握了,如果以前沒學過編程,短時間內很難掌握編程的有關知識,更不必說編程技巧了。可是教材上明明規(guī)定,要編出這樣、那樣的程序,學的人編不出來,當然只會認為,教材的要求當然是合理的,應該做到的,我做不到就是我沒學好,于是很多人長嘆一聲:單片機太難學了!放棄吧??墒堑竭@里還根本不知道一個單片機開發(fā)的完整過程是什么,什么是編程器還不知道。后面的就不說了,總之,現(xiàn)在教材,基本都是以單片機為藍本來學習計算機原理,而不純?yōu)閷W習單片機技術,在教材、教學過程的安排上又沒有考慮人的接受能力,
4、使得學習的過程是一個充滿不斷挫折的過程,于是很多人認為單片機入門難。基于以上情況,作者嘗試編制一套全新的教學方法,以任務為教學單元,打破原有界限,不管硬件結構、指令、編程的先后順序,將各部份知識分解成一個個知識點,為了完成一個任務抽取每個部份的不同知識點,加以組合,完成第一個任務就能清楚單片機的開發(fā)過程,完成第二、三個任務,就能自已模仿性地編出自已的程序,使得學習過程是一個不斷成功地完成任務的過程。當所有任務全部完成,知識點就全學完了。即便只完成部份任務,也可以去做一些程序了事實并沒有必要學完全部知識才可以去做開發(fā)的,作者在編第一個商用程序時,還不懂定時器怎么用,編第二個商用程序,寫了長達2k
5、行的代碼,可當時我還不懂怎么樣用中斷編程,因為當時我根本還不需要用中斷。以上的教學方法具有如下特點:1、以人的認知規(guī)律為主線,而不是以課程結構為主線。 2、以任務為單元構建認知單元,而不是以單片機功能為單元構建。 3、完成第一個任務即可進行單片機的初步應用嘗試,不必學完單片機的全部知識體系。 隨著任務的逐漸進行,知識逐漸完善,能力逐漸提高,所有任務完成時,已具有初步開發(fā)能力。 以上的教學目標是一個很宏偉的計劃,我不知道我最終會不會完成他,因為完成他也許需要二年、三年甚至更長的時間,當然,對于這個計劃能否完成,是否合理,我是充滿信心的。要完成以上計劃,關鍵在于要做好以下一些工作:知識點的合理分解
6、,合理組合,任務的合理設計等等。我將盡力去做好他,當然,我也希望諸位大蝦能不吝賜教,和我共同完成這個任務,這也算為單片機入門者鋪平道路吧。 單片機課程體系改革總體規(guī)劃第一部份:入門一、 單片機的基礎知識1、 微型計算機與單片機1) 微型計算機的構成2) 單片機的由來3) 人與計算機的關系2、 數(shù)制1)十、二、十六進制概念2)以上數(shù)制互換3)常用單位(k、m)3、幾個基本概念 1) 位的含義2) 字節(jié)的含義3) 字的含義4) 總線概念初步二、 任務一(單燈閃爍) 1、 單片機引腳功能 1) 電源引腳和ea引腳。2) rst引腳及reset電路3) 晶振引腳及晶振電路2、 指令初步知識1)setb
7、 、clr、lcall、ljmp 指令2)標號的應用3)指令的助記符形式與目標代碼形式 3、 編程器的使用 4、 存儲器組織 三、 任務二(鍵控燈亮) 1、 指令的繼續(xù)學習2、 輸入、輸出的含義3、 并行口的結構1) p1、p2、p3口的結構2) p0口的結構四、 任務三(彩燈)1、 指令的繼續(xù)學習2、 片內ram組織3、 工作寄存器組織第二部份:鞏固提高一、 指令的全面認識1、 尋址方式2、 所有指令3、 編程1) 實例講解2) 軟件仿真器3) 軟件仿真器調試二、 任務四(定時器)1、 定時器結構2、 定時器工作方式3、 定時器編程三、 任務五(中斷)1、 中斷結構2、 中斷編程1) 按鍵中
8、斷2) 定時中斷四、 任務六(串口應用)1、 串口結構2、 串口編程1) 同步擴展(74ls164)2) 異步通訊第三部份:提高一、 任務七(外部rom、ram擴展)二、 任務八(并行口擴展)三、 綜合應用(一)1、 led顯示器編程1)2)定時器法2、 鍵盤編程四、 綜合應用(二)1、 時鐘應用2、 以上是初步的規(guī)劃,當然還只是設想,是否合理尚需實踐檢驗。成功的若干關鍵:能否合理分解各部份知識點,能否將它們恰當?shù)亟M合在一個任務中,能否不斷保持學習的興趣,能否找到大量的、確切、形象的比喻,能否編制出內容、難度恰當?shù)牧曨}難點應當在編程訓練上,要將一個從未有任何編程經驗的人訓練成能熟練地編程,決非
9、易事,當然這有點超過我們的范圍了程序概念和常用算法應當是在basic學習時解決的,但事實上很多人在學單片機時,早就忘光了basic的,所以任務很艱巨,說實話,這是我最沒信心的部份。單片機教學 第一課教學內容:單片機概述1、何謂單片機 一臺能夠工作的計算機要有這樣幾個部份構成:cpu(進行運算、控制)、ram(數(shù)據(jù)存儲)、rom(程序存儲)、輸入/輸出設備(例如:串行口、并行輸出口等)。在個人計算機上這些部份被分成若干塊芯片,安裝一個稱之為主板的印刷線路板上。而在單片機中,這些部份,全部被做到一塊集成電路芯片中了,所以就稱為單片(單芯片)機,而且有一些單片機中除了上述部份外,還集成了其它部份如a
10、/d,d/a等。 天!pc中的cpu一塊就要賣幾千塊錢,這么多東西做在一起,還不得買個天價!再說這塊芯片也得非常大了。 不,價格并不高,從幾元人民幣到幾十元人民幣,體積也不大,一般用40腳封裝,當然功能多一些單片機也有引腳比較多的,如68引腳,功能少的只有10多個或20多個引腳,有的甚至只8只引腳。為什么會這樣呢? 功能有強弱,打個比方,市場上面有的組合音響一套才賣幾百塊錢,可是有的一臺功放機就要賣好幾千。另外這種芯片的生產量很大,技術也很成熟,51系列的單片機已經做了十幾年,所以價格就低了。 既然如此,單片機的功能肯定不強,干嗎要學它呢? 話不能這樣說,實際工作中并不是任何需要計算機的場合都
11、要求計算機有很高的性能,一個控制電冰箱溫度的計算機難道要用piii?應用的關鍵是看是否夠用,是否有很好的性能價格比。所以8051出來十多年,依然沒有被淘汰,還在不斷的發(fā)展中。 2、mcs51單片機和8051、8031、89c51等的關系我們平常老是講8051,又有什么8031,現(xiàn)在又有89c51,它們之間究竟是什么關系? mcs51是指由美國intel公司(對了,就是大名鼎鼎的intel)生產的一系列單片機的總稱,這一系列單片機包括了好些品種,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的產品,該系列其它單片機都是在8051的基礎上進行功能的增、減、
12、改變而來的,所以人們習慣于用8051來稱呼mcs51系列單片機,而8031是前些年在我國最流行的單片機,所以很多場合會看到8031的名稱。intel公司將mcs51的核心技術授權給了很多其它公司,所以有很多公司在做以8051為核心的單片機,當然,功能或多或少有些改變,以滿足不同的需求,其中89c51就是這幾年在我國非常流行的單片機,它是由美國atmel公司開發(fā)生產的。以后我們將用89c51來完成一系列的實驗。 單片機教學(2)單片機的內部、外部結構(一)一、單片機的外部結構 拿到一塊芯片,想要使用它,首先必須要知道怎樣連線,我們用的一塊稱之為89c51的芯片,下面我們就看一下如何給它連線。 1
13、、 電源:這當然是必不可少的了。單片機使用的是5v電源,其中正極接40引腳,負極(地)接20引腳。 2、 振蒎電路:單片機是一種時序電路,必須提供脈沖信號才能正常工作,在單片機內部已集成了振蕩器,使用晶體振蕩器,接18、19腳。只要買來晶振,電容,連上就可以了,按圖1接上即可。 3、 復位引腳:按圖1中畫法連好,至于復位是何含義及為何需要復要復位,在單片機功能中介紹。 4、 ea引腳:ea引腳接到正電源端。 至此,一個單片機就接好,通上電,單片機就開始工作了。 圖1二、 任務分析我們的第一個任務是要用單片機點亮一只發(fā)光二極管led,顯然,這個led必須要和單片機的某個引腳相連,否則單片機就沒法
14、控制它了,那么和哪個引腳相連呢?單片機上除了剛才用掉的5個引腳,還有35個,我們將這個led和1腳相連。(見圖1,其中r1是限流電阻)按照這個圖的接法,當1腳是高電平時,led不亮,只有1腳是低電平時,led才發(fā)亮。因此要1腳我們要能夠控制,也就是說,我們要能夠讓1引腳按要求變?yōu)楦呋虻碗娖健<慈晃覀円刂?腳,就得給它起個名字,總不能就叫它一腳吧?叫它什么名字呢?設計51芯片的intel公司已經起好了,就叫它p1.0,這是規(guī)定,不可以由我們來更改。 名字有了,我們又怎樣讓它變高或變低呢?叫人做事,說一聲就可以,這叫發(fā)布命令,要計算機做事,也得要向計算機發(fā)命令,計算機能聽得懂的命令稱之為計算機的
15、指令。讓一個引腳輸出高電平的指令是setb,讓一個引腳輸出低電平的指令是clr。因此,我們要p1.0輸出高電平,只要寫setb p1.0,要p1.0輸出低電平,只要寫 clr p1.0就可以了。現(xiàn)在我們已經有辦法讓計算機去將p10輸出高或低電平了,但是我們怎樣才能計算機執(zhí)行這條指令呢?總不能也對計算機也說一聲了事吧。要解決這個問題,還得有幾步要走。第一,計算機看不懂setb clr之類的指令,我們得把指令翻譯成計算機能懂的方式,再讓計算機去讀。計算機能懂什么呢?它只懂一樣東西數(shù)字。因此我們得把setb p1.0變?yōu)椋╠2h,90h ),把clr p1.0變?yōu)?(c2h,90h ),至于為什么是
16、這兩個數(shù)字,這也是由51芯片的設計者-intel規(guī)定的,我們不去研究。第二步,在得到這兩個數(shù)字后,怎樣讓這兩個數(shù)字進入單片機的內部呢?這要借助于一個硬件工具編程器。我們將編程器與電腦連好,運行編程器的軟件,然后在編緝區(qū)內寫入(d2h,90h)見圖2,寫入好,拿下片子,把片子插入做好的電路板,接通電源什么?燈不亮?這就對了,因為我們寫進去的指令就是讓圖2p10輸出高電平,燈當然不亮,要是亮就錯了?,F(xiàn)在我們再撥下這塊芯片,重新放回到編程器上,將編緝區(qū)的內容改為(c2h,90h),也就是clr p1.0,寫片,拿下片子,把片子插進電路板,接電,好,燈亮了。因為我們寫入的()就是讓p10輸出低電平的指
17、令。這樣我們看到,硬件電路的連線沒有做任何改變,只要改變寫入單片機中的內容,就可以改變電路的輸出效果。 三、單片機內部結構分析 我們來思考一個問題,當我們在編程器中把一條指令寫進單片要內部,然后取下單片機,單片機就可以執(zhí)行這條指令,那么這條指令一定保存在單片機的某個地方,并且這個地方在單片機掉電后依然可以保持這條指令不會丟失,這是個什么地方呢?這個地方就是單片機內部的只讀存儲器即rom(read only memory)。為什么稱它為只讀存儲器呢?剛才我們不是明明把兩個數(shù)字寫進去了嗎?原來在89c51中的rom是一種電可擦除的rom,稱為flash rom,剛才我們是用的編程器,在特殊的條件下
18、由外部設備對rom進行寫的操作,在單片機正常工作條件下,只能從那面讀,不能把數(shù)據(jù)寫進去,所以我們還是把它稱為rom。 單片機教學(3)單片機的內外部結構分析(二)一、 程序的完善 上一次我們的程序實在是沒什么用,要燈亮還要重寫一下片子,下面我們要讓燈不斷地閃爍,這就有一定的實用價值了,比如可以把它當成汽車上的一個信號燈用了。怎樣才能讓燈不斷地閃爍呢?實際上就是要燈亮一段時間,再滅一段時間,也就是說要p10不斷地輸出高和低電平。怎樣實現(xiàn)這個要求呢?請考慮用下面的指令是否可行: setb p10 clr p10 這是不行的,有兩個問題,第一,計算機執(zhí)行指令的時間很快,執(zhí)行完setb p10后,燈是
19、滅了,但在極短時間(微秒級)后,計算機又執(zhí)行了clr p10指令,燈又亮了,所以根本分辨不出燈曾滅過。第二,在執(zhí)行完clr p10后,不會再去執(zhí)行setb p10指令,所以以后再也沒有機會讓滅了。 為了解決這兩個問題,我們可以做如下設想,第一,在執(zhí)行完setb p10后,延時一段時間(幾秒或零點幾秒)再執(zhí)行第二條指令,就可以分辨出燈曾滅過了。第二在執(zhí)行完第二條指令后,讓計算機再去執(zhí)行第一條指令,不斷地在原地兜圈,我們稱之為循環(huán),這樣就可以完成任務了。 以下先給出程序(后面括號中的數(shù)字是為了便于講解而寫的,實際不用輸入): ;主程序:loop: setb p10 ;()lcall delay ;
20、()clr p10 ;()lcall delay ;()ajmp loop ;();以下子程序delay: mov r7,#250;()d1: mov r6,#250 ;()d2: djnz r6,d2 ;()djnz r7,d1 ;()ret ;()end ;()按上面的設想分析一下前面的五條指令。第一條是讓燈滅,第二條應當是延時,第三條是讓燈亮,第四條和第二條一模一樣,也是延時,第五條應當是轉去執(zhí)行第一條指令。第二和第四條實現(xiàn)的原理稍后談,先看第五條,ljmp是一條指令,意思是轉移,往什么地方轉移呢?后面跟的是loop,看一下,什么地方還有l(wèi)oop,對了,在第一條指令的前面有一個loop,
21、所以很直觀地,我們可以認識到,它要轉到第一條指令處。這個第一條指令前面的loop被稱之為標號,它的用途就是給這一行起一個名字,便于使用。是否一定要給它起名叫l(wèi)oop呢?當然不是,起什么名字,完全由編程序的人決定,可以稱它為a,x等等,當然,這時,第五條指令ljmp后面的名字也得跟著改了。 第二條和第四條指令的用途是延時,它是怎樣實現(xiàn)的呢?指令的形式是lcall,這條指令稱為調用子程序指令,看一下指令后面跟的是什么,delay,找一下delay,在第六條指令的前面,顯然,這也是一個標號。這條指令的作用是這樣的:當執(zhí)行l(wèi)call指令時,程序就轉到lcall后面的標號所標定的程序處執(zhí)行,如果在執(zhí)行指
22、令的過程中遇到ret指令,則程序就返回到lcall指令的下面的一條指令繼續(xù)執(zhí)行,從第六行開始的指令中,可以看到確實有ret指令。在執(zhí)行第二條指令后,將轉去執(zhí)行第條指令,而在執(zhí)行完,條指令后將遇到第條令:ret,執(zhí)行該條指令后,程序將回來執(zhí)行第三條指令,即將p10清零,使燈亮,然后又是第四條指令,執(zhí)行第四條指令就是轉去執(zhí)行第6,7,8,9,10條指令,然后回來執(zhí)行第5條指令,第5條指令就是讓程序回到第1條開始執(zhí)行,如此周而復始,燈就在不斷地亮、滅了。 在標號delay標志的這一行到ret這一行中的所有程序,這是一段延時程序,大概延時零點幾秒,至于具體的時間,以后我們再學習如何計算。 程序的最后一
23、行是end,這不是一條指令,它只是告訴我們程序到此結束,它被稱為偽指令。 二、單片機內部結構分析:為了知道延時程序是如何工作的,我們必需首先了解延時程序中出現(xiàn)的一些符號, 就從r1開始,r1被稱之為工作寄存器。什么是工作寄存器呢?讓我們從現(xiàn)實生活中來找找答案。如果出一道數(shù)學題:123+567,讓你回答結果是多少,你會馬上答出是690,再看下面一道題:123+567+562,要讓你要上回答,就不這么容易了吧?我們會怎樣做呢?如果有張紙,就容易了,我們先算出123+567=690,把690寫在紙上,然后再算690+562得到結果是1552。這其中1552是我們想要的結果,而690并非我們所要的結果
24、,但是為了得到最終結果,我們又不得不先算出690,并記下來,這其實是一個中間結果,計算機中做運算和這個類似,為了要得到最終結果,往往要做很多步的中間結果,這些中間結果要有個地方放才行,把它們放哪呢?放在前面提到過的rom中可以嗎?顯然不行,因為計算機要將結果寫進去,而rom是不可以寫的,所以在單片機中另有一個區(qū)域稱為ram區(qū)(ram是隨機存取存儲器的英文縮寫),它可以將數(shù)據(jù)寫進去。特別地,在mcs-51單片機中,將ram中分出一塊區(qū)域,稱為工作寄存器區(qū)。單片機第五課:單片機的內外部結構分析(三)一、延時程序分析上一次課中,我們已經知道,程序中的符號r7、r6是代表了一個個的ram單元,是用來放
25、一些數(shù)據(jù)的,下面我們再來看一下其它符號的含義。delay: mov r7,#250 ;()d1: mov r6,#250 ;() d2: djnz r6,d2 ;()djnz r7,d1;() ret ;() 1. mov:這是一條指令,意思是傳遞數(shù)據(jù)。說到傳遞,我們都很清楚,傳東西要從一個人的手上傳到另一個人的手上,也就是說要有一個接受者,一個傳遞者和一樣東西。從指令mov r7,#250中來分析,r7是一個接受者,250是被傳遞的數(shù),傳遞者在這條指令中被省略了(注意:并不是每一條傳遞指令都會省的,事實上大部份數(shù)據(jù)傳遞指令都會有傳遞者)。它的意義也很明顯:將數(shù)據(jù)250送到r7中去,因此執(zhí)行完
26、這條指令后,r7單元中的值就應當是250。在250前面有個#號,這又是什么意思呢?這個#就是用來說明250就是一個被傳遞的東西本身,而不是傳遞者。那么mov r6,#250是什么意思,應當不用分析了吧。2. djnz:這是另一條指令,我們來看一下這條指令后面跟著的兩個東西,一個是r6,一個是d2,r6我們當然已知是什么了,查一下d2是什么。d2在本行的前面,我們已學過,這稱之為標號。標號的用途是什么呢?就是給本行起一個名字。djnz指令的執(zhí)行過程是這樣的,它將其后面的第一個參數(shù)中的值減1,然后看一下,這個值是否等于0,如果等于0,就往下執(zhí)行,如果不等于0,就轉移,轉到什么地方去呢?可能大家已猜
27、到了,轉到第二個參數(shù)所指定的地方去(請大家用自已的話講一下這條語句是怎樣執(zhí)行的)。本條指令的最終執(zhí)行結果就是,在原地轉圈250次。3. 執(zhí)行完了djnz r6,d2之后(也就是r6的值等于0之后),就會去執(zhí)行下面一行,也就是djnz r7,d1,請大家自行分析一下這句話執(zhí)行的結果。(轉去執(zhí)行mov r6,#250,同時r7中的值減1),最終djnz r6,d2這句話將被執(zhí)行250*250=62500次,執(zhí)行這么多次同一條指令干嗎?就是為了延時。4. 一個問題:如果在r6中放入0,會有什么樣的結果。二、時序分析:前面我們介紹了延時程序,但這還不完善,因為,我們只知道djnz r6,d2這句話會被
28、執(zhí)行62500次,但是執(zhí)行這么多次需要多長時間呢?是否滿足我們的要求呢?我們還不知道,所以下面要來解決這個問題。先提一個問題:我們學校里什么是最重要的。(鈴聲)校長可以出差,老師可以休息,但學校一日無鈴聲必定大亂。整個學校就是在鈴聲的統(tǒng)一指揮下,步調一致,統(tǒng)一協(xié)調地工作著。這個鈴是按一定的時間安排來響的,我們可以稱之為“時序時間的順序”。一個由人組成的單位尚且要有一定的時序,計算機當然更要有嚴格的時序。事實上,計算機更象一個大鐘,什么時候分針動,什么時候秒針動,什么時候時針動,都有嚴格的規(guī)定,一點也不能亂。計算機要完成的事更復雜,所以它的時序也更復雜。我們已知,計算機工作時,是一條一條地從ro
29、m中取指令,然后一步一步地執(zhí)行,我們規(guī)定:計算機訪問一次存儲器的時間,稱之為一個機器周期。這是一個時間基準,好象我們人用“秒”作為我們的時間基準一樣,為什么不干脆用“秒”,多好,很習慣,學下去我們就會知道用“秒”反而不習慣。一個機器周期包括12個時鐘周期。下面讓我們算一下一個機器周期是多長時間吧。設一個單片機工作于12m晶振,它的時鐘周期是1/12(微秒)。它的一個機器周期是12*(1/12)也就是1微秒。(請計算一個工作于6m晶振的單片機,它的機器周期是多少)。mcs-51單片機的所有指令中,有一些完成得比較快,只要一個機器周期就行了,有一些完成得比較慢,得要2個機器周期,還有兩條指令要4個
30、機器周期才行。這也不難再解,不是嗎?我讓你掃地的執(zhí)行要完成總得比要你完成擦黑板的指令時間要長。為了恒量指令執(zhí)行時間的長短,又引入一個新的概念:指令周期。所謂指令周期就是指執(zhí)行一條指令的時間。intel對每一條指令都給出了它的指令周期數(shù),這些數(shù)據(jù),大部份不需要我們去記憶,但是有一些指令是需要記住的,如djnz指令是雙周期指令。下面讓我們來計算剛才的延時。首先必須要知道晶振的頻率,我們設所用晶振為12m,則一個機器周期就是1微秒。而djnz指令是雙周期指令,所以執(zhí)行一次要2個微秒。一共執(zhí)行62500次,正好125000微秒,也就是125毫秒。練習:設計一個延時100毫秒的延時程序。要點分析:1、一
31、個單元中的數(shù)是否可以超過255。2、如何分配兩個數(shù)。三、復位電路任何單片機在工作之前都要有個復位的過程,復位是什么意思呢?它就象是我們上課之前打的預備鈴。預備鈴一響,大家就自動地從操場、其它地方進入教室了,在這一段時間里,是沒有老師干預的,對單片機來說,是程序還沒有開始執(zhí)行,是在做準備工作。顯然,準備工作不需要太長的時間,復位只需要5ms的時間就可以了。如何進行復位呢?只要在單片機的rst引腳上加上高電平,就可以了,按上面所說,時間不少于5ms。為了達到這個要求,可以用很多種方法,這里提供一種供參考,見圖1。實際上,我們在上一次實驗的圖中已見到過了。這種復位電路的工作原理是:通電時,電容兩端相
32、當于是短路,于是rst引腳上為高電平,然后電源通過電阻對電容充電,rst端電壓慢慢下降,降到一定程序,即為低電平,單片機開始正常工作。單片機第六課:單片機的內外部結構分析(四)1. 第三個實驗上兩次我們做過兩個實驗,都是讓p1.0這個引腳使燈亮,我們可以設想:既然p1.0可以讓燈亮,那么其它的引腳可不可以呢?看一下圖1,它是8031單片機引腳的說明,在p1.0旁邊有p1.1,p1.2.p1.7,它們是否都可以讓燈亮呢?除了以p1開頭的外,還有以p0,p2,p3開頭的,數(shù)一下,一共是32個引腳,前面我們以學過7個引腳,加上這32個這39個了。它們都以p字開頭,只是后面的數(shù)字不一樣,它們是否有什么
33、聯(lián)系呢?它們能不能都讓燈亮呢?在我們的實驗板上,除了p10之外,還有p11p17都與led相連,下面讓我們來做一個實驗,程序如下:main:movp1,#0ffhlcalldelaymovp1,#00hlcalldelayljmpmaindelay:movr7,#250d1: mov r6,#250d2: djnzr6,d2 djnzr7,d1 retend將這段程序轉為機器碼,用編程器寫入芯片中,結果如何?通電以后我們可以看到8只led全部在閃動。因此,p10p17是全部可以點亮燈的。事實上,凡以p開頭的這32個引腳都是可以點亮燈的,也就是說:這32個引腳都可以作為輸出使用,如果不用來點亮l
34、ed,可以用來控制繼電器,可以用來控制其它的執(zhí)行機構。程序分析:這段程序和前面做過的程序比較,只有兩處不一樣:第一句:原來是setb p1.0,現(xiàn)在改為mov p1,#0ffh,第三句:原來是clr p1.0,現(xiàn)在改為mov p1.0,#00h。從中可以看出,p1是p1.0p1.7的全體的代表,一個p1就表示了所有的這八個管腳了。當然用的指令也不一樣了,是用mov指令。為什么用這條指令?看圖2,我們把p1作為一個整體,就把它當作是一個存儲器的單元,對一個單元送進一個數(shù)可以用mov指令。二、第四個實驗除了可以作為輸出外,這32個引腳還可以做什么呢?下面再來做一個實驗,程序如下:main:movp
35、3,#0ffhloop:mova,p3movp1,aljmploop先看一下實驗的結果:所有燈全部不亮,然后我按下一個按鈕,第()個燈亮了,再按下另一個按鈕,第()個燈亮了,松開按鈕燈就滅了。從這個實驗現(xiàn)象結合電路來分析一下程序。從硬件電路的連線可以看出,有四個按鈕被接入到p3口的p32,p33,p34,p35。第一條指令的用途我們可以猜到:使p3口全部為高電平。第二條指令是mov a,p3,其中 mov已經見,是送數(shù)的意思,這條指令的意思就是將p3口的數(shù)送到a中去,我們可以把a當成是一個中間單元(看圖3),第三句話是將a中的數(shù)又送到p1口去,第四句話是循環(huán),就是不斷地重復這個過程,這我們已見
36、過。當我們按下第一個按鈕時,第(3)只燈亮了,所以p12口應當輸出是低電平,為什么p12口會輸出低電平呢?我們看一下有什么被送到了p1口,只有從p3口進來的數(shù)送到a,又被送到了p1口,所以,肯定是p3口進來的數(shù)使得p12位輸出電平的。p3口的p32位的按鈕被按下,使得p32位的電平為低,通過程序,又使p12口輸出低電平,所以p3口起來了一個輸入的作用。驗證:按第二、三、四個按鈕,同時按下2個、3個、4個按鈕都可以得到同樣的結論,所以p3口確實起到了輸入作用,這樣,我們可以看到,以p字開頭的管腳,不僅可以用作輸出,還可以用作輸入,其它的管腳是否可以呢?是的,都可以。這32個引腳就稱之為并行口,下
37、面我們就對并行口的結構作一個分析,看一下它是怎樣實現(xiàn)輸入和輸出的。3. 并行口結構分析:1、輸出結構先看p1口的一位的結構示意圖(只畫出了輸出部份):從圖中可以看出,開關的打開和合上代表了引腳輸出的高和低,如果開關合上了,則引腳輸出就是低,如果開關打開了,則輸出高電平,這個開關是由一根線來控制的,這根數(shù)據(jù)總線是出自于cpu,讓我們回想一下,數(shù)據(jù)總線是一根大家公用的線,很多的器件和它連在一起,在不同的時候,不同的器件當然需要不同的信號,如某一時刻我們讓這個引腳輸出高電平,并要求保持若干時間,在這段時間里,計算機當然在忙個不停,在與其它器件進行聯(lián)絡,這根控制線上的電平未必能保持原來的值不變,輸出就
38、會發(fā)生變化了。怎么解決這個問題呢?我們在存儲器一節(jié)中學過,存儲器中是可以存放電荷的,我們不妨也加一個小的存儲器的單元,并在它的前面加一個開關,要讓這一位輸出時,就把開關打開,信號就進入存儲器的單元,然后馬上關閉開關,這樣這一位的狀態(tài)就被保存下來,直到下一次命令讓它把開關再打開為止。這樣就能使這一位的狀態(tài)與別的器件無關了,這么一個小單元,我們給它一個很形象的名字,稱之為“鎖存器”。2、輸入結構這是并行口的一位的輸出結構示意圖,再看,除了輸出之外,還有兩根線,一根從外部引腳接入,另一根從鎖存器的輸出接出,分別標明讀引腳和讀鎖存器。這兩根線是用于從外部接收信號的,為什么要兩根呢?原來,在51單片機中
39、輸入有兩種方式,分別稱為讀引腳和讀鎖存器,第一種方式是將引腳作為輸入,那是真正地從外部引腳讀進輸入的值,第二種方式是該引腳處于輸出狀態(tài)時,有時需要改變這一位的狀態(tài),則并不需要真正地讀引腳狀態(tài),而只是讀入鎖存器的狀態(tài),然后作某種變換后再輸出。請注意輸入結構圖,如果將這一根引線作為輸入口使用,我們并不能保證在任何時刻都能得到正確的結果(為什么?)參考圖2輸入示意圖。接在外部的開關如果打開,則應當是輸入1,而如果閉合開關,則輸入0,但是,如果單片機內部的開關是閉合的,那么不管外部的開關是開還是閉,單片機接受到的數(shù)據(jù)都是0??梢?,要讓這一端口作為輸入使用,要先做一個準備工作,就是先讓內部的開關斷開,也
40、就是讓端口輸出1才行。正因為要先做這么一個準備工作,所以我們稱之為“準雙向i/o口”。以上是p1口的一位的結構,p1口其它各位的結構與之相同,而其它三個口:p0、p2、p3則除入作為輸入輸出口之外還有其它用途,所以結構要稍復雜一些,但其用于輸入、輸出的結構是相同的。看圖()。對我們來說,這些附加的功能不必由我們來控制,所以我們就不去關心它了。單片機第七課:單片機內部結構分析(五)通過前面的學習,我們已知單片機的內部有rom、有ram、有并行i/o口,那么,除了這些東西之外,單片機內部究竟還有些什么,這些個零碎的東西怎么連在一起的,讓我們來對單片機內部作一個完整的分析吧!看圖(1)(本圖太大,請
41、大家找本書看吧,一般講單片機的書,隨便哪本都有)。從圖中我們可以看出,在51單片機內部有一個cpu用來運算、控制,有四個并行i/o口,分別是p0、p1、p2、p3,有rom,用來存放程序,有ram,用來存放中間結果,此外還有定時/計數(shù)器,串行i/o口,中斷系統(tǒng),以及一個內部的時鐘電路。在一個51單片機的內部包含了這么多的東西。對上面的圖進行進一步的分析,我們已知,對并行i/o口的讀寫只要將數(shù)據(jù)送入到相應i/o口的鎖存器就可以了,那么對于定時/計數(shù)器,串行i/o口等怎么用呢?在單片機中有一些獨立的存儲單元是用來控制這些器件的,被稱之為特殊功能寄存器(sfr)。事實上,我們已接觸過p1這個特殊功能
42、寄存器了,還有哪些呢?看表1符號 地址 功能介紹 b f0h b寄存器 acc e0h 累加器 psw d0h 程序狀態(tài)字 ip b8h 中斷優(yōu)先級控制寄存器 p3 b0h p3口鎖存器 ie a8h 中斷允許控制寄存器 p2 a0h p2口鎖存器 sbuf 99h 串行口鎖存器 scon 98h 串行口控制寄存器 p1 90h p1口鎖存器 th1 8dh 定時器/計數(shù)器1(高8位) th0 8ch 定時器/計數(shù)器1(低8位) tl1 8bh 定時器/計數(shù)器0(高8位) tl0 8ah 定時器/計數(shù)器0(低8位) tmod 89a 定時器/計數(shù)器方式控制寄存器 tcon 88h 定時器/計數(shù)
43、器控制寄存器 dph 83h 數(shù)據(jù)地址指針(高8位) dpl 82h 數(shù)據(jù)地址指針(低8位) sp 81h 堆棧指針 p0 80h p0口鎖存器 pcon 87h 電源控制寄存器 表1 下面,我們介紹一下幾個常用的sfr,看圖2。1. acc:累加器,通常用a表示。這是個什么東西,可不能從名字上理解,它是一個寄存器,而不是一個做加法的東西,為什么給它這么一個名字呢?或許是因為在運算器做運算時其中一個數(shù)一定是在acc中的緣故吧。它的名字特殊,身份也特殊,稍后我們將學到指令,可以發(fā)現(xiàn),所有的運算類指令都離不開它。2、b:一個寄存器。在做乘、除法時放乘數(shù)或除數(shù),不做乘除法時,隨你怎么用。3、psw:
44、程序狀態(tài)字。這是一個很重要的東西,里面放了cpu工作時的很多狀態(tài),借此,我們可以了解cpu的當前狀態(tài),并作出相應的處理。它的各位功能請看表2d7d6d5d4d3d2d1d0cyacf0rs1rs0ovp表2 下面我們逐一介紹各位的用途(1)cy:進位標志。8051中的運算器是一種8位的運算器,我們知道,8位運算器只能表示到0-255,如果做加法的話,兩數(shù)相加可能會超過255,這樣最高位就會丟失,造成運算的錯誤,怎么辦?最高位就進到這里來。這樣就沒事了。例:78h+97h(01111000+10010111)(2)ac:半進位標志。 例:57h+3ah(01010111+00111010)(3)
45、f0:用戶標志位,由我們(編程人員)決定什么時候用,什么時候不用。(4)rs1、rs0:工作寄存器組選擇位。這個我們已知了。 (5)0v:溢出標志位。什么是溢出我們稍后再談吧。(6)p:奇偶校驗位:它用來表示alu運算結果中二進制數(shù)位“1”的個數(shù)的奇偶性。若為奇數(shù),則p=1,否則為0。例:某運算結果是78h(01111000),顯然1的個數(shù)為偶數(shù),所以p=0。4、dptr(dph、dpl):數(shù)據(jù)指針,可以用它來訪問外部數(shù)據(jù)存儲器中的任一單元,如果不用,也可以作為通用寄存器來用,由我們自已決定如何使用。5、p0、p1、p2、p3:這個我們已經知道,是四個并行輸入/輸出口的寄存器。它里面的內容對應
46、著管腳的輸出。 6、sp:堆棧指針。堆棧介紹:日常生活中,我們都注意到過這樣的現(xiàn)象,家里洗的碗,一只一只摞起來,最晚放上去的放在最上面,而最早放上去的則放在最下面,在取的時候正好相反,先從最上面取,這種現(xiàn)象我們用一句話來概括:“先進后出,后進先出”。請大家想想,還有什么地方有這種現(xiàn)象?其實比比皆是,建筑工地上堆放的磚頭、材料,倉庫里放的貨物,都是“先進后出,后進先出”,這實際是一種存取物品的規(guī)則,我們稱之為“堆棧”。在單片機中,我們也可以在ram中構造這樣一個區(qū)域,用來存放數(shù)據(jù),這個區(qū)域存放數(shù)據(jù)的規(guī)則就是“先進后出,后進先出”,我們稱之為“堆棧”。為什么需要這樣來存放數(shù)據(jù)呢?存儲器本身不是可以
47、按地址來存放數(shù)據(jù)嗎?對,知道了地址的確就可以知道里面的內容,但如果我們需要存放的是一批數(shù)據(jù),每一個數(shù)據(jù)都需要知道地址那不是麻煩嗎?如果我們讓數(shù)據(jù)一個接一個地放置,那么我們只要知道第一個數(shù)據(jù)所在地址單元就可以了(看圖2)如果第一個數(shù)據(jù)在27h,那么第二、三個就在28h、29h了。所以利用堆棧這種方法來放數(shù)據(jù)可以簡化操作那么51中堆棧什么地方呢?單片機中能存放數(shù)據(jù)的區(qū)域有限,我們不能夠專門分配一塊地方做堆棧,所以就在內存(ram)中開辟一塊地方,用于堆棧,但是用內存的哪一塊呢?還是不好定,因為51是一種通用的單片機,各人的實際需求各不相同,有人需要多一些堆棧,而有人則不需要那么多,所以怎么分配都不
48、合適,怎樣來解決這個問題?分不好干脆就不分了,把分的權利給用戶(編程者),根據(jù)自已的需要去定吧,所以51單片機中堆棧的位置是可以變化的。而這種變化就體現(xiàn)在sp中值的變化,看圖2,sp中的值等于27h不就相當于是一個指針指向27h單元嗎?當然在真正的51機中,開始指針所指的位置并非就是數(shù)據(jù)存放的位置,而是數(shù)據(jù)存放的前一個位置,比如一開始指針是指向27h單元的,那么第一個數(shù)據(jù)的位置是28h單元,而不是27h單元,為什么會這樣,我們在學堆棧命令時再說明。圖2 其它的sfr,我們在用到時再介紹。 單片機第八課(尋址方式與指令系統(tǒng))通過前面的學習,我們已經了解了單片機內部的結構,并且也已經知道,要控制單
49、片機,讓它為我們干學,要用指令,我們已學了幾條指令,但很零散,從現(xiàn)在開始,我們將要系統(tǒng)地學習8051的指令部份。一、概述1、指令的格式我們已知,要讓計算機做事,就得給計算機以指令,并且我們已知,計算機很“笨”,只能懂得數(shù)字,如前面我們寫進機器的75h,90h,00h等等,所以指令的第一種格式就是機器碼格式,也說是數(shù)字的形式。但這種形式實在是為難我們人了,太難記了,于是有另一種格式,助記符格式,如mov p1,#0ffh,這樣就好記了。 這兩種格式之間的關系呢,我們不難理解,本質上它們完全等價,只是形式不一樣而已。2、匯編我們寫指令使用匯編格式,而計算機只懂機器碼格式,所以要將我們寫的匯編格式的
50、指令轉換為機器碼格式,這種轉換有兩種方法:手工匯編和機器匯編。手工匯編實際上就是查表,因為這兩種格式純粹是格式不同,所以是一一對應的,查一張表格就行了。不過手工查表總是嫌麻煩,所以就有了計算機軟件,用計算機軟件來替代手工查表,這就是機器匯編。二、尋址讓我們先來復習一下我們學過的一些指令:mov p1,#0ffh,mov r7,#0ffh這些指令都是將一些數(shù)據(jù)送到相應的位置中去,為什么要送數(shù)據(jù)呢?第一個因為送入的數(shù)可以讓燈全滅掉,第二個是為了要實現(xiàn)延時,從這里我們可以看出來,在用單片機的編程語言編程時,經常要用到數(shù)據(jù)的傳遞,事實上數(shù)據(jù)傳遞是單片機編程時的一項重要工作,一共有28條指令(單片機共1
51、11條指令)。下面我們就從數(shù)據(jù)傳遞類指令開始吧。分析一下mov p1,#0ffh這條指令,我們不難得出結論,第一個詞mov是命令動詞,也就是決定做什么事情的,mov是move少寫了一個e,所以就是“傳遞”,這就是指令,規(guī)定做什么事情,后面還有一些參數(shù),分析一下,數(shù)據(jù)傳遞必須要有一個“源”也就是你要送什么數(shù),必須要有一個“目的”,也就是你這個數(shù)要送到什么地方去,顯然在上面那條指令中,要送的數(shù)(源)就是0ffh,而要送達的地方(目的地)就是p1這個寄存器。在數(shù)據(jù)傳遞類指令中,均將目的地寫在指令的后面,而將源寫在最后。這條指令中,送給p1是這個數(shù)本身,換言之,做完這條指令后,我們可以明確地知道,p1
52、中的值是0ffh,但是并不是任何時候都可以直接給出數(shù)本身的。例如,在我們前面給出的延時程序例是這樣寫的:main: setb p1.0 ;()lcall delay ;()clr p1.0 ;()lcall delay ;()ajmp main ;();以下子程序delay: mov r7,#250 ;()d1: mov r6,#250 ;()d2: djnz r6,d2 ;() djnz r7,d1;() ret ;() end ;() 表1 main: setb p1.0 ;()mov 30h,#255 lcall delay ; clr p1.0 ;() mov 30h,#200 lca
53、ll delay ;() ajmp main ;();以下子程序delay: mov r7,30h ;()d1: mov r6,#250 ;()d2: djnz r6,d2 ;() djnz r7,d1;() ret ;() end ;() 表2 這樣一來,我每次調用延時程序延時的時間都是相同的(大致都是0.13s),如果我提出這樣的要求:燈亮后延時時間為0.13s燈滅,燈滅后延時0.1秒燈亮,如此循環(huán),這樣的程序還能滿足要求嗎?不能,怎么辦?我們可以把延時程序改成這樣(見表2):調用則見表2中的主程,也就是先把一個數(shù)送入30h,在子程序中r7中的值并不固定,而是根據(jù)30h單元中傳過來的數(shù)確定
54、。這樣就可以滿足要求。從這里我們可以得出結論,在數(shù)據(jù)傳遞中要找到被傳遞的數(shù),很多時候,這個數(shù)并不能直接給出,需要變化,這就引出了一個概念:如何尋找操作數(shù),我們把尋找操作數(shù)所在單元的地址稱之為尋址。在這里我們直接使用數(shù)所在單元的地址找到了操作數(shù),所以稱這種方法為直接尋址。除了這種方法之外,還有一種,如果我們把數(shù)放在工作寄存器中,從工作寄存器中尋找數(shù)據(jù),則稱之為寄存器尋址。例:mov a,r0就是將r0工作寄存器中的數(shù)據(jù)送到累加器a中去。提一個問題:我們知道,工作寄存器就是內存單元的一部份,如果我們選擇工作寄存器組0,則r0就是ram的00h單元,那么這樣一來,mov a,00h,和mov a,r
55、0不就沒什么區(qū)別了嗎?為什么要加以區(qū)分呢?的確,這兩條指令執(zhí)行的結果是完全相同的,都是將00h單元中的內容送到a中去,但是執(zhí)行的過程不同,執(zhí)行第一條指令需要2個周期,而第二條則只需要1個周期,第一條指令變成最終的目標碼要兩個字節(jié)(e5h 00h),而第二條則只要一個字節(jié)(e8h)就可以了。這么斤斤計較!不就差了一個周期嗎,如果是12m的晶振的話,也就1個微秒時間了,一個字節(jié)又能有多少?不對,如果這條指令只執(zhí)行一次,也許無所謂,但一條指令如果執(zhí)行上1000次,就是1毫秒,如果要執(zhí)行1000000萬次,就是1s的誤差,這就很可觀了,單片機做的是實時控制的事,所以必須如此“斤斤計較”。字節(jié)數(shù)同樣如此。再來提一個問題,現(xiàn)在我們已知,尋找操作數(shù)可以通過直接給的方式(立即尋址)和直接給出數(shù)所在單元地址的方式(直接尋址),這就夠了嗎?看這個問題,要求從30h單元開始,取20個數(shù),分別送入a累加器。就我們目前掌握的辦法而言,要從30h單元取數(shù),就用mov a,30h,那么下一個數(shù)呢?是31h單元的,怎么取呢?還是只能用mov a,31h,那么20個數(shù),不是得20條指令才能寫完嗎?這里只有2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國專業(yè)氡檢測儀行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國N,N-二乙基間甲苯胺行業(yè)投資前景及策略咨詢研究報告
- 化工及電子材料分銷企業(yè)數(shù)字化轉型與智慧升級戰(zhàn)略研究報告
- 2025年度物業(yè)小區(qū)車位租賃及車位租賃糾紛調解合同
- 二零二五年度證書授權及更新服務合同
- 二零二五年度員工持股合伙協(xié)議書:新能源發(fā)電項目員工持股合伙協(xié)議與項目實施協(xié)議
- 團體保險企業(yè)數(shù)字化轉型與智慧升級戰(zhàn)略研究報告
- 二零二五年度事業(yè)單位合同解除后員工離職手續(xù)辦理及后續(xù)服務合同
- 原奶企業(yè)縣域市場拓展與下沉戰(zhàn)略研究報告
- 每日堅果盒行業(yè)跨境出海戰(zhàn)略研究報告
- 《橋梁工程計算書》word版
- 中華人民共和國特種設備安全法(節(jié)選)
- 籃球比賽計分表
- 施工現(xiàn)場安全隱患檢查(附標準規(guī)范)
- 吞咽障礙及吞咽功能的評定
- 拱涵計算書-6.0m-1m
- 數(shù)字電子技術課程設計報告(數(shù)字積分器)
- 高中有機化學必修模塊與選修模塊的銜接
- BBC美麗中國英文字幕
- 《自然保護區(qū)綜合科學考察規(guī)程》
- JJF(皖)105-2020 小型蒸汽滅菌器溫度、壓力參數(shù)校準規(guī)范
評論
0/150
提交評論