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