51單片機(jī)體系結(jié)構(gòu)初步分析
單片機(jī)有很多種,AVR、PIC、MC6805系列等,他們的體系結(jié)構(gòu)不盡相同,指令集也各異,有些是CISC,有些是RISC,51單片機(jī)的指令集采用的是CISC。
51單片機(jī)是單片機(jī)的一種,之所以這么流行,業(yè)界贊同的原因主要有兩個(gè):
第一:由于intel公司(開發(fā)了51單片機(jī))一開始就開放了授權(quán)。
第二:51單片機(jī)的體系結(jié)構(gòu)不難,資料很多(也良莠不齊),學(xué)的人很多。
51單片機(jī)和電腦聯(lián)系很大的(單片機(jī)某種程度上可以說是一臺(tái)袖珍電腦),我們知道電腦由運(yùn)算器、控制器、存儲(chǔ)器(RAM)、輸入設(shè)備和輸出設(shè)備,各個(gè)部分由總線聯(lián)接起來,聯(lián)想到實(shí)際設(shè)備我們看:
我們的電腦由一下部分組成:CPU、內(nèi)存、主板、硬盤、光驅(qū)、軟驅(qū)(已淘汰)、顯卡、顯示器、鍵盤和鼠標(biāo)。分析一下各個(gè)設(shè)備提供的功能:
CPU提供了運(yùn)算和控制功能(隨著電腦的發(fā)展和改進(jìn),獨(dú)立顯卡代替了CPU了對(duì)圖形圖像相關(guān)的數(shù)據(jù)的運(yùn)算,主板芯片代替了部分原來由CPU提供的控制功能,例如DMA,內(nèi)存控制器等)
內(nèi)存,即RAM,提供了程序運(yùn)行的空間,就是存儲(chǔ)器的功能。
主板,確切地說是主板芯片,把各個(gè)部件連接起來,即總線的功能,近年來代替CPU提供一部分控制功能。
硬盤、光驅(qū)、軟驅(qū),是保存程序的地方,幾十年前電腦可能是這樣工作的:插入可啟動(dòng)的帶有操作系統(tǒng)的軟盤(DOS、Linux等),打開電源,BIOS檢查通過后,引導(dǎo)操作系統(tǒng),進(jìn)入系統(tǒng)后,在shell下(人機(jī)對(duì)話界面,在DOS下叫DOS界面),可以使用軟盤里面保存的程序或者文件。后來硬盤和光驅(qū)代替了軟盤的程序存儲(chǔ)功能。
顯卡,確切說是獨(dú)立顯卡,代替了CPU圖形圖像相關(guān)數(shù)據(jù)的運(yùn)算。
顯示器提供了輸出功能,鍵盤和鼠標(biāo)提供了輸入功能。
51單片機(jī)有以下部分組成:
微處理器(MCU),和通用CPU類似,提供運(yùn)算和控制功能。
數(shù)據(jù)存儲(chǔ)器,和電腦的內(nèi)存類似,提供數(shù)據(jù)存儲(chǔ)功能,提供程序運(yùn)行的空間。
程序存儲(chǔ)器,和電腦的硬盤、光盤、軟盤類似,提供程序存儲(chǔ)的空間。
各個(gè)部分由總線聯(lián)系起來。
總線是什么?
一開始系統(tǒng)很簡(jiǎn)單的時(shí)候總線不是必須的,各個(gè)部件中需要通信的雙方用導(dǎo)線連接在一起,舉個(gè)例子,就像打局域網(wǎng),兩臺(tái)電腦想通信,直接用一根交叉的雙絞線連接就OK了,不用買交換機(jī),但是如果另外一臺(tái)電腦想加入,那么這臺(tái)電腦必須和這兩臺(tái)電腦各自連接一根線,第四臺(tái)電腦想進(jìn)來,那么得連接3根線,第五臺(tái)要連接4根線……第N臺(tái)要連接N-1根線,是不是很麻煩,當(dāng)然大家不會(huì)這么做,超過2臺(tái)我們就用交換機(jī)了,總線的作用和這個(gè)有點(diǎn)類似??偩€技術(shù)使得相互關(guān)系的部分通過這個(gè)公共通道連接起來,通過控制信號(hào)來區(qū)分不同組件間的通信。
總線分?jǐn)?shù)據(jù)總線(DB)、控制總線(CB)、地址總線(AB),顧名思義各自有各自的功能。
我們從51單片機(jī)的一個(gè)指令的取、譯和執(zhí)行過程來理解一下總線。假如我們現(xiàn)在要求計(jì)算2+3=?
;PC是指針,指向程序存儲(chǔ)器的某個(gè)位置。PC指向的當(dāng)前地址就是正在或即將執(zhí)行的指令
;假設(shè)此時(shí)PC=2000H
MOV A,#02H;PC=2000H
ADD A,#03H;PC=2002H
通電后,PC值為0000H,隨著前面指令的取、譯和執(zhí)行,PC值一直改變,當(dāng)PC值為2000H時(shí),MCU通過AB找到要執(zhí)行指令的位置,通過內(nèi)部DB從程序存儲(chǔ)器取的操作碼(指令由操作碼和操作數(shù)組成)是74H(是MOV匯編后的機(jī)器碼),同時(shí)PC=PC+1=2001H,通過譯碼,發(fā)現(xiàn)操作碼的意思是將后面的一個(gè)字節(jié)作為操作數(shù)送進(jìn)累加器A,MCU通過CB發(fā)出控制信號(hào),把程序存儲(chǔ)器的下一個(gè)字節(jié)通過內(nèi)部DB送進(jìn)累加器A,同時(shí)PC=PC+1=2002H,第一個(gè)指令執(zhí)行完畢。
另外一條指令類似,通過對(duì)操作碼的譯碼,發(fā)現(xiàn)操作碼的意思是將后面一個(gè)字節(jié)作為操作數(shù)與累加器A中的內(nèi)容相加,輸出結(jié)果放進(jìn)累加器A。于是發(fā)出控制信號(hào),把程序存儲(chǔ)器下一個(gè)字節(jié)通過內(nèi)部DB送到暫存器,通過MCU進(jìn)行計(jì)算,得出的結(jié)果放進(jìn)累加器A。執(zhí)行完P(guān)C=2004H。
總線有一定的寬度,所以我們有8位機(jī)、16位機(jī)、32位等等??偩€越寬,每次取數(shù)據(jù)越多,8位寬度每次只能取1個(gè)字節(jié),16位是2個(gè)字節(jié),越寬每次取越多,同樣時(shí)間內(nèi)執(zhí)行的指令越多,所以,總線寬度是衡量MCU運(yùn)算能力的重要指標(biāo)。51單片機(jī)的AB寬度是16位,DB寬度是8位,CB寬度是8位,因?yàn)檫\(yùn)算能力主要和DB寬度有關(guān),所以我們以DB寬度來區(qū)分不同的MCU。