PIC16F877A單片機(jī)的基本功能模塊
PIC16F877A單片機(jī)是MicroChip公司的中檔產(chǎn)品,它采用14位的RISC指令系統(tǒng),內(nèi)部集成了A/D轉(zhuǎn)換器、EEPROM、模擬比較器、帶比較和捕捉功能的定時(shí)器/計(jì)數(shù)器、PWM輸出,異步串行通信( USART)電路等。
1).程序存儲(chǔ)器和堆棧PIC16F877A單片機(jī)內(nèi)部具有8K×14位的Flash程序存儲(chǔ)器,程序存儲(chǔ)器具有13位寬的程序計(jì)數(shù)器PCo程序存儲(chǔ)器的地址范圍為OOOOH—1FFFH。由程序計(jì)數(shù)器提供13條地址線進(jìn)行單元選擇,每個(gè)單元寬14位(即PIC16F877A的指令字節(jié)寬度為14位),能夠存放一條PIC單片機(jī)系統(tǒng)指令。
在系統(tǒng)上電或其他復(fù)位情況下,程序計(jì)數(shù)器均從OOOOH地址單元開始工作。如果遇到調(diào)用子程序或系統(tǒng)發(fā)生事件中斷時(shí),將把當(dāng)前程序斷點(diǎn)處的地址送入8級(jí)×14位的堆棧區(qū)域進(jìn)行保護(hù)。堆棧是一個(gè)獨(dú)立的存儲(chǔ)區(qū)域,在調(diào)用的子程序或中斷服務(wù)程序執(zhí)行完后,再恢復(fù)斷點(diǎn)地址。通過(guò)14位程序總線,取出對(duì)應(yīng)程序指令的機(jī)器碼,送入指令寄存器,將組成的操作碼和操作數(shù)進(jìn)行有效分離。如果操作數(shù)為地址,則進(jìn)入地址復(fù)用器;如果操作數(shù)為數(shù)據(jù),則進(jìn)入數(shù)據(jù)復(fù)用器。而操作碼將在指令譯碼和控制單元中轉(zhuǎn)化為相應(yīng)的功能操作。
PIC的多數(shù)指令均是順序執(zhí)行,即使條件跳轉(zhuǎn)也是隔行間接跳轉(zhuǎn)。具有大范圍轉(zhuǎn)移功能的指令只有兩條:無(wú)條件轉(zhuǎn)移GOTO語(yǔ)句和調(diào)用子程序CALL語(yǔ)句。但它們受到2KB范圍的約束。所以必須將整個(gè)程序存儲(chǔ)器以2KB為單位進(jìn)行分頁(yè)。如下圖所示,8KB程序存儲(chǔ)器共分作4頁(yè),分別稱為頁(yè)0、頁(yè)1、頁(yè)2和頁(yè)3。
PIC16F877A單片機(jī)的上電復(fù)位地址是OOOOH,中斷入口地址是0004H,中斷產(chǎn)生時(shí)PC指針會(huì)自動(dòng)指向該地址。在進(jìn)行中斷應(yīng)用時(shí),特別是涉及多個(gè)中斷同時(shí)打開時(shí),必須要逐個(gè)對(duì)中斷標(biāo)志位( XXIF)進(jìn)行判斷。編程時(shí),在0000H~0003H單元內(nèi)要放置一條GOTO跳轉(zhuǎn)指令,跳轉(zhuǎn)到主程序,以避開0004H存儲(chǔ)器單元。
2).?dāng)?shù)據(jù)存儲(chǔ)器PIC單片機(jī)的數(shù)據(jù)存儲(chǔ)器與傳統(tǒng)的MCS-51單片機(jī)一樣,在配置結(jié)構(gòu)上可分為通用寄存器和特殊功能寄存器兩大類。數(shù)據(jù)存儲(chǔ)器的每個(gè)存儲(chǔ)單元除具備普通存儲(chǔ)器功能之外,還能實(shí)現(xiàn)移位、置位、復(fù)位和位測(cè)試等通常只有寄存器才能完成的操作,功能非常強(qiáng)大。PIC16F877A單片機(jī)RAM數(shù)據(jù)存儲(chǔ)器與程序存儲(chǔ)器一樣,在其51 2個(gè)地址空間( 000H—1FFH)進(jìn)行類似區(qū)域劃分,分為4個(gè)體( Bank),從左到右分別記為體0、體1、體2和體3,每個(gè)“體”均為128×8位寬的存儲(chǔ)單元。特殊功能寄存器安排在低位地址存儲(chǔ)單元,通用寄存器在高位地址存儲(chǔ)單元。下圖是PIC16F877A的寄存器組映射圖,對(duì)通用寄存器可以直接進(jìn)行訪問(wèn),也可以通過(guò)寄存器FSR間接訪問(wèn)。
通過(guò)比較可知,程序存儲(chǔ)器的4等分區(qū)域采用串接方式排列,而數(shù)據(jù)存儲(chǔ)器的4等分區(qū)域采用并接方式排列。
通用寄存器PIC16F877A單片機(jī)的通用寄存器扮演了其他單片機(jī)中的通用寄存器和片內(nèi)RAM存儲(chǔ)器的雙重角色。
PIC16F877A單片機(jī)的通用寄存器主要分布在數(shù)據(jù)存儲(chǔ)器RAM各體的下半部分區(qū)域,包括體O和體I區(qū)域各有96個(gè)單元(20H—7FH和AOH—FFH)及體2和體3區(qū)域各有1 12個(gè)單元(110H—17FH和190H~1FFH)。在體1、體2和體3的數(shù)據(jù)存儲(chǔ)器RAM體內(nèi),分別存在一個(gè)映射的地址區(qū)域:FOH—FFH、170H—17FH和1FOH—1FFH。這些單元都是虛擬設(shè)計(jì),本身的硬件結(jié)構(gòu)并不存在,但它們的地址信息都可以索引(或映射)到體O中的高地址(70H—7FH)處的16個(gè)RAM單元。正是基于這樣的數(shù)據(jù)存儲(chǔ)器結(jié)構(gòu),實(shí)際的通用寄存器單元數(shù)為368個(gè)。
特殊功能寄存器特殊功能寄存器SFR主要分布在數(shù)據(jù)存儲(chǔ)器RAM各體的上半部分區(qū)域。PIC16F87X系列單片機(jī)的特殊功能寄存器的布局保持了高度一致,目的是便于PIC單片機(jī)之間的相互兼容和調(diào)換。
特殊功能寄存器中,有的專門用于控制CPU內(nèi)核的性能配置,有的專門用于控制各種外圍設(shè)備模塊的操作,因此又可依用途分為兩類:一類是與CPU內(nèi)核相關(guān)的寄存器,另一類是與外圍模塊相關(guān)的寄存器。在此我們僅介紹與CPU內(nèi)核相關(guān)的幾個(gè)常用特殊功能寄存器,其余的則到講解各種功能部件和外圍模塊時(shí)再介紹。
(1).狀態(tài)寄存器STATUS
狀態(tài)寄存器的內(nèi)容用來(lái)記錄算術(shù)邏輯單元ALU的運(yùn)算狀態(tài)和算術(shù)特征、CPU的特殊運(yùn)行狀態(tài)、以及RAM數(shù)據(jù)存儲(chǔ)器的體間選擇等信息。狀態(tài)寄存器與通用寄存器有著本質(zhì)的區(qū)別,例如功能位/TO和/PD只能讀;另一些位的狀態(tài)將取決于運(yùn)算結(jié)果。
狀態(tài)寄存器STATAS(地址03H、83H、103H、183H):
注意:對(duì)于借位,極性相反,執(zhí)行減法指令時(shí),是通過(guò)加上第二操作數(shù)的補(bǔ)碼實(shí)現(xiàn)的;對(duì)于移位指令( RRF、RLF),是把源寄存器的最高位或最低位放入進(jìn)位位C實(shí)現(xiàn)的。
(2).選擇寄存器OPTION 選擇寄存器OPTION是一個(gè)可讀/寫寄存器,它含有用于設(shè)置定時(shí)器TMRO前分頻器/監(jiān)視定時(shí)器WDT后分頻器、外部INT中斷、TMRO和B口的弱上拉等各種控制位。
注意:如果需要定時(shí)器TMRO得到1:1的前分頻值,可以把前分頻器分配給監(jiān)視定時(shí)器WDT(即PSA=1)。
Bit2—Bit0( PS2—PSO)前分頻器倍率選擇位。
注意:當(dāng)使用低電壓編程LVP并且PORTB引腳弱上拉使能時(shí),TRISB的Bit3清O以關(guān)閉RB3的弱上拉才能確保芯片的正確運(yùn)行。
(3).間接尋址寄存器INDF和文件選擇寄存器FSR
間接尋址寄存器INDF位于數(shù)據(jù)存儲(chǔ)器各體的最低位單元,即OOH、80H、100H和180Ho它們是互相映射,只具有地址編碼,但物理上并不真正存在的虛擬寄存器。INDF必須與文件選擇寄存器FSR配合,才能實(shí)現(xiàn)間接尋址。當(dāng)訪問(wèn)INDF地址時(shí),實(shí)際是訪問(wèn)以FSR內(nèi)容為地址所指向的數(shù)據(jù)存儲(chǔ)器RAM單元。PIC系列單片機(jī)采用這種獨(dú)特而巧妙的構(gòu)想,實(shí)現(xiàn)對(duì)數(shù)據(jù)存儲(chǔ)器的循環(huán)訪問(wèn),也使PIC指令集系統(tǒng)得到很大的精簡(jiǎn)。
在PIC單片機(jī)指令系統(tǒng)中,直接尋址和間接尋址是很重要的數(shù)據(jù)訪問(wèn)方式,主要是借助于狀態(tài)寄存器相關(guān)位的補(bǔ)充實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)器的選擇。直接尋址/間接尋址方式示意圖如上圖所示。在直接尋址中,體選碼來(lái)自狀態(tài)寄存器STATUS的RP1和RPO位,體內(nèi)的單元地址直接來(lái)自指令機(jī)器碼;而在間接尋址中,體選碼由STATUS的IRP位和FSR寄存器的Bit7組成,體內(nèi)單元地址來(lái)自FSR的低7位。
(4).與PC相關(guān)的寄存器PCL和PCLATH
PIC16F877A單片機(jī)程序計(jì)數(shù)器PC指針寬13位,它總是指向CPU下一條指令所在程序存儲(chǔ)器單元的地址。為了與其它8位寬的寄存器進(jìn)行數(shù)據(jù)交換,將PC指針分成PCL和PCH兩部分:低8位PCL有自己的專用地址,數(shù)據(jù)信息可讀寫:而高5位PCH沒有自己的地址,是根本不存在的,也就不能直接寫入,只能借用寄存器PCLATH進(jìn)行間接裝載。PCLATH實(shí)現(xiàn)對(duì)高5位PCH的裝載分兩種情況:一種情況是當(dāng)執(zhí)行以PCL為目標(biāo)的寫操作指令時(shí),PC的低8位來(lái)自算術(shù)邏輯單元ALU的運(yùn)算結(jié)果,PC的高5位來(lái)自PCLATH的低5位;另一種情況是執(zhí)行跳轉(zhuǎn)指令GOTO或調(diào)用子程序指令CALL時(shí),PC的低11位直接來(lái)自指令碼所攜帶的1 1位地址信息,而PC的高2位由PCLATH的第4位、第3位裝載。具體如下圖所示。
(5).電源控制寄存器PCON
電源控制寄存器只有兩個(gè)有效位,其中一位用來(lái)記錄和區(qū)分是否發(fā)生了上電復(fù)位和外部引腳/MCLR輸入低電平時(shí)引起的手動(dòng)復(fù)位或看門狗超時(shí)溢出復(fù)位;另一位用來(lái)記錄和鑒別是否發(fā)生了掉電復(fù)位。
電源控制寄存器兩個(gè)有效位的含義如下。
BitO/BOR:電源上電復(fù)位標(biāo)志,被動(dòng)參數(shù)。
0:發(fā)生了上電復(fù)位。當(dāng)發(fā)生上電復(fù)位之后,系統(tǒng)自動(dòng)清零。應(yīng)該用軟件及時(shí)將其置位,以便下次利用該位來(lái)判斷是否發(fā)生了電源上電復(fù)位:
1:未發(fā)生上電復(fù)位。
Bitl/POR:掉電鎖定復(fù)位標(biāo)志,被動(dòng)參數(shù)。
0:發(fā)生了掉電鎖定復(fù)位。當(dāng)發(fā)生掉電鎖定復(fù)位之后,系統(tǒng)自動(dòng)清零。應(yīng)該用軟件及時(shí)將其置位,以便下次利用該位來(lái)判斷是否發(fā)生了電源掉電鎖定復(fù)位:
1:未發(fā)生掉電鎖定復(fù)位。
3).EEPROM數(shù)據(jù)存儲(chǔ)器
PIC16F877A單片機(jī)內(nèi)含一個(gè)256×8位EEPROM數(shù)據(jù)存儲(chǔ)器模塊。它可在線擦/寫,用于掉電時(shí)數(shù)據(jù)的保留。
對(duì)EEPROM數(shù)據(jù)存儲(chǔ)器進(jìn)行寫入操作時(shí),不會(huì)影響PIC單片機(jī)其他指令的執(zhí)行。PIC16F877A單片機(jī)EEPROM數(shù)據(jù)存儲(chǔ)器的單元空間為256X8位,對(duì)應(yīng)地址的范圍是OOH—FFH。其中的數(shù)據(jù)信息并不直接映射在文件寄存器中,只能通過(guò)特殊功能寄存器的間接尋址來(lái)訪問(wèn)。
涉及到EEPROM數(shù)據(jù)存儲(chǔ)器讀/寫操作的共有4個(gè)特殊功能寄存器。
(1).EEDATA:
是一個(gè)專用數(shù)據(jù)讀/寫寄存器,用于臨時(shí)存放對(duì)EEPROM數(shù)據(jù)存儲(chǔ)器進(jìn)行讀/寫操作的數(shù)據(jù)。
(2). EEADR:
是一個(gè)專用地址讀/寫寄存器,用于臨時(shí)存放對(duì)EEPROM數(shù)據(jù)存儲(chǔ)器進(jìn)行讀/寫訪問(wèn)的單元地址。
(3).EECON1:
EEPROM數(shù)據(jù)存儲(chǔ)器讀/寫控制第一寄存器,主要用于讀/寫方式的設(shè)定和初始化尋址控制。EECON1寄存器中有3位是無(wú)效定義。
其各位的含義如下:
BitO/RD:EEPROM數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)讀出方式控制位。
O:不處于EEPROM讀操作過(guò)程,或在一個(gè)讀操作周期后由硬件自動(dòng)清零: 1:?jiǎn)?dòng)E'PROM讀操作,軟件主動(dòng)置位。
Bit1/WR:寫操作控制位,復(fù)合參數(shù)。
0:不處于EEPROM寫操作過(guò)程,或在一個(gè)寫操作周朔后由硬件自動(dòng)清零;
1:?jiǎn)?dòng)EEPROM寫操作,軟件主動(dòng)置位。
Bit2/WREN:EEPROM寫使能位。
0:使能對(duì)EEPROM寫