<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機(jī)知識(二)

          單片機(jī)知識(二)

          作者: 時間:2016-11-22 來源:網(wǎng)絡(luò) 收藏
          單片機(jī)的內(nèi)外部結(jié)構(gòu)分析

          一、延時程序分析

          本文引用地址:http://www.ex-cimer.com/article/201611/319709.htm

          上一次課中,我們已經(jīng)知道,程序中的符號R7、R6是代表了一個個的RAM單元,是用來放一些數(shù)據(jù)的,下面我們再來看一下其它符號的含義。

          DELAY: MOV R7,#250   ;(6)

          D1: MOV R6,#250   ;(7)

          D2: DJNZ R6,D2   ?。唬ǎ福?/p>

          DJNZ R7,D1   ;(9)

          RET        ;(10)


          1.MOV:這是一條指令,意思是傳遞數(shù)據(jù)。說到傳遞,我們都很清楚,傳東西要從一個人的手上傳到另一個人的手上,也就是說要有一個接受者,一個傳遞者和一樣?xùn)|西。從指令MOV R7,#250中來分析,R7是一個接受者,250是被傳遞的數(shù),傳遞者在這條指令中被省略了(注意:并不是每一條傳遞指令都會省的,事實上大部份數(shù)據(jù)傳遞指令都會有傳遞者)。它的意義也很明顯:將數(shù)據(jù)250送到R7中去,因此執(zhí)行完這條指令后,R7單元中的值就應(yīng)當(dāng)是250。在250前面有個#號,這又是什么意思呢?這個#就是用來說明250就是一個被傳遞的東西本身,而不是傳遞者。那么MOV R6,#250是什么意思,應(yīng)當(dāng)不用分析了吧。

          2.DJNZ:這是另一條指令,我們來看一下這條指令后面跟著的兩個東西,一個是R6,一個是D2,R6我們當(dāng)然已知是什么了,查一下D2是什么。D2在本行的前面,我們已學(xué)過,這稱之為標(biāo)號。標(biāo)號的用途是什么呢?就是給本行起一個名字。DJNZ指令的執(zhí)行過程是這樣的,它將其后面的第一個參數(shù)中的值減1,然后看一下,這個值是否等于0,如果等于0,就往下執(zhí)行,如果不等于0,就轉(zhuǎn)移,轉(zhuǎn)到什么地方去呢?可能大家已猜到了,轉(zhuǎn)到第二個參數(shù)所指定的地方去(請大家用自已的話講一下這條語句是怎樣執(zhí)行的)。本條指令的最終執(zhí)行結(jié)果就是,在原地轉(zhuǎn)圈250次。


          3.執(zhí)行完了DJNZ R6,D2之后(也就是R6的值等于0之后),就會去執(zhí)行下面一行,也就是DJNZ R7,D1,請大家自行分析一下這句話執(zhí)行的結(jié)果。(轉(zhuǎn)去執(zhí)行MOV R6,#250,同時R7中的值減1),最終DJNZ R6,D2這句話將被執(zhí)行250*250=62500次,執(zhí)行這么多次同一條指令干嗎?就是為了延時。


          4.一個問題:如果在R6中放入0,會有什么樣的結(jié)果。

          二、時序分析:

          前面我們介紹了延時程序,但這還不完善,因為,我們只知道DJNZ R6,D2這句話會被執(zhí)行62500次,但是執(zhí)行這么多次需要多長時間呢?是否滿足我們的要求呢?我們還不知道,所以下面要來解決這個問題。

          先提一個問題:我們學(xué)校里什么是最重要的。(鈴聲)校長可以出差,老師可以休息,但學(xué)校一日無鈴聲必定大亂。整個學(xué)校就是在鈴聲的統(tǒng)一指揮下,步調(diào)一致,統(tǒng)一協(xié)調(diào)地工作著。這個鈴是按一定的時間安排來響的,我們可以稱之為“時序時間的順序”。一個由人組成的單位尚且要有一定的時序,計算機(jī)當(dāng)然更要有嚴(yán)格的時序。事實上,計算機(jī)更象一個大鐘,什么時候分針動,什么時候秒針動,什么時候時針動,都有嚴(yán)格的規(guī)定,一點(diǎn)也不能亂。計算機(jī)要完成的事更復(fù)雜,所以它的時序也更復(fù)雜。

          我們已知,計算機(jī)工作時,是一條一條地從ROM中取指令,然后一步一步地執(zhí)行,我們規(guī)定:計算機(jī)訪問一次存儲器的時間,稱之為一個機(jī)器周期。這是一個時間基準(zhǔn),好象我們?nèi)擞?ldquo;秒”作為我們的時間基準(zhǔn)一樣,為什么不干脆用“秒”,多好,很習(xí)慣,學(xué)下去我們就會知道用“秒”反而不習(xí)慣。

          一個機(jī)器周期包括12個時鐘周期。下面讓我們算一下一個機(jī)器周期是多長時間吧。設(shè)一個單片機(jī)工作于12M晶振,它的時鐘周期是1/12(微秒)。它的一個機(jī)器周期是12*(1/12)也就是1微秒。(請計算一個工作于6M晶振的單片機(jī),它的機(jī)器周期是多少)。

          MCS-51單片機(jī)的所有指令中,有一些完成得比較快,只要一個機(jī)器周期就行了,有一些完成得比較慢,得要2個機(jī)器周期,還有兩條指令要4個機(jī)器周期才行。這也不難再解,不是嗎?我讓你掃地的執(zhí)行要完成總得比要你完成擦黑板的指令時間要長。為了恒量指令執(zhí)行時間的長短,又引入一個新的概念:指令周期。所謂指令周期就是指執(zhí)行一條指令的時間。INTEL對每一條指令都給出了它的指令周期數(shù),這些數(shù)據(jù),大部份不需要我們?nèi)ビ洃?,但是有一些指令是需要記住的,如DJNZ指令是雙周期指令。

          下面讓我們來計算剛才的延時。首先必須要知道晶振的頻率,我們設(shè)所用晶振為12M,則一個機(jī)器周期就是1微秒。而DJNZ指令是雙周期指令,所以執(zhí)行一次要2個微秒。一共執(zhí)行62500次,正好125000微秒,也就是125毫秒。

          練習(xí):設(shè)計一個延時100毫秒的延時程序。

          要點(diǎn)分析:1、一個單元中的數(shù)是否可以超過255。2、如何分配兩個數(shù)。

          三、復(fù)位電路

          任何單片機(jī)在工作之前都要有個復(fù)位的過程,復(fù)位是什么意思呢?它就象是我們上課之前打的預(yù)備鈴。預(yù)備鈴一響,大家就自動地從操場、其它地方進(jìn)入教室了,在這一段時間里,是沒有老師干預(yù)的,對單片機(jī)來說,是程序還沒有開始執(zhí)行,是在做準(zhǔn)備工作。顯然,準(zhǔn)備工作不需要太長的時間,復(fù)位只需要5ms的時間就可以了。如何進(jìn)行復(fù)位呢?只要在單片機(jī)的RST引腳上加上高電平,就可以了,按上面所說,時間不少于5ms。為了達(dá)到這個要求,可以用很多種方法,這里提供一種供參考,見圖1。實際上,我們在上一次實驗的圖中已見到過了。

          這種復(fù)位電路的工作原理是:通電時,電容兩端相當(dāng)于是短路,于是RST引腳上為高電平,然后電源通過電阻對電容充電,RST端電壓慢慢下降,降到一定程序,即為低電平,單片機(jī)開始正常工作。

          單片機(jī)的內(nèi)外部結(jié)構(gòu)分析(四)
          第三個實驗


          上兩次我們做過兩個實驗,都是讓P1.0這個引腳使燈亮,我們可以設(shè)想:既然P1.0可以讓燈亮,那么其它的引腳可不可以呢?看一下圖1,它是8031單片機(jī)引腳的說明,在P1.0旁邊有P1.1,P1.2….P1.7,它們是否都可以讓燈亮呢?除了以P1開頭的外,還有以P0,P2,P3開頭的,數(shù)一下,一共是32個引腳,前面我們以學(xué)過7個引腳,加上這32個這39個了。它們都以P字開頭,只是后面的數(shù)字不一樣,它們是否有什么聯(lián)系呢?它們能不能都讓燈亮呢?在我們的實驗板上,除了P10之外,還有P11P17都與LED相連,下面讓我們來做一個實驗,程序如下:

          MAIN: MOV P1,#0FFH

          LCALL DELAY

          MOV P1,#00H

          LCALL DELAY

          LJMP MAIN

          DELAY:MOV R7,#250

          D1: MOV R6,#250

          D2: DJNZ R6,D2

          DJNZ R7,D1

          RET

          END

          將這段程序轉(zhuǎn)為機(jī)器碼,用編程器寫入芯片中,結(jié)果如何?通電以后我們可以看到8只LED全部在閃動。因此,P10P17是全部可以點(diǎn)亮燈的。事實上,凡以P開頭的這32個引腳都是可以點(diǎn)亮燈的,也就是說:這32個引腳都可以作為輸出使用,如果不用來點(diǎn)亮LED,可以用來控制繼電器,可以用來控制其它的執(zhí)行機(jī)構(gòu)。

          程序分析:這段程序和前面做過的程序比較,只有兩處不一樣:第一句:原來是SETB P1.0,現(xiàn)在改為MOV P1,#0FFH,第三句:原來是CLR P1.0,現(xiàn)在改為MOV P1.0,#00H。從中可以看出,P1是P1.0P1.7的全體的代表,一個P1就表示了所有的這八個管腳了。當(dāng)然用的指令也不一樣了,是用MOV指令。為什么用這條指令?看圖2,我們把P1作為一個整體,就把它當(dāng)作是一個存儲器的單元,對一個單元送進(jìn)一個數(shù)可以用MOV指令。

          二、第四個實驗

          除了可以作為輸出外,這32個引腳還可以做什么呢?下面再來做一個實驗,程序如下:

          MAIN: MOV P3,#0FFH

          LOOP: MOV A,P3

          MOV P1,A

          LJMP LOOP

          先看一下實驗的結(jié)果:所有燈全部不亮,然后我按下一個按鈕,第()個燈亮了,再按下另一個按鈕,第()個燈亮了,松開按鈕燈就滅了。從這個實驗現(xiàn)象結(jié)合電路來分析一下程序。

          從硬件電路的連線可以看出,有四個按鈕被接入到P3口的P32,P33,P34,P35。第一條指令的用途我們可以猜到:使P3口全部為高電平。第二條指令是MOV A,P3,其中 MOV已經(jīng)見,是送數(shù)的意思,這條指令的意思就是將P3口的數(shù)送到A中去,我們可以把A當(dāng)成是一個中間單元(看圖3),第三句話是將A中的數(shù)又送到P1口去,第四句話是循環(huán),就是不斷地重復(fù)這個過程,這我們已見過。當(dāng)我們按下第一個按鈕時,第(3)只燈亮了,所以P12口應(yīng)當(dāng)輸出是低電平,為什么P12口會輸出低電平呢?我們看一下有什么被送到了P1口,只有從P3口進(jìn)來的數(shù)送到A,又被送到了P1口,所以,肯定是P3口進(jìn)來的數(shù)使得P12位輸出電平的。P3口的P32位的按鈕被按下,使得P32位的電平為低,通過程序,又使P12口輸出低電平,所以P3口起來了一個輸入的作用。驗證:按第二、三、四個按鈕,同時按下2個、3個、4個按鈕都可以得到同樣的結(jié)論,所以P3口確實起到了輸入作用,這樣,我們可以看到,以P字開頭的管腳,不僅可以用作輸出,還可以用作輸入,其它的管腳是否可以呢?是的,都可以。這32個引腳就稱之為并行口,下面我們就對并行口的結(jié)構(gòu)作一個分析,看一下它是怎樣實現(xiàn)輸入和輸出的。

          并行口結(jié)構(gòu)分析:


          1、輸出結(jié)構(gòu)

          先看P1口的一位的結(jié)構(gòu)示意圖(只畫出了輸出部份):從圖中可以看出,開關(guān)的打開和合上代表了引腳輸出的高和低,如果開關(guān)合上了,則引腳輸出就是低,如果開關(guān)打開了,則輸出高電平,這個開關(guān)是由一根線來控制的,這根數(shù)據(jù)總線是出自于CPU,讓我們回想一下,數(shù)據(jù)總線是一根大家公用的線,很多的器件和它連在一起,在不同的時候,不同的器件當(dāng)然需要不同的信號,如某一時刻我們讓這個引腳輸出高電平,并要求保持若干時間,在這段時間里,計算機(jī)當(dāng)然在忙個不停,在與其它器件進(jìn)行聯(lián)絡(luò),這根控制線上的電平未必能保持原來的值不變,輸出就會發(fā)生變化了。怎么解決這個問題呢?我們在存儲器一節(jié)中學(xué)過,存儲器中是可以存放電荷的,我們不妨也加一個小的存儲器的單元,并在它的前面加一個開關(guān),要讓這一位輸出時,就把開關(guān)打開,信號就進(jìn)入存儲器的單元,然后馬上關(guān)閉開關(guān),這樣這一位的狀態(tài)就被保存下來,直到下一次命令讓它把開關(guān)再打開為止。這樣就能使這一位的狀態(tài)與別的器件無關(guān)了,這么一個小單元,我們給它一個很形象的名字,稱之為“鎖存器”。

          2、輸入結(jié)構(gòu)

          這是并行口的一位的輸出結(jié)構(gòu)示意圖,再看,除了輸出之外,還有兩根線,一根從外部引腳接入,另一根從鎖存器的輸出接出,分別標(biāo)明讀引腳和讀鎖存器。這兩根線是用于從外部接收信號的,為什么要兩根呢?原來,在51單片機(jī)中輸入有兩種方式,分別稱為‘讀引腳’和‘讀鎖存器’,第一種方式是將引腳作為輸入,那是真正地從外部引腳讀進(jìn)輸入的值,第二種方式是該引腳處于輸出狀態(tài)時,有時需要改變這一位的狀態(tài),則并不需要真正地讀引腳狀態(tài),而只是讀入鎖存器的狀態(tài),然后作某種變換后再輸出。

          請注意輸入結(jié)構(gòu)圖,如果將這一根引線作為輸入口使用,我們并不能保證在任何時刻都能得到正確的結(jié)果(為什么?)參考圖2輸入示意圖。接在外部的開關(guān)如果打開,則應(yīng)當(dāng)是輸入1,而如果閉合開關(guān),則輸入0,但是,如果單片機(jī)內(nèi)部的開關(guān)是閉合的,那么不管外部的開關(guān)是開還是閉,單片機(jī)接受到的數(shù)據(jù)都是0??梢姡屵@一端口作為輸入使用,要先做一個‘準(zhǔn)備工作’,就是先讓內(nèi)部的開關(guān)斷開,也就是讓端口輸出‘1’才行。正因為要先做這么一個準(zhǔn)備工作,所以我們稱之為“準(zhǔn)雙向I/O口”。

          以上是P1口的一位的結(jié)構(gòu),P1口其它各位的結(jié)構(gòu)與之相同,而其它三個口:P0、P2、P3則除入作為輸入輸出口之外還有其它用途,所以結(jié)構(gòu)要稍復(fù)雜一些,但其用于輸入、輸出的結(jié)構(gòu)是相同的。看圖()。對我們來說,這些附加的功能不必由我們來控制,所以我們就不去關(guān)心它了。

          單片機(jī)內(nèi)部結(jié)構(gòu)分析(五)
          通過前面的學(xué)習(xí),我們已知單片機(jī)的內(nèi)部有ROM、有RAM、有并行I/O口,那么,除了這些東西之外,單片機(jī)內(nèi)部究竟還有些什么,這些個零碎的東西怎么連在一起的,讓我們來對單片機(jī)內(nèi)部作一個完整的分析吧!

          看圖(1)(本圖太大,請大家找本書看吧,一般講單片機(jī)的書,隨便哪本都有)。從圖中我們可以看出,在51單片機(jī)內(nèi)部有一個CPU用來運(yùn)算、控制,有四個并行I/O口,分別是P0、P1、P2、P3,有ROM,用來存放程序,有RAM,用來存放中間結(jié)果,此外還有定時/計數(shù)器,串行I/O口,中斷系統(tǒng),以及一個內(nèi)部的時鐘電路。在一個51單片機(jī)的內(nèi)部包含了這么多的東西。

          對上面的圖進(jìn)行進(jìn)一步的分析,我們已知,對并行I/O口的讀寫只要將數(shù)據(jù)送入到相應(yīng)I/O口的鎖存器就可以了,那么對于定時/計數(shù)器,串行I/O口等怎么用呢?在單片機(jī)中有一些獨(dú)立的存儲單元是用來控制這些器件的,被稱之為特殊功能寄存器(SFR)。事實上,我們已接觸過P1這個特殊功能寄存器了,還有哪些呢?看表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ù)器控制寄存器

          DPH 83H 數(shù)據(jù)地址指針(高8位)

          DPL 82H 數(shù)據(jù)地址指針(低8位)

          SP 81H 堆棧指針

          P0 80H P0口鎖存器

          PCON 87H 電源控制寄存器

          表1
          下面,我們介紹一下幾個常用的SFR,看圖2。

          ACC:累加器,通常用A表示。這是個什么東西,可不能從名字上理解,它是一個寄存器,而不是一個做加法的東西,為什么給它這么一個名字呢?或許是因為在運(yùn)算器做運(yùn)算時其中一個數(shù)一定是在ACC中的緣故吧。它的名字特殊,身份也特殊,稍后我們將學(xué)到指令,可以發(fā)現(xiàn),所有的運(yùn)算類指令都離不開它。


          2、B:一個寄存器。在做乘、除法時放乘數(shù)或除數(shù),不做乘除法時,隨你怎么用。

          3、PSW:程序狀態(tài)字。這是一個很重要的東西,里面放了CPU工作時的很多狀態(tài),借此,我們可以了解CPU的當(dāng)前狀態(tài),并作出相應(yīng)的處理。它的各位功能請看表2

          D7 D6 D5 DD D2 D1 D0

          CY AC F0 RS1 RS0 OV P

          表2

          下面我們逐一介紹各位的用途

          (1)CY:進(jìn)位標(biāo)志。8051中的運(yùn)算器是一種8位的運(yùn)算器,我們知道,8位運(yùn)算器只能表示到0-255,如果做加法的話,兩數(shù)相加可能會超過255,這樣最高位就會丟失,造成運(yùn)算的錯誤,怎么辦?最高位就進(jìn)到這里來。這樣就沒事了。

          例:78H+97H(01111000+10010111)

          (2)AC:半進(jìn)位標(biāo)志。


          例:57H+3AH(01010111+00111010)

          (3)F0:用戶標(biāo)志位,由我們(編程人員)決定什么時候用,什么時候不用。

          (4)RS1、RS0:工作寄存器組選擇位。這個我們已知了。

          (5)0V:溢出標(biāo)志位。什么是溢出我們稍后再談吧。

          (6)P:奇偶校驗位:它用來表示ALU運(yùn)算結(jié)果中二進(jìn)制數(shù)位“1”的個數(shù)的奇偶性。若為奇數(shù),則P=1,否則為0。


          例:某運(yùn)算結(jié)果是78H(01111000),顯然1的個數(shù)為偶數(shù),所以P=0。

          4、DPTR(DPH、DPL):數(shù)據(jù)指針,可以用它來訪問外部數(shù)據(jù)存儲器中的任一單元,如果不用,也可以作為通用寄存器來用,由我們自已決定如何使用。

          5、P0、P1、P2、P3:這個我們已經(jīng)知道,是四個并行輸入/輸出口的寄存器。它里面的內(nèi)容對應(yīng)著管腳的輸出。

          6、SP:堆棧指針。

          堆棧介紹:日常生活中,我們都注意到過這樣的現(xiàn)象,家里洗的碗,一只一只摞起來,最晚放上去的放在最上面,而最早放上去的則放在最下面,在取的時候正好相反,先從最上面取,這種現(xiàn)象我們用一句話來概括:“先進(jìn)后出,后進(jìn)先出”。請大家想想,還有什么地方有這種現(xiàn)象?其實比比皆是,建筑工地上堆放的磚頭、材料,倉庫里放的貨物,都是“先進(jìn)后出,后進(jìn)先出”,這實際是一種存取物品的規(guī)則,我們稱之為“堆棧”。

          在單片機(jī)中,我們也可以在RAM中構(gòu)造這樣一個區(qū)域,用來存放數(shù)據(jù),這個區(qū)域存放數(shù)據(jù)的規(guī)則就是“先進(jìn)后出,后進(jìn)先出”,我們稱之為“堆棧”。為什么需要這樣來存放數(shù)據(jù)呢?存儲器本身不是可以按地址來存放數(shù)據(jù)嗎?對,知道了地址的確就可以知道里面的內(nèi)容,但如果我們需要存放的是一批數(shù)據(jù),每一個數(shù)據(jù)都需要知道地址那不是麻煩嗎?如果我們讓數(shù)據(jù)一個接一個地放置,那么我們只要知道第一個數(shù)據(jù)所在地址單元就可以了(看圖2)如果第一個數(shù)據(jù)在27H,那么第二、三個就在28H、29H了。所以利用堆棧這種方法來放數(shù)據(jù)可以簡化操作

          那么51中堆棧什么地方呢?單片機(jī)中能存放數(shù)據(jù)的區(qū)域有限,我們不能夠?qū)iT分配一塊地方做堆棧,所以就在內(nèi)存(RAM)中開辟一塊地方,用于堆棧,但是用內(nèi)存的哪一塊呢?還是不好定,因為51是一種通用的單片機(jī),各人的實際需求各不相同,有人需要多一些堆棧,而有人則不需要那么多,所以怎么分配都不合適,怎樣來解決這個問題?分不好干脆就不分了,把分的權(quán)利給用戶(編程者),根據(jù)自已的需要去定吧,所以51單片機(jī)中堆棧的位置是可以變化的。而這種變化就體現(xiàn)在SP中值的變化,看圖2,SP中的值等于27H不就相當(dāng)于是一個指針指向27H單元嗎?當(dāng)然在真正的51機(jī)中,開始指針?biāo)傅奈恢貌⒎蔷褪菙?shù)據(jù)存放的位置,而是數(shù)據(jù)存放的前一個位置,比如一開始指針是指向27H單元的,那么第一個數(shù)據(jù)的位置是28H單元,而不是27H單元,為什么會這樣,我們在學(xué)堆棧命令時再說明。

          其它的SFR,我們在用到時再介紹。



          關(guān)鍵詞: 單片機(jī)SF

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();