一、 硬件結(jié)構(gòu)
1 內(nèi)部結(jié)構(gòu)
AT89C51單片機的內(nèi)部結(jié)構(gòu)與MCS-51系列中的MCS-8051的內(nèi)部結(jié)構(gòu)基本相同,。由圖1可知,,AT89C51單片機主要由CPU、片內(nèi)RAM,、片內(nèi)ROM及4個標(biāo)準(zhǔn)輸入輸出I/O口等組成,。片內(nèi)4KB ROM為程序存儲器,這里面主要存放指揮CPU進行操作的指令代碼,。4KB ROM共有4096個存儲單元,,每個單元可存放一個字節(jié)共8位二進制數(shù)字。程序存儲器中的每個單元都有一個確定的地址,,4K空間地址范圍為0000H至0FFFH,。128B RAM為128個字節(jié)的可讀寫數(shù)據(jù)存儲器,主要放置需頻繁處理的數(shù)據(jù),。其地址空間為00H至7FH,,其中00H至07H這8個單元是一組工作寄存器,由于對它們的操作另有專用指令,,所以將這幾個單元又分別記作R0,、R1、R2,、R3,、R4、R5,、R6,、R7。4個標(biāo)準(zhǔn)輸入輸出I/O口P0,、P1、P2,、P3與CPU內(nèi)部的一些特殊功能寄存器,,如定時器控制寄存器(TCON)、串行口控制寄存器(SCON)等是統(tǒng)一編址的。這些存儲器離散地分布在80H至FFH地址空間內(nèi),。其中P0,、P1、P2,、P3的地址分別是80H,、90H、A0H和B0H,。有了確定的地址,,才能準(zhǔn)確無誤地對它們進行操作。比如我們要向P0口送一個數(shù),,只要用一個送數(shù)指令,,將數(shù)“寫”到80H這個存儲單元就完成了。也就是說把要送的數(shù)存到P0口鎖存器之中,,再通過驅(qū)動器,,就可將數(shù)據(jù)各位代表的高低電位輸出到P0.0至P0.7的這8條口線引腳上了。
2 引腳功能
單片機具備了CPU,、程序存儲器,、數(shù)據(jù)存儲器和輸入輸出口等硬件資源之后,還需要供電電源,、時鐘觸發(fā)和復(fù)位等控制的支持才能正常工作,。而這些輸入都是通過引腳與單片機連接的。圖2是單片機AT89C51的引腳排布圖,。由圖2可知,,AT89C51是標(biāo)準(zhǔn)的40線雙列直插式封裝(也有其它封裝形式)的集成電路,其引腳與MCS-51系列單片機完全兼容,。這40條引腳大致可分為電源(Vcc,、Vss、VPP,、VPD),、時鐘(XTAL1、XTAL2),、專用控制線(ALE,、RST、PROG,、PSEN,、EA)、通用多功能輸入輸出標(biāo)準(zhǔn)I/O口(P0~P3)等4大部分,。該單片機有6條引腳是保證基本工作所必須連接的:40腳Vcc和20腳Vss 為整個芯片提供電源,;18腳、19腳是時鐘振蕩引腳,它們的內(nèi)部連接一個高增益放大器,,外部接一晶振選頻產(chǎn)生振蕩脈沖,,并可配接一些電容、電感使振蕩更精確,。此振蕩脈沖,,為整個CPU及其定時等有效操作系統(tǒng)提供時鐘。另外兩條引腳是EA和RST,。31腳EA是程序存儲器片內(nèi)片外選擇腳,,如果EA接低電位,CPU不從片內(nèi)ROM中取指,;EA接高電位,,CPU先從片內(nèi)程序存儲器取指。第9腳RST的主要功能是使單片機復(fù)位,。當(dāng)單片機接通以上5腳后,,只要在第9腳上加一個寬度不小于24個振蕩周期,也就是2個機器周期的正脈沖,,它就能使系統(tǒng)復(fù)位,。系統(tǒng)復(fù)位就是意味著CPU里各種寄存器等功能部分有一種標(biāo)準(zhǔn)的、固定的狀態(tài),,這樣有利于系統(tǒng)設(shè)計,。比如系統(tǒng)復(fù)位后,能使P0口至P3口的數(shù)據(jù)為FFH,,也就是各口線皆呈高電位,,不然就會出現(xiàn)每通一次電,系統(tǒng)就呈現(xiàn)一種不同的狀態(tài),,給負(fù)載電路的設(shè)計帶來困難,。系統(tǒng)復(fù)位后,還能使程序地址寄存器PC的值為0000H,,這就保證系統(tǒng)從程序存儲空間的0000H單元取指,,使程序有個起始,保證系統(tǒng)能有條不紊地運行,。因此,,程序存儲器從第一單元開始一般放一條無條件跳轉(zhuǎn)指令,指出主程序的入口,,引導(dǎo)系統(tǒng)進入主程序運行,。
3 I/O口的介紹
在圖2中,還有P0~P3引腳,。這些引腳可以將單片機輸出的高低電位信號傳送給片外的負(fù)載,,也可將片外其它設(shè)備輸出的高低電位號輸入至單片機,,因此,在單片機中,,這些引腳就叫做輸入輸出端口,簡稱I/O口,。一個標(biāo)準(zhǔn)的I/O口一般由8條I/O口線組成,。標(biāo)準(zhǔn)I/O口的主要功能相當(dāng)于一個8位鎖存器,能存儲一個字節(jié)的二進制數(shù)據(jù),,以保持與之相連接的8條口線各自電位的高低狀態(tài),。在圖2中,AT89051的第1腳至第8腳相對應(yīng)的8條口線P1.0至P1.7組成的標(biāo)準(zhǔn)口記作P1口,,第10腳至第17腳相對應(yīng)的口線P3.0至P3.7組成的P3口,,第21腳至28腳相對應(yīng)的8條口線P2.0至P2.7組成了P2口,第32腳至39腳相對應(yīng)的8條口線P0.0至P0.7組成了P0口,。有了這些標(biāo)準(zhǔn)輸入輸出口,,使用起來就很方便了。這樣,,我們可編制一段程序,,向這些標(biāo)準(zhǔn)口中存入一定的數(shù)據(jù)(這些數(shù)據(jù)也可叫控制字),各口線引腳就會呈現(xiàn)出不同的高低電位,。比如我們向P0,、P1、P2,、P3口中送入數(shù)據(jù)#00H,,則每個口的各口線電位狀態(tài)就會為“0000 0000”,也就是各條口線皆呈低電位,。我們再向P0口送入數(shù)據(jù)#03H,。P0.0至P0.7各條口線所呈電位為“0000 0011”,也就是只有P0.0和P0.1兩條口線所對應(yīng)的引腳呈高電位,。另外,,還應(yīng)知道,P0口的P0.0~P0.7的位地址是80H至87H,,P1口的P1.0至P1.7的位地址是90H至97H,,P2.0至P2.7和P3.0至P3.7的位地址分別是A0H至A7H和B0H至B7H。
4 I/O口結(jié)構(gòu)
AT89C51單片機或其它與之兼容的單片機,,作為初學(xué)者還必須掌握它的I/O口結(jié)構(gòu)和電流負(fù)載能力,。比如AT89C2051口線負(fù)載能力達(dá)25mA,AT89C51可達(dá)15mA等等。下面以P1.0口線為例,,談一下I/O口結(jié)構(gòu),,圖3為P1.0口線的內(nèi)部驅(qū)動器電原理圖,。由圖可知,驅(qū)動器的輸入端是和鎖存器的Q相連接的,,驅(qū)動器的輸出部分由4只場效應(yīng)管組成,,N型管VT4為下拉管,P型的VT1,、VT2,、VT3為上拉管。依次為強上拉,、弱上拉和中上拉,。當(dāng)我們向P1.0位寫“1”時,Q呈低電位,,于是,,VT4截止,VT1,、VT2,、VT3導(dǎo)通。其中VT1導(dǎo)通過程稍復(fù)雜一些,,圖3中VT1的柵極與Q之間接有一個延時器件F1,,此延時器件的導(dǎo)通態(tài)維持時間是2個振蕩周期。也就是說,,當(dāng)Q為低電位時,,延時器F1導(dǎo)通,VT1也迅速導(dǎo)通,,經(jīng)過兩個振蕩周期以后,,延時電路處于開路狀態(tài),于是VT1截止,。所以,,VT1只是在CPU向P1.0寫“1”后很短的時間內(nèi)導(dǎo)通,以較強的電流拉動能力將P1.0引腳的電位拉起,。經(jīng)過2個振蕩周期以后,,VT1截止,只有VT2和VT3導(dǎo)通,。如果此時P1.0引腳的負(fù)載不是嚴(yán)重超載,,P1.0引腳的電位會高于2.1V,此電位高于非門F3的門限電壓,,F(xiàn)3的輸出端為低電位,,與之相接的VT3的柵極亦為低電位,VT3導(dǎo)通,,提供中度的上拉電流,,使P1.0輸出的電流達(dá)到額定值,;如果P1.0引腳嚴(yán)重超載,比如被SB1對地短路,,P1.0引腳的輸出電位將很低,,幾乎為零,此電位低于非門F3的門限電壓,,F(xiàn)3的輸出端為高電位,,VT3截止,只有VT2提供微安級的弱上拉電流,。而當(dāng)SB1釋放后VT3又重新導(dǎo)通,P1.0引腳的電位和上拉負(fù)載能力均恢復(fù),。單片機標(biāo)準(zhǔn)口的這種結(jié)構(gòu),,既安全,又可靠,。由上述我們不難得出這樣的結(jié)論:這些口線不論在什么狀態(tài)下都不怕對地短路,,但絕不能直接與Vcc相接。因為當(dāng)口線處于低電位時,,VT4導(dǎo)通,,如果此時口線直接與Vcc相連接,VT4就可能被燒壞,。許多開發(fā)者曾用此方法將某些口線燒壞來實現(xiàn)加密,。當(dāng)然這樣是以犧牲單片機的口資源為代價的。
二,、 CPU的工作過程
CPU盡管結(jié)構(gòu)復(fù)雜,,靠程序的支持來實現(xiàn)其強大的功能,但在運行程序中執(zhí)行每條指令的過程卻是非常簡單的,,就是不斷地從程序存儲器中取出程序代碼,,按照代碼所代表的含義去完成一種單一的操作。上述程序存儲器的這4096個存儲單元,,就好像4096個小抽屜,,而程序代碼就好像放在小抽屜里的工作說明。CPU就像是一個只能依照抽屜里的說明,,而且是每次只能完成一條說明的識讀來依次完成簡單操作的弱智人一樣,。這個人開始時一定會先打開第1個抽屜,如果第1個抽屜里的紙條上寫著“請到第2個和第3個抽屜里的紙條上所標(biāo)明的抽屜里去找指定的工作做”,,他就會打開第2個和第3個抽屜取出紙條來準(zhǔn)確地識讀,,確認(rèn)第3個抽屜的號碼。如果這兩張紙條上分別寫著“10”和“08”,,他就會打開第1008個抽屜取出紙條去完成操作,。此過程就相當(dāng)于CPU執(zhí)行了一條無條件轉(zhuǎn)移指令,,一下子從程序的開始,跳到了第1008個單元去運行主程序,。如果第1008個抽屜中的這張紙條上寫著:“把第18#黑板上的會議通知中的時間由下午2點改成下午3點,,”這個人就會將第18#黑板上的2擦掉改成3。這18#黑板就好像RAM的第18單元,,此次操作相當(dāng)于CPU執(zhí)行了一條送數(shù)指令,。前述向各I/O口送數(shù)的過程亦如此。
單片機只是一個可以讀懂人給予它的命令并能按照這種命令去完成某種操作的高級電路而已,,由它構(gòu)成的各種智能系統(tǒng)的智力在程序中,,完成操作的能力在執(zhí)行設(shè)備中。而程序必須由人來編制,。所以,,我們學(xué)習(xí)單片機,要在認(rèn)識它的結(jié)構(gòu)和功能的基礎(chǔ)上學(xué)會編程,,能夠設(shè)計出各種系統(tǒng)的硬件和軟件才行,。結(jié)合機器碼學(xué)習(xí)程序便于深刻理解,特別適合于愛好電路制作的電子愛好者,,能學(xué)到真功夫,。但機器碼不容易記憶,在編較長的程序時,,會遇到許多不便,。所以,當(dāng)你能熟練地使用一些高級開發(fā)設(shè)備時,,還必須掌握匯編語言,。▲