單片機(jī)初學(xué)者的常見問題
第二步:把第二個(gè)數(shù)從它所在的存貯單元中取出來,送至運(yùn)算器;
第三步:相加;
第四步:把相加完的結(jié)果,送至存貯器中指定的單元。
所有這些取數(shù)、送數(shù)、相加、存數(shù)等等都是一種操作(operation),我們把要求計(jì)算機(jī)執(zhí)行的各種操作用命令的形式寫下來,這就是指令。但是怎樣才能辨別和執(zhí)行這些操作呢?這是在設(shè)計(jì)單片機(jī)時(shí)由設(shè)計(jì)人員賦予它的指令系統(tǒng)所決定的。一條指令,對(duì)應(yīng)著一種基本操作;單片機(jī)所能執(zhí)行的全部指令,就是該單片機(jī)的指令系統(tǒng)(iustruction set),不同種類的單片機(jī),其指令系統(tǒng)亦不同。
使用單片機(jī)時(shí),事先應(yīng)當(dāng)把要解決的問題編成一系列指令。這些指令必須是選定的單片機(jī)能識(shí)別和執(zhí)行的指令。單片機(jī)用戶為解決自己的問題所編的指令程序,稱為源程序(source program)。指令通常分為操作碼(opcode)和操作數(shù)(operand)兩大部分。操作碼表示計(jì)算機(jī)執(zhí)行什么操作,即指令的功能;操作數(shù)表示參加操作的數(shù)或操作數(shù)所在的地址(即操作數(shù)所存放的地方編號(hào))。因?yàn)閱纹瑱C(jī)是一種可編程器件,只“認(rèn)得”二進(jìn)碼(0、1)。要單片機(jī)運(yùn)作,單片機(jī)系統(tǒng)中的所有指令,都必須以二進(jìn)制編碼的形式來表示。例如,在intel公司的mcs-51系列單片機(jī)中,從存貯器中取出一數(shù)到cpu中的累加器(在運(yùn)算器中,參與運(yùn)算、存放運(yùn)算結(jié)果的專用寄存器)的指令代碼為74h,累加器內(nèi)容加立即數(shù)的代碼為24h,再加上立即數(shù)代碼,累加器送數(shù)到內(nèi)部ram存貯器的代碼為f6h~f7h等。這些指令是用十六進(jìn)制表示二進(jìn)制的機(jī)器碼。mcs-51單片機(jī)的字長為8位,有時(shí),要完成某些操作用一個(gè)字節(jié)尚不能充分表達(dá)。所以,在指令系統(tǒng)中有單字節(jié)指令,也有多字節(jié)指令。機(jī)器碼是由一連串的0和1組成,沒有明顯的特征,不好記憶,不易理解,易出錯(cuò)。所以,直接用它來編寫程序十分困難。因而,人們就用一些助記符(mue monic)——通常是指令功能的英文縮寫來代替操作碼,如mcs-51中數(shù)的傳送常用mov(move的縮寫)、加法用add(addition的縮寫)來作為助記符。這樣,每條指令有明顯的動(dòng)作特征,易于記憶和理解,也不容易出錯(cuò)。用助記符來編寫的程序稱為匯編語言程序。但是,助記符編寫的程序便于人理解,可單片機(jī)卻只認(rèn)識(shí)二進(jìn)制機(jī)器代碼,因此,為了讓單片機(jī)能“讀懂”匯編語言程序必須再轉(zhuǎn)換成由二進(jìn)制機(jī)器碼構(gòu)成的程序,這種轉(zhuǎn)換過程,就稱為“匯編”。匯編可借助于人工查表法來實(shí)現(xiàn),也可借助pc機(jī)通過所謂“交叉匯編程序”來完成。由機(jī)器碼構(gòu)成的用戶程序一旦“進(jìn)入”了單片機(jī),再“啟動(dòng)”單片機(jī),就可讓它執(zhí)行輸入程序所規(guī)定的任務(wù)。
mcs-51的cpu和存儲(chǔ)器
cpu結(jié)構(gòu)
單片機(jī)8051的cpu由運(yùn)算器和控制器組成。
一、運(yùn)算器
運(yùn)算器以完成二進(jìn)制的算術(shù)/邏輯運(yùn)算部件alu為核心,再加上暫存器tmp、累加器acc、寄存器b、程序狀態(tài)標(biāo)志寄存器psw及布爾處理器。累加器acc是一個(gè)八位寄存器,它是cpu中工作最頻繁的寄存器。在進(jìn)行算術(shù)、邏輯運(yùn)算時(shí),累加器acc往往在運(yùn)算前暫存一個(gè)操作數(shù)(如被加數(shù)),而運(yùn)算后又保存其結(jié)果(如代數(shù)和)。寄存器b主要用于乘法和除法操作。標(biāo)志寄存器psw也是一個(gè)八位寄存器,用來存放運(yùn)算結(jié)果的一些特征,如有無進(jìn)位、借位等。其每位的具體含意如下所示。psw
cy ac fo rs1 rs0 ov - p對(duì)用戶來講,最關(guān)心的是以下四位。
1進(jìn)位標(biāo)志cy(psw7)。它表示了運(yùn)算是否有進(jìn)位(或借位)。如果操作結(jié)果在最高位有進(jìn)位(加法)或者借位(減法),則該位為1,否則為0。
2輔助進(jìn)位標(biāo)志ac。又稱半進(jìn)位標(biāo)志,它反映了兩個(gè)八位數(shù)運(yùn)算低四位是否有半進(jìn)位,即低四位相加(或減)有否進(jìn)位(或借位),如有則ac為1狀態(tài),否則為0。
3溢出標(biāo)志位ov。mcs-51反映帶符號(hào)數(shù)的運(yùn)算結(jié)果是否有溢出,有溢出時(shí),此位為1,否則為0。
4奇偶標(biāo)志p。反映累加器acc內(nèi)容的奇偶性,如果acc中的運(yùn)算結(jié)果有偶數(shù)個(gè)1(如11001100b,其中有4個(gè)1),則p為0,否則,p=1。
psw的其它位,將在以后再介紹。由于psw存放程序執(zhí)行中的狀態(tài),故又叫程序狀態(tài)字?運(yùn)算器中還有一個(gè)按位(bit)進(jìn)行邏輯運(yùn)算的邏輯處理機(jī)(又稱布爾處理機(jī))。其功能在介紹位指令時(shí)再說明。
二、控制器
控制器是cpu的神經(jīng)中樞,它包括定時(shí)控制邏輯電路、指令寄存器、譯碼器、地址指針dptr及程序計(jì)數(shù)器pc、堆棧指針sp等。這里程序計(jì)數(shù)器pc是由16位寄存器構(gòu)成的計(jì)數(shù)器。要單片機(jī)執(zhí)行一個(gè)程序,就必須把該程序按順序預(yù)先裝入存儲(chǔ)器rom的某個(gè)區(qū)域。單片機(jī)動(dòng)作時(shí)應(yīng)按順序一條條取出指令來加以執(zhí)行。因此,必須有一個(gè)電路能找出指令所在的單元地址,該電路就是程序計(jì)數(shù)器pc。當(dāng)單片機(jī)開始執(zhí)行程序時(shí),給pc裝入第一條指令所在地址,它每取出一條指令(如為多字節(jié)指令,則每取出一個(gè)指令字節(jié)),pc的內(nèi)容就自動(dòng)加1,以指向下一條指令的地址,使指令能順序執(zhí)行。只有當(dāng)程序遇到轉(zhuǎn)移指令、子程序調(diào)用指令,或遇到中斷時(shí)(后面將介紹),pc才轉(zhuǎn)到所需要的地方去。8051
cpu碢c指定的地址,從rom相應(yīng)單元中取出指令字節(jié)放在指令寄存器中寄存,然后,指令寄存器中的指令代碼被譯碼器譯成各種形式的控制信號(hào),這些信號(hào)與單片機(jī)時(shí)鐘振蕩器產(chǎn)生的時(shí)鐘脈沖在定時(shí)與控制電路中相結(jié)合,形成按一定時(shí)間節(jié)拍變化的電平和時(shí)鐘,即所謂控制信息,在cpu內(nèi)部協(xié)調(diào)寄存器之間的數(shù)據(jù)傳輸、運(yùn)算等操作。
三、存儲(chǔ)器
存儲(chǔ)器是單片機(jī)的又一個(gè)重要組成部分,其中每個(gè)存儲(chǔ)單元對(duì)應(yīng)一個(gè)地址,256個(gè)單元共有256個(gè)地址,用兩位16進(jìn)制數(shù)表示,即存儲(chǔ)器的地址(00h~ffh)。存儲(chǔ)器中每個(gè)存儲(chǔ)單元可存放一個(gè)八位二進(jìn)制信息,通常用兩位16進(jìn)制數(shù)來表示,這就是存儲(chǔ)器的內(nèi)容。存儲(chǔ)器的存儲(chǔ)單元地址和存儲(chǔ)單元的內(nèi)容是不同的兩個(gè)概念,不能混淆。
1、程序存儲(chǔ)器
程序是控制計(jì)算機(jī)動(dòng)作的一系列命令,單片機(jī)只認(rèn)識(shí)由“0”和“1”代碼構(gòu)成的機(jī)器指令。如前述用助記符編寫的命令mov a,#20h,換成機(jī)器認(rèn)識(shí)的代碼74h、20h:(寫成二進(jìn)制就是01110100b和00100000b)。在單片機(jī)處理問題之前必須事先將編好的程序、表格、常數(shù)匯編成機(jī)器代碼后存入單片機(jī)的存儲(chǔ)器中,該存儲(chǔ)器稱為程序存儲(chǔ)器。程序存儲(chǔ)器可以放在片內(nèi)或片外,亦可片內(nèi)片外同時(shí)設(shè)置。由于pc程序計(jì)數(shù)器為16位,使得程序存儲(chǔ)器可用16位二進(jìn)制地址,因此,內(nèi)外存儲(chǔ)器的地址最大可從0000h到ffffh。8051內(nèi)部有4k字節(jié)的rom,就占用了由0000h~0fffh的最低4k個(gè)字節(jié),這時(shí)片外擴(kuò)充的程序存儲(chǔ)器地址編號(hào)應(yīng)由1000h開始,如果將8051當(dāng)做8031使用,不想利用片內(nèi)4krom,全用片外存儲(chǔ)器,則地址編號(hào)仍可由0000h開始。不過,這時(shí)應(yīng)使8051的第{31}腳(即ea腳)保持低電平。當(dāng)ea為高電平時(shí),用戶在0000h至0fffh范圍內(nèi)使用內(nèi)部rom,大于0fffh后,單片機(jī)cpu自動(dòng)訪問外部程序存儲(chǔ)器。
評(píng)論