第二章 單片機(jī)的硬件
本章部分內(nèi)容涉及的尋址德澈、中斷等內(nèi)容缸逃,將在后續(xù)章節(jié)介紹休讳。
2.1 硬件組成
- 8位CPU脆霎,包含運(yùn)算器和控制器兩大部分。
- 數(shù)據(jù)儲存器(256B RAM)滞项,但在片外可以外擴(kuò)狭归,最多可以多外擴(kuò)64 KB。
- 程序存儲器(8KB Flash ROM)文判,片外也可以外擴(kuò)过椎,但片外最多外擴(kuò)至64 KB。即“片內(nèi)+片外”的ROM不超過64 KB戏仓。
- 4個8位并行I/O口
- 3個可編程的16位定時器/計數(shù)器
- 6個中斷源疚宇,6個中斷向量(中斷服務(wù)子程序入口地址),兩級中斷優(yōu)先權(quán)赏殃。
- SFR敷待。共有32個SFR,用于CPU對片內(nèi)各外設(shè)部件進(jìn)行管理仁热、控制和監(jiān)視榜揖。SFR映射在片內(nèi)的RAM(地址為80H-FFH)。
- 一個Watch Dog Timer
- 有在低功耗下工作的節(jié)電的空閑模式(Idle Mode)和掉電模式(Power Down Mode)
各個部件通過單片機(jī)片內(nèi)的單一總線連接而成股耽。CPU對片內(nèi)各種外設(shè)部件的控制根盒,是利用特殊功能寄存器(SFR)進(jìn)行集中控制的。
2.2 引腳功能
主要為40引腳的DIP(double in-line package)封裝物蝙。
PLCC(plastic leaded chip carrier)封裝和TQFP(thin quad flat package)封裝不常見炎滞。
DIP封裝方式的單片機(jī)有40個引腳。
這40個引腳可以分為三類
- 電源及時鐘引腳(注:XTAL 就是crystal 晶體)
- 控制引腳
- I/O 引腳 4×8 = 32 個
選取一些較為具體地講一下
- XTAL1是片內(nèi)時鐘振蕩器的反相放大器的輸入端森瘪。若單片機(jī)使用片內(nèi)時鐘,該引腳接石英晶體和微調(diào)電容票堵。若使用外部時鐘時扼睬,該引腳接外部時鐘振蕩器的輸出。
- XTAL2是片內(nèi)時鐘振蕩器的反相放大器的輸出端悴势。若單片機(jī)使用片內(nèi)時鐘時窗宇,該引腳同樣接石英晶體和微調(diào)電容措伐。若使用外部時鐘,則該引腳懸空军俊。
- RST為復(fù)位信號輸入端侥加,上面沒杠代表高電平有效。具體地說粪躬,如果給該引腳加超過兩個機(jī)器周期(24個時鐘周期)的高電平担败,則單片機(jī)復(fù)位。單片機(jī)正常工作時镰官,這個引腳的輸入應(yīng)為 ≤ 0.5 V的低電平提前。看門狗讓單片機(jī)復(fù)位的原理朋魔,就是當(dāng)看門狗的定時器溢出時岖研,看門狗定時器會向RST引腳輸出一個長達(dá)8個機(jī)器周期的高電平,所以單片機(jī)就會復(fù)位警检。
- 引腳意為地址使能(Enable Address)。這里的地址就是外部程序存儲器(ROM)的地址空間害淤,當(dāng) 的輸入為高電平時扇雕,單片機(jī)先讀片內(nèi)ROM中的代碼,再讀片外ROM中存放的代碼窥摄。當(dāng) 輸入為低電平時镶奉,就只讀取外部ROM中存儲的代碼。
- ALE意為地址鎖存使能(Address Latch Enable)崭放。它的存在哨苛,是因?yàn)閱纹瑱C(jī)的引腳數(shù)目有限,因此P0口是作為低8位地址總線和8位數(shù)據(jù)總線分時復(fù)用的币砂。當(dāng)單片機(jī)要和外界進(jìn)行數(shù)據(jù)交流時(單片機(jī)要訪問外部ROM/RAM)建峭,這時候P0口就要變成8位數(shù)據(jù)總線,在變成數(shù)據(jù)總線之前决摧,ALE會進(jìn)行一次負(fù)跳變,將P0口先發(fā)出的低8位地址鎖存到P0口外接的地址鎖存器中,完成這一操作后挠进,P0口才能夠放心大膽地去當(dāng)它的數(shù)據(jù)總線矾麻。這也是地址鎖存使能名字的由來。
- (Program Strobe ENable)波岛。Strobe意為閘門茅坛,因此這個引腳的作用就是當(dāng)單片機(jī)訪問片外ROM讀取指令碼時,這個引腳在每個機(jī)器周期會產(chǎn)生兩次有效信號(低電平信號)则拷。
2.3 CPU
單片機(jī)的CPU由運(yùn)算器和控制器組成
2.3.1 運(yùn)算器
運(yùn)算器用于對操作數(shù)進(jìn)行算術(shù)贡蓖、邏輯和位操作曹鸠。運(yùn)算器主要包括
算術(shù)邏輯運(yùn)算單元(Arithmetic Logical Unit, ALU)。ALU可以對8位(單字節(jié))的變量進(jìn)行邏輯和算術(shù)運(yùn)算摩梧,也可以對位變量進(jìn)行邏輯運(yùn)算和set物延、reset、complete等運(yùn)算仅父。
-
累加器A叛薯。CPU中使用最頻繁的8位寄存器,為32個SFR之一笙纤。作用:
- 作為ALU的輸入之一耗溜,也是ALU輸出結(jié)果的存放地。
- 數(shù)據(jù)傳送的中轉(zhuǎn)站省容。但由于累加器只有一個抖拴,如果大家都要用累加器中轉(zhuǎn)就會堵車,所以單片機(jī)增加了一部分?jǐn)?shù)據(jù)傳送指令腥椒,這使得某些數(shù)據(jù)的傳送可以不經(jīng)過累加器阿宅。累加器有一個進(jìn)位位Cy(位于PSW中),這個Cy同時也是位處理器的(位)累加器
-
程度狀態(tài)字寄存器(Program Status Word, PSW)笼蛛。顧名思義洒放,這是一個8位寄存器,而且每個位都包含了程序運(yùn)行狀態(tài)的不同信息滨砍⊥堪稱是單片機(jī)的體檢報告單。PSW的從高到低依次為
- Cy 進(jìn)位標(biāo)志位惋戏。
- Ac 輔助進(jìn)位標(biāo)志位领追。
- F0 用戶使用的標(biāo)志位。
- RS1 RS0 工作寄存器選擇控制位响逢。
- OV 溢出標(biāo)志位绒窑。
- PSW.1 保留位,無用
- P 奇偶校驗(yàn)位龄句。用以表示累加器A中 1 的個數(shù)回论。P =1 代表A中 1 的個數(shù)為奇數(shù)。
2.3.2 控制器
CPU的控制器是識別指令分歇,并根據(jù)指令性質(zhì)控制片內(nèi)各部件傀蓉,具體而言,就是對控制指令(程序)進(jìn)行讀入职抡、譯碼和執(zhí)行葬燎。控制器包含:
- 程序計數(shù)器(Program Counter, PC)。PC是一個獨(dú)立的16位計數(shù)器谱净,用戶沒辦法直接訪問PC(讀/寫)窑邦。當(dāng)單片機(jī)復(fù)位時,PC的值會變成 0000H壕探。PC的值實(shí)際上是某個程序(指令)的地址冈钦,因此PC就是程序存儲器(ROM)的地址指針,也就是程序指針李请。程序指針和程序計數(shù)器是從不同的方面描述同一個事物(PC)瞧筛,它們指的是同一個東西。PC的工作過程是這樣的:當(dāng)CPU想要讀取某條指令時导盅,CPU會將PC的值——也就是指令的地址——告知程序存儲器(ROM),然后程序存儲器就會把這個地址上的指令找出來供CPU讀取较幌,CPU讀取指令后,PC自加——這也是為什么PC名字的由來白翻。最最最重要的一點(diǎn):PC的計數(shù)寬度(16 位)乍炉,決定了單片機(jī)能夠訪問的ROM的范圍( B = 64 KB),因此程序存儲器最多只能有64 KB滤馍。
2.4 存儲器(最難)
單片機(jī)的存儲器空間可以劃分成四類
2.4.1 程序存儲器(ROM) 重要
單片機(jī)之所以可以按敵營的次序工作岛琼,就是因?yàn)镽OM中存放了調(diào)試正確的程序。單片機(jī)的地址總線有16位巢株,這意味著有共 B = 64 KB的空間可供程序指令居住衷恭。片內(nèi)ROM是8 KB的Flash存儲器,地址范圍為0000H-1FFFH纯续。片外可最大外擴(kuò)64 KB的ROM,地址范圍為0000H-FFFFH灭袁。在這里猬错,我們會看到片內(nèi)和片外ROM有一部分地址(門牌號)是相同的,但是茸歧!由于對片內(nèi)ROM和片外ROM的尋址方式是不同的倦炒,所以即使門牌號相同也不會引起誤解,系統(tǒng)根據(jù)指令软瞎,會知道到底是訪問片內(nèi)的0000H還是片外的0000H逢唤。
在ROM的使用中,需要注意兩個問題:
CPIU究竟是訪問片內(nèi)還是片外ROM涤浇,是由引腳決定的鳖藕。 當(dāng) = 0 時,片內(nèi)的ROM是沒人管的 即使里面儲存有程序代碼也沒用只锭。
-
程序存儲器(ROM)中的一個單元對應(yīng)一個字節(jié)著恩,可以存放一條單字節(jié)指令。程序存儲器的某些單元是給中斷服務(wù)子程序留的,這些位專門作為中斷服務(wù)子程序的入口地址
如上表所示喉誊,一共有6個單元是留給中斷服務(wù)子程序做入口地址的邀摆。但大家也可以看,這些入口之間彼此的空間是很狹窄的伍茄,僅有8個單元栋盹,如果我們要寫中斷服務(wù)子程序,一般來講肯定是寫不下的敷矫,除非你的中斷服務(wù)程序就一兩條指令例获,而與此同時,ROM可是有著64 KB()的空間沪饺,還有廣闊天地可以用于儲存程序躏敢。因此,通常的做法是在這些入口存放一條跳轉(zhuǎn)指令整葡,并在相應(yīng)的地方再寫上完整的中斷服務(wù)子程序件余。這樣,當(dāng)中斷觸發(fā)時遭居,CPU的PC值等于中斷服務(wù)子程序入口地址時啼器,PC就會根據(jù)相應(yīng)的指令跳向那個儲存著完整中斷子程序的地方(那個地方才能真正稱為中斷服務(wù)子程序的入口地址,前述那個倒不如說是個藏寶圖)俱萍。而且端壳,由于單片機(jī)復(fù)位后PC的值變成0000H,我們可以看到枪蘑,0000H和外部中斷0的入口地址0003H之間僅僅隔著三個單元损谦,這么狹窄的空間,主程序怎么可能寫的下呢岳颇?但三個單元的空間放個跳轉(zhuǎn)指令還是可以的照捡,所以一般在0000H單元存放一條跳轉(zhuǎn)指令,單片機(jī)一復(fù)位话侧,CPU一讀取這個跳轉(zhuǎn)指令栗精,就跳向主程序的入口地址。
2.4.2 數(shù)據(jù)存儲器(RAM) 重要
單片機(jī)的片內(nèi)RAM共有256B(256個字節(jié))瞻鹏,字節(jié)地址為00H-FFH如上圖悲立,這個就是單片機(jī)內(nèi)部RAM的結(jié)構(gòu),但是高128 B的RAM和SFR的地址時一樣的新博,如果發(fā)生要找高128 B的 RAM 薪夕,卻誤打誤撞跑去找了SFR,這可怎么辦呢叭披?這當(dāng)然是不可能的寥殖。玩讳。。它們的指令尋址方式是不同的嚼贡,CPU會自己判斷這個80H是RAM的還是SFR的熏纯。對于高128 B (80H-FFH)的 RAM,只能通過間接尋址(@)粤策,而對于相同地址的SFR樟澜,只能通過直接尋址,對于低128 B的RAM叮盘,既可以直接尋址也可以間接尋址秩贰。
同時我們會看到20H-2FH是位尋址去,這表明這個區(qū)域既可以位尋址也可以字節(jié)尋址柔吼。而30H-7FH的 RAM只能字節(jié)尋址毒费。
如果使用了片外的RAM,我們會發(fā)現(xiàn)片外的低256 B的地址和片內(nèi)這邊的低256 B的地址肯定是一樣的愈魏,但還是一樣觅玻,我們會使用不同的匯編語言指令尋址方式來訪問這兩塊數(shù)據(jù)區(qū),CPU會自己判斷某個00H究竟是片內(nèi)RAM的還是片外RAM的培漏。
2.4.3 SFR (重要)
SFR的單元地址在片內(nèi)RAM的80H-FFH中(前述溪厘,片內(nèi)RAM有兩個80H-FFH),前面提到SFR只有32個牌柄,而片內(nèi)RAM的80H-FFH是有128個字節(jié)的畸悬,所以SFR的32個地址是離散地分布在這個區(qū)域的。
千萬要注意珊佣,片內(nèi) RAM的80H-FFH蹋宦,里面是SFR的地址,不是SFRV涠汀妆档!SFR的值不在那里。
這里主要介紹的SFR有
-
堆棧指針(Stack Pointer, SP)虫碉。堆棧指針,顧名思義胸梆,SP里面存放的值就是堆棧的地址敦捧。堆棧在片內(nèi)的RAM中,而SP的值則是堆棧頂部在片內(nèi)RAM的位置碰镜。它的值可以值00H-FFH的任意一個值兢卵。堆棧要注意兩個詞——向上生長和先進(jìn)后出。單片機(jī)復(fù)位后绪颖,SP的值為07H秽荤,由于向上生長甜奄,當(dāng)?shù)谝粋€字節(jié)被壓入堆棧時,SP的值會變成08H窃款,也就是說堆棧實(shí)際上是從08H開始的课兄。而我們可以看到,片內(nèi) RAM的08H-1FH是工作寄存器的地盤晨继,堆棧設(shè)在要在用戶RAM區(qū)會好一點(diǎn)烟阐,因此通常的操作是,在單片機(jī)復(fù)位后紊扬,先把SP的值從07H改成60H或者其他大于30H的值蜒茄,以避免進(jìn)入別人的地盤。
這里在強(qiáng)調(diào)一下堆棧的作用餐屎,堆棧是為了調(diào)用子程序和有關(guān)中斷的操作而設(shè)立的檀葛,它的功能是
- 保護(hù)斷電。無論是子程序調(diào)用還是中斷服務(wù)子程序的調(diào)用腹缩,主程序的進(jìn)行都會被“打斷”屿聋。但是等子程序執(zhí)行完畢后,主程序還得從原來的地方繼續(xù)它的生活庆聘,因此要把主程序的斷點(diǎn)地址(你已經(jīng)想到了胜臊,是PC的值)壓到堆棧(PC是16位,所以要壓兩個字節(jié)到堆棧)伙判。為主程序之后做回原來的自己做準(zhǔn)備象对。
- 保護(hù)現(xiàn)場。單片機(jī)在“打斷”主程序后宴抚,要執(zhí)行子程序勒魔。而子程序的執(zhí)行,很可能要用到單片機(jī)中的一些寄存器菇曲,而寄存器原有的內(nèi)容冠绢,我們可能并不想被子程序修改。于是在執(zhí)行子程序之前常潮,有必要把這些寄存器現(xiàn)有的值保護(hù)起來弟胀,也壓到堆棧里。當(dāng)前時刻這些寄存器的值的集合喊式,反映了這個時刻單片機(jī)的狀態(tài)孵户,形象點(diǎn)來理解,就有點(diǎn)類似于“犯罪現(xiàn)場”的意思岔留,因此我們在利用子程序之前夏哭,有必要保護(hù)“現(xiàn)場”不受破壞。
寄存器B献联。乘除用竖配,好理解何址。
AUXR(AUXILIARY) 輔助寄存器。ALE和看門狗相關(guān)进胯,好理解用爪。
數(shù)據(jù)指針(DPTR0/1),便于訪問RAM龄减,不作為重點(diǎn)项钮。AUXR1輔助寄存器(也是一個SFR)和數(shù)據(jù)指針相關(guān)
看門狗(Watch Dog Timer, WDT)。單片機(jī)世界秩序的守護(hù)者希停。包含一個14位的計數(shù)器和看門狗復(fù)位寄存器(WDTRST)
2.4.4 位地址空間
位地址空間共有兩部分烁巫,分別位于片內(nèi)RAM和SFR區(qū)域中。
位地址和字節(jié)地址不同宠能,一個字節(jié)地址代表的一個單元大小是一個字節(jié)亚隙。而一個位地址代表的一個單元,大小是一個位违崇。舉個例子阿弃,位地址的范圍為00H-FFH,有219個(有些位地址無效)羞延,其中位地址 80H代表的是P0的最低位渣淳,也就是說P0最低位的位地址是80H。而位地址00H代表的是片內(nèi) RAM中20H這個單元的最低位伴箩。位地址00H-07H分別代表了片內(nèi)RAM 的20H單元的最低位到最高位入愧。
2.5 I/O 口
內(nèi)容較少,比較重要的點(diǎn)嗤谚,比如
- P0口可以作用通用的I/O口棺蛛,此時需要在各引腳的片外接上拉電阻。同時P0口也作為8位數(shù)據(jù)總線和低8位地址總線分時復(fù)用巩步。大多數(shù)情況下旁赊,單片機(jī)都要擴(kuò)展 RAM或者I/O 芯片接口,所以P0一般不作為通用I/O 口。
- P1只能當(dāng)通用I/O 口椅野。
- P2 可作為高8位地址總線终畅,也可作通用I/O口 。但一般情況下竟闪,單片機(jī)最需要它做地址總線声离。
-
P3的第一功能是通用I/O 口,第二功能
2.6 時鐘電路
前述所謂“XTAL1/2 接微調(diào)電容和石英晶體”的圖解就在這里瘫怜。
單片機(jī)執(zhí)行指令的動作,均處在CPU控制器下轄的的時序控制電路的控制下本刽,因此我們需要明確這些概念
- 時鐘周期鲸湃。單片機(jī)時鐘控制信號的基本單位赠涮。, osc 即oscillation(振蕩)之縮寫。
- 機(jī)器周期暗挑。定義:CPU完成一個基本操作所需要的時間笋除。每個機(jī)器周期為12個時鐘周期。
- 指令周期炸裆。定義:執(zhí)行一條指令所需要的時間垃它。指令分為單周期指令、雙周期指令和四周期指令(只有乘除)烹看。
2.7 復(fù)位電路 2.8 最小應(yīng)用系統(tǒng) 2.10 低功耗模式(略)
2.9 看門狗簡介
育碧的《看門狗》名字便來源與此国拇,這也是本人挺喜歡的一款游戲。
系統(tǒng)時刻需要被復(fù)位惯殊,看門狗的意義就是讓單片機(jī)在失控后可以自己復(fù)位酱吝,而不需要外部的監(jiān)視。
簡而言之土思,看門狗的思想就是用一個計數(shù)器對系統(tǒng)時鐘不斷計數(shù)务热,當(dāng)計數(shù)器溢出后看門狗就會把系統(tǒng)復(fù)位,因此如果程序運(yùn)行正常己儒,顯然需要定期喂狗——也就是把看門狗計數(shù)器定期清零崎岂,否則看門狗就會發(fā)瘋,在程序正常運(yùn)行的條件下就把系統(tǒng)復(fù)位闪湾。
課后題(略)