/script> PIC系列單片機是美國Microchip公司推出的具有精簡指令集高性能8位單片機,其優點是引腳少,性能優越,可直接帶LED負載,具有低功耗省電模式,可廣泛應用于復雜程度較低的場合。十多年來PIC系列單片正以迅猛的速度發展。
在這一章節里我們將以PIC16C5X系列單片機為例,詳細講解PIC單片機的內部結構及工作原理。
[1].PIC16C5X單片機概況
PIC16C5X屬CMOS單片機,是一個低價位高性能8位單片機,使用了僅有33條精簡指令集、單字節單周期指令,每條指令執行時間最快可達200ns。易于記憶和使用的指令系統可大大減少產品的開發時間。多種時鐘振蕩電路睡眠低功耗省電模式及WDT(看門狗)帶碼保護功能,這些特性具有較大優勢。PIC16C5X系列單片機可廣泛應用于電機控制、汽車電路、家用電器等領域。
[2].PIC16C5X單片機主要性能
RISC精簡指令集,指令僅有33條,指令長度為12位。 絕大部分均為單機器周期指令。 工作速度高,最快可達200ns(20MHz時鐘時)。 數據長度為8位。 片內程序存儲器容量為512-2kbyte。 片內靜態數據存儲器(SRAM)為25-73byte 硬件組成7個專用寄存器 兩級硬件堆棧。 有直接、間接、相對和位尋址功能。 12-20條I/O引腳,每條引腳均可設置為輸入和輸出態。 多種時鐘振蕩電路及WDT定時器電路。 寬工作電壓范圍和低功耗模式:工作電壓為2.5V-6.0V,典型工作電流為2mA,睡眠狀態僅為3uA。 程序保密位,有效地保護用戶的產權。
PIC16C5X系列單片機有多種不同的程序存儲器和數據存儲、I/O引腳、振蕩類型、振蕩頻率及封裝形式。這些器件可為研發實驗提供方便,四種振蕩方式是RC、XT、HS和LP,所需的振蕩器是通過對片內的EPROM編程實現的,未編程狀態器件為默認的RC振蕩方式。
下表是PIC16C5X系列單片機一覽表:
|
| PIC16C5X系列單片機一覽表 |
| 型號 | EPROM | RAM | 時鐘頻率 | 定時器 | 工作電壓V | I/O口數 | 封裝形式 |
| PIC16C52 | 384x12 | 25 | DC-4MHz | 1 | 2.5-6.0 | 12 | 18DIP/SOIC |
| PIC16C54 | 512x12 | DC-20MHz | 1+WDT |
| PIC16C55 | 20 | 28DIP/SOIC |
| PIC16C56 | 1024 | 12 | 18DIP/SOIC |
| PIC16C57 | 2048 | 72 | 20 | 28DIP/SOIC |
| PIC16C58 | 73 | 12 | 18DIP/SOIC |
[3].PIC16C5X單片機引腳圖
| |
|
PIC16C5X系列單片機有兩種封裝形式,一種是雙列直插方式,另一種是表面貼裝方式。其引腳如上圖所示。現對其功能引腳簡述如下:
[1].RA0-RA3 I/O輸入輸出口A,對應內部的f5,是一個4位I/O端口,可位控。
[2].RB0-RB7 I/O輸入輸出口B,對應內部的f6,是一個8位I/O端口,可位控。
[3].RC0-RC3 I/O輸入輸出口C,對應內部的f7,是一個8位I/O端口,可位控。只有PIC16C55和PIC16C57才有。
[4].RTCC 實時時鐘/計數器輸入端,在此端口輸入信號的上升沿或下降沿計數,邊沿可通過軟件選擇。
[5].MCLR 主復位端,當MCLR為低電平時對單片機復位。
[6].OSC1 振蕩信號輸入端。這個端口用于外部振蕩信號的輸入,用RC振蕩時,它接RC電路,用石英振蕩電路時,接石英晶體一端。
[7].OSC2 振蕩信號輸出端。在用石英晶體振蕩器或陶瓷振蕩器時通過一個串聯電阻R接振蕩晶體一端,在RC振蕩時常作CLKOUT輸出(CLKOUT=1/4fosc)。
[8].VDD 電源電壓。一般為5V,其范圍在2.5-6.25V之間。
[9].Vss 地端。
[10].NC 空引腳。PIC16C5X系列單片機是一個低功耗、高速、全靜態CMOS單片機,含ROM、RAM、I/O及中央處理器單元。這種結構基于寄存器文件概念,有獨立的數據和程序存儲器總線。數據總線及數據器(RAM)是8位字寬,程序總線及程序存儲器(ROM)是12位字寬。這種概念強調位、字節和寄存器操作,CPU能在指令讀取和執行過程的重疊中高速工作,即當一條指令執行時,下一條指令已經從程序存儲器讀出,有效地提高CPU的運算速度,同時,通用寄存器和操作寄存器同屬于一個數據存儲區,采用相同的尋址方式,這樣寄存器的存取就非常簡單,這樣的結構體系決定了其指令系統相對簡單但功能卻十分強大。
數據寄存器文件
PIC16C5X的8位數據總線連接兩個基本的功能部件,由32個或80個可尋址的位寄存器與I/O端口組成的寄存器文件和一個8位字寬的算術邏輯單元(ALU),32字節的RAM可直接用塊結構尋址,每個塊為16個字節,如下圖所示。使用文件選擇寄存器(f4),數據可直接尋址或間接尋址。工作寄存器w可執行立即尋址,這種指令結構從程序存儲器讀取數據送入w寄存器。
PIC16C5X的寄存器文件分為兩個功能組,操作寄存器和通用寄存器,操作寄存器包括實時時鐘/計數器RTCC、PC、狀態寄存器、I/O寄存器(PORTS)和文件選擇寄存器,通用寄存器存放數據及控制數據。
|
|
|
|
|
算術/邏輯運算單元
8位算術/邏輯運算單元ALU連接一個工作寄存器(w寄存器),它是通過w寄存器對數據進行算術和邏輯運算,也可對w寄存器或任何文件寄存器進行操作。 PIC16C5X系列單片機內部有一定容量的程序存儲器和數據存儲器,程序存儲器的字節寬度為12位,用于存放用戶程序和數據表格。PIC16C52有384字節的程序存儲空間,PIC16C54/55的ROM空間為512字節,PIC16C56的地址空間為1024字節,PIC16C57/58則為2048個字節。PIC16C5X單片機采用的是分頁尋址方式,每頁位512字節,頁面地址由狀態寄存器f3的PA0、PA1選擇。512字節的12位頁內可直接尋址,較大的程序存儲器可通過選擇4個頁、每頁512字節頁面來尋址,如下圖所示。
但當頁面之間跳轉(GOTO CALL指令)必須先把f3的PA0、PA1設置為相應的頁面。需要注意的是:在系統復位時,程序計數器PC將指向程序存儲器最后一個頁面的最后一個單元。例如PIC16C54/55指向1FFH,PIC16C56指向3FFH,PIC16C57/58則指向7FFH。狀態寄存器f3的PA0、PA1指向零頁空間,所以程序員在編程時需要在程序存儲器底部放置一條跳轉指令,跳到程序入口。
單片機執行程序時,程序計數器(PC)自動加1,程序操作支持直接、間接、相對尋址方式,能由測試、跳轉指令、子程序調用指令、轉移指令或把算出的地址裝入PC來實現程序的跳轉。片內兩級堆棧為子程序嵌套提供服務。
|
|
|
堆棧
PIC16C5X系列單片機提供兩級堆棧,參考上圖。CALL指令把程序計數器加1壓入堆棧1,棧1自動壓入棧2,當多于兩級子程序調用指令執行時,堆棧中只有存儲最近兩個返回地址,所以主程序中調用的子程序最多只能嵌套一次,當執行一條CALL指令,PIC16C56/57/58的f3之頁面選擇位PA1、PA0被裝入程序計數器的最高兩位,第9位清“0”,也就是子程序入口地址必須位于存儲頁的低半頁000-0FF、200-2FF、400-4FF、600-6FF地址。但這里指的是子程序主體的起始位置,而子程序體是可以延伸到下半頁面的。
PIC16C56/57/58,由于程序空間分別為1k和2k,可能存在跨頁面子程序調用,所以調用子程序前須先把f3的PA1、PA0設置成該子程序所在頁面地址。誠然,如果子程序與調用程序同在一個頁面,則無需這個步驟。由于堆棧和PC的寬度是一樣的,所以可在程序的任何地方執行CALL指令來調用子程序。當然跨頁面的調用還須考慮頁面地址PA1、PA0。
RETLW(子程序返回指令)把棧1內容送到程序計數器PC,同時棧2內容復制到棧1,多于兩個RETLW指令運行時,棧1只會裝入先前存在棧2的地址,對于PIC16C56/57,程序總是返回調用它的同一頁面,不管它是處在哪個頁面,也不管f3的頁面選擇位的設置狀態如何。但是執行RETLW指令并不會改變f3中的PA1、PA0的值。w寄存器會被裝入RETLW指令中所指向的數值,即立即數。這在程序存儲器中實現數據查表時就非常有用。 |
數據存儲器分為操作寄存器、I/O寄存器、通用寄存器和專用寄存器四種。由于專用寄存器地址對用戶不透明,我們將在后面的章節中論述。操作寄存器和I/O寄存器占用的物理地址是01H—07H,通用寄存器從地址08H開始。
1.操作寄存器文件
操作寄存器文件是寄存器文件的一種,它是專用的寄存器。它和通用寄存器文件有很大的區別。通用寄存器文件是用于存放數據的,而操作寄存器文件則用于尋址、定時等各種特殊用途。操作寄存器文件包括間接數據尋址寄存器f0、實時時鐘/計數器f1(RTCC)、程序計數器f2(PC)、狀態寄存器f3(STATUS)、文件選擇寄存器f4(FSR)等。下面我們分別介紹這些寄存器。
[1].間接尋址寄存器f0
這不是一個物理寄存器,尋址f0則會讀出文件選擇寄存器f4的內容,并對f4所指定的文件寄存器進行間接尋址操作。f0常用作間接尋址指針。例如指令ADDWF f0,W把f4(FSR)所指的寄存器的內容和W寄存器相加,結果存于w,f0本身不存任何價值。
[2].實時時鐘/計數器f1(RTCC)
該寄存器和其它寄存器一樣,可通過程序寫入和讀出。它用于對加在RTCC引腳上的脈沖計數(用作計數器)或對內部時鐘計數(對fOSC4分頻后計數,做定時器用)。RTCC的結構框圖如下圖所示。
|
|
OPTION寄存器的PSA位控制預分頻器(prescaler)的分配對象,當PSA位為“0”,8位可編程預分頻器分配給RTCC,這時外部或內部信號經過預分頻器分頻后再輸出給RTCC。預分頻器的分頻比由OPTION寄存器的PS0-PS2位決定。OPTION寄存器不在數據存儲器內,是一個可由“OPTION”指令尋址的特別寄存器,如果預分頻器被分配給RTCC,則寫f1會對預分頻器清“0”,但OPTION寄存器內容保持不變,則分配對象、分頻比等均不變。
OPTION寄存器的RTS位決定是對外部還是內部計數,當RTS=1時,對來自RTCC引腳的信號計數,當RTS=0時,對fOSC/4計數。OPTION寄存器的RTE位決定RTCC腳的信號是上升沿(RTE=0)還是下降沿(RTE=1)時增1。當RTS=0,內部時鐘(頻率為fOSC/4)作為計數對象,RTE位、RTCC引腳與內部電路無關。為減少功耗,RTCC腳必須連接VDD或Vss。
當預分頻器分配給計數器/定時器RTCC后,RTCC將計數到預分頻器值后加1,例如,如預分頻器值為1:4,則RTCC將計數4次加1。
無論內部還是外部時鐘是否連接預分頻器,一旦有時鐘供給RTCC,f1將加1。在計數到達FFH時,在下一個計數發生后將自動清零,重新開始計數,一直循環下去。所有令f1(RTCC)加1的脈沖都將延時2個指令周期。例如在寫f1后,隨后的兩個指令周期就不加1。這獨立于外部或內部時鐘的選取。如預分頻器分配給RTCC,預分頻器的輸出將在f1(RTCC)加1前延時兩個指令周期。對于寫或讀RTCC的指令(例如MOVF RTCC,W或CLRF RTCC)都是一樣的,在應用RTCC時,在不影響其計數情況下測試,可用MOVF f1,W指令。
應注意外部時鐘用于RTCC時鐘的有關情況。
當外部時鐘用于RTCC時,它與內部時鐘同步。所以,外部時鐘必須符合一定的要求,同樣在外部時鐘輸入邊沿到RTCC加1,存在著延時,在預分頻后實現同步。在每個指令周期,PSOUT的輸出被采樣兩次以檢測上升或下降沿。因此,這需要PSOUT至少保持2TOSC高電平和至少保持2TOSC低電平。TOSC是振蕩周期。
當不用預分頻器時,PSOUT輸出與RTCC時鐘輸入一樣,要求如下:
TRTH=RTCC 高電平時間≥2TOSC+20ns TRTL=RTCC 低電平時間≥2TOSC+20ns
當用預分頻器時,RTCC輸入被異步脈沖計數器型的預分頻器分頻,預分頻器輸出是對稱的。
PSOUT=RTCC 高電平時間=PSOUT低電平時間=N.TRT/2 當TRT是RTCC輸入周期和N是預分頻器的值(2,4,8,……256)時,要求:
N.TRT/2≥2TOSC+20ns 或 TRT≥2(TOSC+20ns)/N 用戶不需要確定RTCC高、低電平時間,但是如果RTCC的高、低電平持續時間太小,脈沖有可能不被采集。一般要求最小的高、低電平時間為10ns。RTCC輸入要求為:
TRT=周期≥(4TOSC+40ns)/N TRTH=RTCC 高電平時間≥10ns TRTL=RTCC 低電平時間≥10ns
外部時鐘的延時,預分頻器的輸出由內部時鐘同步,RTCC在Q4時加1,從外部時鐘邊沿出現到RTCC實際加1,存在著一個較小的延時,在3TOSC至 7TOSC之間。例如,測量兩個邊沿之間的時間間隔,其精度在±4TOSC之間。 |
3.程序計數器f2(PC)
程序計數器給出片內2048x12的ROM地址,不同的型號程序計數器與它們的兩層堆棧為9-11位寛,如表1所示。
| 表1 程序計數器PC與堆棧大小 |
| 型號 | PC寬度/位 | 堆棧寬度/位 |
| PIC16C54/55 | 9 | 9 |
| PIC16C56 | 10 | 10 |
| PIC16C57 | 11 | 11 |
|
系統復位后,PC為全“1”,程序執行每一條指令PC自動加“1”,除非程序指令本身改變PC的內容(例如程序跳轉,中斷服務等),下面的指令將改變PC的值。
[1].“GOTO”指令:允許直接裝入程序計數器的低8位,對于PIC16C56/57/58,PC的最高位由PA0、PA1兩個頁面選擇位(也即狀態寄存器的5、6位確定),此指令允許跳到任一頁的任意位置。
[2].“CALL”指令:先把當前PC的值壓入堆棧,然后使第9位清“0”,并把低8位裝入程序計數器PC,對于PIC16C56/57/58,PC的高兩位被裝入頁面選擇位PA0、PA1。
[3].“RETLW”指令:該返回指令直接把棧頂內容重裝入PC。
[4].程序計數器可由某位指令改變(例如MOVWF f2,ADDWF f2或BSF f2,5)計算結果將裝入PC低8位,第9位清“0”。對于PIC16C56/57/58,PC的高兩位被裝入頁面選擇位PA0、PA1。
需要注意的是:在執行“CALL”或其它改變PC值指令時,第9位會被清“0”,所有子程序調用指令和需要計算的跳轉指令時,要把分支程序放在任何頁面(512字節)的前256個單元(地址分別為000-0FFH、200-2FFH、400-4FFH、600-6FFH)。
多個程序存儲器頁面選擇(對PIC16C56/57/58有效)情況下,當程序計數器指向所在存儲頁的最后地址時,它仍能加1,并繼續執行到下一頁面,但PA0,PA1頁面選擇位不會改變,以后的“GOTO”、“CALL”、“ADDWF f2”、“MOVWFf2”等指令會返回原來的頁面,除非頁面選擇位在程序中被更改。例如NOP指令位于1FFH(0頁),PC加1變為200(1頁),一條在200的“GOTO XXX”指令將返回0頁的XXX地址(若f3的頁預選位“0”)。
RESET狀態下,PA0、PA1清“0”,0頁會成為預選頁。同時程序計數器PC會對最后一頁的最后一個單元尋址。因此,在這個位置的“GOTO”指令會自動返回至0頁執行。
|
4.狀態寄存器f3
該寄存器包含有ALU的算術狀態位,RESET狀態位、大于512字節程序存儲器的頁面預選位。
狀態寄存器f3可以用作目標寄存器。某些標志位通過相應的寫來設定,而另外一些位是不能通過指令來改變的。TO、PD位是不可寫的。因此一條指令對狀態寄存器執行的結果會有所不同。例如CLR f3被除了TO和PD位之外的所有位清“0”,并把“Z”位置“1”,所以得到的狀態寄存器內容為“000UU100”,其中,U表示不變化。
建議用BCF、BSF或MOVWF指令來改變狀態寄存器的內容,這些指令只改變相應的位,而不影響其它狀態位。
其它影響狀態位的指令可參考指令系統的說明。
狀態寄存器包含8位數據位,其中低5位是狀態標志位,高3位中的最高位PA2未用。PA0和PA1是存儲器頁面選擇位,其結構如下表所示。
| 表1 狀態寄存器的結構 |
| PA2 | PA1 | PA0 | TO | PD | Z | DC | C |
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|
下面我們介紹各位的意義。
[1].C(D0):進位/借位標志位。在執行ADDWF和SUBWF指令時,最高位產生進位或借位時,C=“1”,在減法采用補碼運算。
[2].DC(D1):輔助進位位。當執行ADDWF和SUBWF指令時,低4位產生進位或借位時,DC=“1”。
[3].Z(D2):零標志位。當算術操作結果為0時,Z="1"。
[4].PD(D3):低功耗標志位。上電或執行CLR WDT指令時,PD=“1”。執行SLEEP指令時,PD=“0”。
[5].TO(D4):WDT溢出標志位。當上電或執行CLR WDT、SLEEP指令時,TO=“1”,WDT溢出時,TO=“0”。
[6].PA0,PA1(D5,6):程序存儲器頁面選擇位。對于PIC16C56單片機,PA0是程序存儲器頁面選擇位。PA1是通用讀寫位。在PA=0時,選擇0頁面,即000H-1FFH。PA0=1時,選中1頁,地址為200H-3FFH。
對于PIC16C57/58單片機,PA0、PA1是程序存儲器頁面選擇位。它們的值從00-11H分別選中0-3頁,即地址為000-1FFH、200H-3FFH、400H-5FFH、600H-7FFH。
[7].PA2(D7):通用讀寫位,未使用。
在復位時,PA2,PA1,PA0被清“0”,上電或執行CLR WDT指令時,TO、PD都被置“1”,這兩位的變化如表2所示。上電復位時,Z、DC、C標志位狀態不定。在其它復位情況下(如WDT溢出)Z、DC、C狀態不變。上電復位TO、PD的狀態見表3。 |
|
| 表2 事件對TO、PD標志位的影響 |
| 事件 | TO | PD | 說明 |
| 上電 | 1 | 1 | 不影響PD標志位 |
| WDT超時溢出 | 0 | X |
| SLEEP指令 | 1 | 0 |
| CLR WDT指令 | 1 | 1 |
|
| 表3 復位后TO、PD標志位的狀態 |
| TO | PD | 復位原因 |
| 0 | 0 | WDT超時溢出使SLEEP喚醒 |
| 0 | 1 | WDT超時溢出(不在SLEEP狀態時) |
| 1 | 0 | MCLR加低電平使SLEEP喚醒 |
| 1 | 1 | 上電時 |
| X | X | MCLR加低電平 |
|
| ADDWF指令后,進位位C=1表示產生進位,執行SUBWF指令后,進位位C=0表示借位,執行ADDWF或SUBWF指令也將影響輔助進位位DC狀態。DC表示低半字節到高半字節的進位和借位。 |
|
通用寄存器文件是用于存放數據的寄存器。一般用于中間數據或結果數據存放。所有的通用寄存器構成了通用寄存器文件。
專用寄存器是單片機內的物理寄存器,它們與數據存儲器無關,專用寄存器用于特殊用途,例如I/O斷口控制等。
1.通用寄存器 PIC16C52/54/56的通用寄存器地址分配為F07H—F1FH,PIC16C55則為F08H—F1FH,這些地址組成了通用寄存器文件。PIC16C57/58的通用寄存器地址分配如下:
F08H—F0FH:常用的并與存儲器塊無關的通用寄存器文件。
F10H—F1FH:Bank0的通用寄存器文件。
F20H—F2FH:等同于F00—F0FH。
F30H—F3FH:Bank1的通用寄存器文件。
F40H—F4FH:等同于F00—F0FH。
F50H—F5FH:Bank2的通用寄存器文件。
F60H—F6FH:等同于F00—F0FH。
F70H—F7FH:Bank3的通用寄存器文件。
2.專用寄存器 [1].W工作寄存器 在兩個操作量的指令中用于存放第二個操作量,同時,也用于內部數據傳送。
[2].TRISA:A口(f5)I/O控制寄存器0-3位有效,對應于I/O(f5)4位寬度。 [3].TRISB:B口(f6)I/O控制寄存器。 [4].TRISC:C口(f7)I/O控制寄存器。 執行TRIS指令時,w寄存器的內容將傳送至I/O控制寄存器,以此來定義各I/O口的輸入/輸出狀態。 I/控制寄存器的某位為“1”,使相應的I/O線置于高阻抗狀態,即輸入態,某位為“0”,使相應的I/O線置輸出態。I/O控制寄存器是只寫寄存器,復位時全為“1”。
[5].OPTION:預分頻器/RTCC選擇寄存器。 分配預分頻器(prescaler)給RTCC或WDT。預分頻器只能分配給RTCC或WDT其中之一使用,不能同時使用。OPTION寄存器是用于定義預分頻器的預分頻系數,RTCC信號源及作用于RTCC的信號邊緣。OPTION寄存器是一個只寫6位寬度寄存器。執行OPTION指令時,會把W寄存器內容傳送至OPTION寄存器中。在復位時,OPTION寄存器被置為全“1”。
|
| RTS | RTE | PSA | PS2 | PS1 | PS0 |
| D5 | D4 | D3 | D2 | D1 | D0 |
|
寄存器OPTION各位定義如下:
[1]. RTS(D5):RTCC信號選擇位,RTS=0時,選中內部指令周期時鐘(CLKOUT)為輸入信號,在RTS=1時,選中RTCC引腳輸入的信號。
[2]. RTE(D4):RTCC信號邊沿選擇位,RTE=0時,選中RTCC引腳輸入信號的上升沿計數,RTE=1時,RTCC引腳輸入信號下降沿觸發。
[3]. RTS(D3):預分頻器分配位。PSA=0時,把預分頻器分配給RTCC,PSA=1時,把預分頻器分配給WDT。
[4]. PS0-PS2(D2-D0):預分頻值,它用于確定分頻器的分頻比,定義如下表所示。
|
| 預分頻值 | RTCC時分頻比 | WDT時分頻比 |
| 0 0 0 | 1:2 | 1:1 |
| 0 0 1 | 1:4 | 1:2 |
| 0 1 0 | 1:8 | 1:4 |
| 0 1 1 | 1:16 | 1:8 |
| 1 0 0 | 1:32 | 1:16 |
| 1 0 1 | 1:64 | 1:32 |
| 1 1 0 | 1:128 | 1:64 |
| 1 1 1 | 1:256 | 1:128 |