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

          新聞中心

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

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

          一、延時(shí)程序分析

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

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

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


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


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

          二、時(shí)序分析:

          前面我們介紹了延時(shí)程序,但這還不完善,因?yàn)椋覀冎恢繢JNZ R6,D2這句話會(huì)被執(zhí)行62500次,但是執(zhí)行這么多次需要多長時(shí)間呢?是否滿足我們的要求呢?我們還不知道,所以下面要來解決這個(gè)問題。

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

          我們已知,計(jì)算機(jī)工作時(shí),是一條一條地從ROM中取指令,然后一步一步地執(zhí)行,我們規(guī)定:計(jì)算機(jī)訪問一次存儲(chǔ)器的時(shí)間,稱之為一個(gè)機(jī)器周期。這是一個(gè)時(shí)間基準(zhǔn),好象我們?nèi)擞?ldquo;秒”作為我們的時(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ī)的所有指令中,有一些完成得比較快,只要一個(gè)機(jī)器周期就行了,有一些完成得比較慢,得要2個(gè)機(jī)器周期,還有兩條指令要4個(gè)機(jī)器周期才行。這也不難再解,不是嗎?我讓你掃地的執(zhí)行要完成總得比要你完成擦黑板的指令時(shí)間要長。為了恒量指令執(zhí)行時(shí)間的長短,又引入一個(gè)新的概念:指令周期。所謂指令周期就是指執(zhí)行一條指令的時(shí)間。INTEL對每一條指令都給出了它的指令周期數(shù),這些數(shù)據(jù),大部份不需要我們?nèi)ビ洃?,但是有一些指令是需要記住的,如DJNZ指令是雙周期指令。

          下面讓我們來計(jì)算剛才的延時(shí)。首先必須要知道晶振的頻率,我們設(shè)所用晶振為12M,則一個(gè)機(jī)器周期就是1微秒。而DJNZ指令是雙周期指令,所以執(zhí)行一次要2個(gè)微秒。一共執(zhí)行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í)間里,是沒有老師干預(yù)的,對單片機(jī)來說,是程序還沒有開始執(zhí)行,是在做準(zhǔn)備工作。顯然,準(zhǔn)備工作不需要太長的時(shí)間,復(fù)位只需要5ms的時(shí)間就可以了。如何進(jìn)行復(fù)位呢?只要在單片機(jī)的RST引腳上加上高電平,就可以了,按上面所說,時(shí)間不少于5ms。為了達(dá)到這個(gè)要求,可以用很多種方法,這里提供一種供參考,見圖1。實(shí)際上,我們在上一次實(shí)驗(yàn)的圖中已見到過了。

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

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


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

          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全部在閃動(dòng)。因此,P10P17是全部可以點(diǎn)亮燈的。事實(shí)上,凡以P開頭的這32個(gè)引腳都是可以點(diǎn)亮燈的,也就是說:這32個(gè)引腳都可以作為輸出使用,如果不用來點(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的全體的代表,一個(gè)P1就表示了所有的這八個(gè)管腳了。當(dāng)然用的指令也不一樣了,是用MOV指令。為什么用這條指令?看圖2,我們把P1作為一個(gè)整體,就把它當(dāng)作是一個(gè)存儲(chǔ)器的單元,對一個(gè)單元送進(jìn)一個(gè)數(shù)可以用MOV指令。

          二、第四個(gè)實(shí)驗(yàn)

          除了可以作為輸出外,這32個(gè)引腳還可以做什么呢?下面再來做一個(gè)實(shí)驗(yàn),程序如下:

          MAIN: MOV P3,#0FFH

          LOOP: MOV A,P3

          MOV P1,A

          LJMP LOOP

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

          從硬件電路的連線可以看出,有四個(gè)按鈕被接入到P3口的P32,P33,P34,P35。第一條指令的用途我們可以猜到:使P3口全部為高電平。第二條指令是MOV A,P3,其中 MOV已經(jīng)見,是送數(shù)的意思,這條指令的意思就是將P3口的數(shù)送到A中去,我們可以把A當(dāng)成是一個(gè)中間單元(看圖3),第三句話是將A中的數(shù)又送到P1口去,第四句話是循環(huán),就是不斷地重復(fù)這個(gè)過程,這我們已見過。當(dāng)我們按下第一個(gè)按鈕時(shí),第(3)只燈亮了,所以P12口應(yīng)當(dāng)輸出是低電平,為什么P12口會(huì)輸出低電平呢?我們看一下有什么被送到了P1口,只有從P3口進(jìn)來的數(shù)送到A,又被送到了P1口,所以,肯定是P3口進(jìn)來的數(shù)使得P12位輸出電平的。P3口的P32位的按鈕被按下,使得P32位的電平為低,通過程序,又使P12口輸出低電平,所以P3口起來了一個(gè)輸入的作用。驗(yàn)證:按第二、三、四個(gè)按鈕,同時(shí)按下2個(gè)、3個(gè)、4個(gè)按鈕都可以得到同樣的結(jié)論,所以P3口確實(shí)起到了輸入作用,這樣,我們可以看到,以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í)候,不同的器件當(dāng)然需要不同的信號,如某一時(shí)刻我們讓這個(gè)引腳輸出高電平,并要求保持若干時(shí)間,在這段時(shí)間里,計(jì)算機(jī)當(dāng)然在忙個(gè)不停,在與其它器件進(jìn)行聯(lián)絡(luò),這根控制線上的電平未必能保持原來的值不變,輸出就會(huì)發(fā)生變化了。怎么解決這個(gè)問題呢?我們在存儲(chǔ)器一節(jié)中學(xué)過,存儲(chǔ)器中是可以存放電荷的,我們不妨也加一個(gè)小的存儲(chǔ)器的單元,并在它的前面加一個(gè)開關(guān),要讓這一位輸出時(shí),就把開關(guān)打開,信號就進(jìn)入存儲(chǔ)器的單元,然后馬上關(guān)閉開關(guān),這樣這一位的狀態(tài)就被保存下來,直到下一次命令讓它把開關(guān)再打開為止。這樣就能使這一位的狀態(tài)與別的器件無關(guān)了,這么一個(gè)小單元,我們給它一個(gè)很形象的名字,稱之為“鎖存器”。

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

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

          請注意輸入結(jié)構(gòu)圖,如果將這一根引線作為輸入口使用,我們并不能保證在任何時(shí)刻都能得到正確的結(jié)果(為什么?)參考圖2輸入示意圖。接在外部的開關(guān)如果打開,則應(yīng)當(dā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)分析(五)
          通過前面的學(xué)習(xí),我們已知單片機(jī)的內(nèi)部有ROM、有RAM、有并行I/O口,那么,除了這些東西之外,單片機(jī)內(nèi)部究竟還有些什么,這些個(gè)零碎的東西怎么連在一起的,讓我們來對單片機(jī)內(nèi)部作一個(gè)完整的分析吧!

          看圖(1)(本圖太大,請大家找本書看吧,一般講單片機(jī)的書,隨便哪本都有)。從圖中我們可以看出,在51單片機(jī)內(nèi)部有一個(gè)CPU用來運(yùn)算、控制,有四個(gè)并行I/O口,分別是P0、P1、P2、P3,有ROM,用來存放程序,有RAM,用來存放中間結(jié)果,此外還有定時(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)I/O口的鎖存器就可以了,那么對于定時(shí)/計(jì)數(shù)器,串行I/O口等怎么用呢?在單片機(jī)中有一些獨(dú)立的存儲(chǔ)單元是用來控制這些器件的,被稱之為特殊功能寄存器(SFR)。事實(shí)上,我們已接觸過P1這個(gè)特殊功能寄存器了,還有哪些呢?看表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í)器/計(jì)數(shù)器1(高8位)

          TH0 8CH 定時(shí)器/計(jì)數(shù)器1(低8位)

          TL1 8BH 定時(shí)器/計(jì)數(shù)器0(高8位)

          TL0 8AH 定時(shí)器/計(jì)數(shù)器0(低8位)

          TMOD 89A 定時(shí)器/計(jì)數(shù)器方式控制寄存器

          TCON 88H 定時(shí)器/計(jì)數(shù)器控制寄存器

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

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

          SP 81H 堆棧指針

          P0 80H P0口鎖存器

          PCON 87H 電源控制寄存器

          表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)算類指令都離不開它。


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

          3、PSW:程序狀態(tài)字。這是一個(gè)很重要的東西,里面放了CPU工作時(shí)的很多狀態(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ù)相加可能會(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:堆棧指針。

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

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

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

          其它的SFR,我們在用到時(shí)再介紹。



          關(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); })();