PIC單片機16F84的內部硬件資源
現在我們已經(jīng)知道要單片機工作,就需用匯編語(yǔ)言編制程序。而對某個(gè)PIC單片機編程時(shí),還需對選用的PIC單片機內部硬件資源有所了解。這里介紹PIC16F84單片機的內部結構,如圖1所示的框圖。由圖1看出,其基本組成可分為四個(gè)主要部分,即運算器ALU和工作寄存器W;程序存儲器;數據存儲器和輸入/輸出(I/O)口;堆棧存儲器和定時(shí)器等?,F分別介紹如下。
1運算器ALU及工作寄存器W
運算器ALU是一個(gè)通用算術(shù)、邏輯運算單元,用它可以對工作寄存器W和任何通用寄存器中的兩個(gè)數進(jìn)行算術(shù)(如加、減、乘、除等)和邏輯運算(如與、或、異或等)。16F84是八位單片機,ALU的字長(cháng)是八位。在有兩個(gè)操作數的指令中,典型的情況是一個(gè)操作數在工作寄存器W中,而另一個(gè)操作數是在通用寄存器中,或者是一個(gè)立即數。在只有一個(gè)操作數的情況下,該數要么是在工作寄存器W中,要么是在通用寄存器中。W寄存器是一個(gè)專(zhuān)用于A(yíng)LU操作的寄存器,它是不可尋址的。
根據所執行的指令,ALU還可能會(huì )影響框圖中狀態(tài)寄存器STATUS的進(jìn)位標志C、全零標志Z等。
2程序存儲器
單片機內存放程序指令的存儲器稱(chēng)為程序存儲器。PIC16F84的所有指令字長(cháng)為14位。所以程序存儲器的各存儲單元是14位寬。一個(gè)存儲單元存放一條指令。16F84的程序存貯器有1024(28)個(gè)存儲單元(存儲容量為1k)。這些程序存儲器都是由FPEROM構成的。
程序存儲器是由程序計數器PC尋址的。16F84的程序計數器為13位寬,可尋址8K(8×1024)的程序存儲器空間,但16F84實(shí)際上只使用了1k的空間(單元地址為0~3FFH)。當訪(fǎng)問(wèn)超過(guò)這些地址空間的存儲單元時(shí),將導致循環(huán)回到有效的存儲空間。
對于用過(guò)其它單片機的用戶(hù),可能會(huì )感到16F84的片內存儲器容量太少了。實(shí)際上并非如此,因為16F84的指令系統都是由單字指令構成的,相應于其它由二字節、三字節甚至四字節指令的單片機而言,PIC單片機的程序存儲器有效容量要比標稱(chēng)值擴大25倍到3倍。
成都 衛東
知識競賽試題:
15簡(jiǎn)述PIC系列單片機助記符指令中操作數f、d、b、k取值的可能范圍,并簡(jiǎn)要說(shuō)明其依據。
16指出PIC16F84單片機框圖(上文圖1)中寄存器的類(lèi)型和不能訪(fǎng)問(wèn)的寄存器名稱(chēng)?
3 數據存儲器
在單片機PIC16F84中,除了有存放程序的程序存儲器外,還有數據存儲器。單片機在執行程序過(guò)程中,往往需要隨時(shí)向單片機輸入一些數據,而且有些數據還可能隨時(shí)改變。在這種情況下就需用數據存儲器。由于數據存儲器不但要能隨時(shí)讀取存放在其各個(gè)單元內的數據,而且還需隨時(shí)寫(xiě)進(jìn)新的數據,或改寫(xiě)原來(lái)的數據。因此,數據存儲器需由隨機存儲器RAM構成。RAM存儲器在斷電時(shí),所存數據隨即丟失,這在實(shí)際應用中有時(shí)會(huì )帶來(lái)不便。但是,在16F84單片機中有64×8位E2PROM數據存儲器。存放在E2PROM中的數據在斷電時(shí)不會(huì )丟失。
16F84單片機中的RAM數據存儲器如表1所示,該RAM分為兩個(gè)存儲體:即存儲體0(Bank0)和存儲體1(Bank1)。每個(gè)存儲體均可以直接用內部總線(xiàn)傳送信息,所以它們都是以寄存器方式工作和尋址。這些八位寄存器,又可分為通用寄存器和專(zhuān)用寄存器兩個(gè)部分。通用寄存器存放數據,專(zhuān)用寄存器存放控制單片機運作的信息。每個(gè)存儲體最大可擴展到7FH(128個(gè)字節)。在每個(gè)存儲體中,專(zhuān)用寄存器被安排在低位地址空間,通用寄存器被安排在高位地址空間。
通用寄存器用法單一,但專(zhuān)用寄存器卻各有各的用處,現將較基本的專(zhuān)用寄存器作一簡(jiǎn)單介紹。
(1)程序計數器(PCL、PCLATH)。程序計數器PC是對程序進(jìn)行管理的計數器。PIC16F84的程序計數器為13位寬,最大可尋址的存儲空間為8k×14位。實(shí)際上16F84只使用前1k×14位(0000~03FFH)存儲空間。因程序計數器有13位寬,而專(zhuān)用寄存器只有8位。因此PC由兩個(gè)專(zhuān)用寄存器構成。其低八位PCL是一個(gè)可讀/寫(xiě)寄存器(地址為02H或82H),而高字節PCH(有效位5位)不能直接進(jìn)行讀/寫(xiě)操作,它是通過(guò)一個(gè)8位的保持寄存器PCLATH(地址為0A或8AH)把高5位地址傳送給程序計數器的高字節。當執行CALL、GOTO指寫(xiě)PCL時(shí),PC值的高字節就從PCLATH寄存器中裝入。
(2)狀態(tài)寄存器STATUS。狀態(tài)寄存器STATUS含有算術(shù)邏輯單元ALU運算結果的狀態(tài)(如有無(wú)進(jìn)位等)、復位狀態(tài)及數據存儲體選擇位。有關(guān)位位的設定如表2所示,功能如下:
1)第0位。進(jìn)位/借位位C。執行加、減運算指令
表2
IRP RP1 RP0 TO PD Z DC C
后,若結果有進(jìn)位或借位,則C被置1,否則置0。在執行移位指令時(shí),也要用到這一位。
2)第1位。輔助進(jìn)位/借位位DC。執行加、減運算指令后,若結果的低四位向高四位有進(jìn)位或借位,則DC置1,否則置0。
3)第2位。零標志位運算結果為零,Z被置1;運算結果不為零,Z被清零。
4)第3位。低功耗標志位PD。上電復位或執行CLRWDT指令后置1,執行SLEEP指令后被清零。
5)第4位。定時(shí)時(shí)間到標志位TO。上電復位或執行CLRWDT、SLEEP指令后被置1,監視定時(shí)器的定時(shí)時(shí)間到被清零。
6)第5位和第6位(RP0、RP1)。這兩位是用于直接尋址時(shí)的寄存器體選擇位。即00——選中Bank0(00H~7FH);01——選中Bank1(80H~FFH),16F84只有兩個(gè)存儲體。故10、11不用。
7)第7位IRP。這是間接尋址的寄存體選擇位。0——選中Bank0、1(00H~FFH),1——選中Bank2、3。16F84只有Bank0、1,所以此IRP位應被置為0。
(3)間接尋址INDF和FSR寄存器
INDF寄存器不是一個(gè)物理寄存器,而是一個(gè)邏輯功能的寄存器(地址為00H或80H),當對INDF寄存器進(jìn)行尋址時(shí),實(shí)際上是訪(fǎng)問(wèn)FSR寄存器內容所指的單元,即把FSR寄存器作為間接寄存器使用。FSR稱(chēng)為“寄存器選擇”寄存器,地址為(04H或84H)。對INDF寄存器本身進(jìn)行間接尋址訪(fǎng)問(wèn),將讀出FSR寄存器的內容,例如當FSR=00H時(shí),間接尋址讀出INDF的數據將為00H。用間接尋址方式寫(xiě)入INDF寄存器時(shí),雖然寫(xiě)入操作可能會(huì )影響STATUS中的狀態(tài)字,但寫(xiě)入的數據是無(wú)效的。 6定時(shí)器/計數器TMRO
PIC單片機16F84中有一個(gè)定時(shí)器,此定時(shí)器也可用于計數,因此稱(chēng)為定時(shí)器/計數器,符號為T(mén)MRO。TMRO可用于定時(shí)控制、延時(shí)、對外部事件計數和檢測等場(chǎng)合。TMRO是一個(gè)8位增量(加1)計數器。它在數據存貯器中的地址為01。定時(shí)器所用的時(shí)鐘源可以是內部系統時(shí)鐘(OSC/4,即四倍振蕩周期),也可以是外部時(shí)鐘。若TMRO對內部系統時(shí)鐘的標準脈沖系列進(jìn)行計數時(shí),就成為定時(shí)器;對外部脈沖進(jìn)行計數時(shí)TMRO就成為計數器。
不管是定時(shí)還是計數方式,TMRO在對內部時(shí)鐘或對外部事件計數時(shí),都不占用CPU時(shí)間,除非TMRO溢出,才可能中斷CPU的當前操作??梢?jiàn),定時(shí)器是單片機16F84中效率高且工作靈活的部件。
為了擴大定時(shí)或計數的范圍,配合TMRO的使用,還有一個(gè)可編程預定標器。此定標器實(shí)際上是一個(gè)可編程分頻器。
TMRO的內部結構示意圖如附圖所示。其工作方式由數據存儲器中的項選寄存器OPTION控制。OPTION是一個(gè)可讀/寫(xiě)的寄存器,如附表所示。它含有配置TMRO/WDT預定標器、外部INT中斷、TMRO等的各種控制位。
TMRO的定時(shí)、計數方式是由OPTION寄存器中的D5(即TOCS位)確定。當TOCS=0時(shí),工作于定時(shí)器方式;當TOCS=1時(shí),工作于計數器方式。作定時(shí)器時(shí),每個(gè)指令周期加1(無(wú)預分頻時(shí));而作計數器時(shí),則在每個(gè)RA4/TOCKI引腳上電平變化時(shí)加1。OPTION寄存器的位4(TOCS位)決定外部脈沖的觸發(fā)方式,當TOSE=1,下降沿觸發(fā);TOSE=0,上升沿觸發(fā)。當TMRO內部計數器發(fā)生計數溢出(從FFh→00h)時(shí),溢出位送入中斷控制寄存器INTCON。
由附圖可知,預分頻器也是一個(gè)8位計數器。其分頻數是由OPTION寄存器中的PS2~PS0三位值來(lái)改變。分頻數可以是以下8種之一:1∶1、1∶2、1∶4、1∶8、1∶16、1∶32、1∶64和1∶128。
當分頻器用于TMRO時(shí),所有寫(xiě)入TMRO的指令,如CLRF 1、MOVWF 1、BSF 1、等都將對預分頻器清零。需要注意的是,預分頻器是不能讀寫(xiě)的。此分頻器可用于TMRO,也可用于WDT,其切換由軟件控制。為了避免意外的芯片復位,當需要切換時(shí),必須執行相應的一段程序,以下是從WDT切換到TMRO時(shí)所需執行的程序:
CLRWDT ??;
對WDT和預定標器清零
BSF STATUS,RP0 ;選中存儲體1
MOVLWB′xxxx0xxx′;PSA=0,選中TMRO
MOVWFOPTION ??;送入OPTION寄存器
BCF STATUS,RP0;復位存儲體0
成都 衛東
知識競賽試題:
21根據本版左下文介紹,請以表的形式列出PIC16C8X單片機(有兩個(gè)存儲體和A、B兩口)至少11個(gè)專(zhuān)用寄存器的名稱(chēng)和地址。
4 I/O口
單片機作為一個(gè)控制器件必定有數據輸入和輸出。輸入量可能是溫度、壓力、轉速等,而輸出量可能是開(kāi)關(guān)量和數據,以保證受控過(guò)程在規定的范圍內運行。數據的輸入和輸出都需通過(guò)單片機內部有關(guān)電路,再與引腳構成輸入/輸出(I/O)端口。PIC16F84單片機芯片有兩個(gè)I/O端口(PROTA和PORTB)。端口A(yíng)為5位口,端口B為8位口,共占用13位引腳。每個(gè)端口由一個(gè)鎖存器(即數據存儲器中的特殊功能寄存器05H、06H單元)、一個(gè)輸出驅動(dòng)器和輸入緩沖器等組成。當把I/O口作輸出時(shí),數據可以鎖存;作輸入口時(shí),數據可以緩沖。
16F84 PORTA口中的RA4是斯密特觸發(fā)輸入、漏極開(kāi)路輸出。而其它的RA口引腳都是TTL電平輸入和全CMOS驅動(dòng)輸出。端口PORTB是一個(gè)八位雙向可編程I/O口。各端口雖然也由鎖存器、驅動(dòng)器、緩沖器等構成,但因功能略有不同而導致電路亦存在差別?,F以PORTA口的RA0 ~RA3的電路(見(jiàn)左圖)為例,說(shuō)明其基本工作原理。
圖中RA口的I/O引腳是由數據方向位(寄存器TRISA)來(lái)定義數據流向。當TRISA寄存器的位置為“1”時(shí),其輸出驅動(dòng)器(由P溝道和N溝道MOS管串接而成)呈高阻態(tài),即兩個(gè)MOS管均截止,I/O口被定義為輸入。此時(shí),數據由I/O端輸入,經(jīng)TTL輸入緩沖器到D觸發(fā)器。當執行讀指令時(shí),此D觸發(fā)器使能,數據經(jīng)三態(tài)門(mén)進(jìn)入數據總線(xiàn)。
當TRISA的位置為“0”時(shí),I/O口被定義為輸出,此時(shí)輸出鎖存器的輸出電平就是I/O口的輸出電平。
讀PORTA寄存器的結果就是讀取I/O引腳上的電平,而寫(xiě)PORTA寄存器的結果是寫(xiě)入I/O鎖存器。所有的寫(xiě)I/O口的操作都是一個(gè)“讀入/修改/寫(xiě)入”的過(guò)程,即先讀I/O引腳電平,然后由程序修改(按要求給定一個(gè)值),再置入I/O鎖存器。
PIC16F84單片機的輸出可提供20mA的電流,所以它可直接驅動(dòng)LED。PORTA和PORTB各個(gè)位均可分別定義為輸入和輸出。下面以PORTA口初始化程序的實(shí)例,說(shuō)明選擇I/O口的方法。
CLRF PORTA;端口A(yíng)被清零
BSF STATUS;狀態(tài)寄存器STATUS的RPO位置為1,選BANK1。
MOVLW 0xCF;將定向值
??;11001111置入W工作寄存器
MOVWF TRISA;置RA(3~0)位為輸入
??;RA 54位為輸出
??;TRISA 76位未用
在使用I/O口時(shí)應注意:
(1)當需要一個(gè)I/O口一會(huì )做輸入、一會(huì )又做輸出時(shí),輸出值會(huì )不確定。
(2)I/O引腳輸出驅動(dòng)電路為CMOS互補推挽輸出。當其為輸出狀態(tài)時(shí),不能與其它輸出腳接成“線(xiàn)或”或“線(xiàn)與”,否則,會(huì )因電流過(guò)載燒壞單片機。
(3)當對I/O口進(jìn)行寫(xiě)操作后不宜直接進(jìn)行讀操作,一般要求在兩條連續的寫(xiě)、讀指令間至少加入一條NOP指令。
例:MOVWF 6 ;寫(xiě)I/O
NOP;穩定I/O電平
MOVF 6,W;讀I/O
5堆棧
單片機執行程序時(shí),常常要執行調用子程序。這樣就產(chǎn)生了一個(gè)問(wèn)題:如何記憶是從何處調用的子程序,以便執行子程序之后正確返回。此外,在程序執行過(guò)程中,還可能會(huì )發(fā)生中斷,轉而執行中斷子程序,這時(shí),又如何記憶從何處中斷,以便返回呢?
滿(mǎn)足上述功能的方法就是“堆?!奔夹g(shù)。
“堆?!笔且粋€(gè)用來(lái)保存臨時(shí)數據的棧區。當主程序調用子程序時(shí),單片機執行到CALL指令或發(fā)生中斷時(shí),就自動(dòng)將下一條指令的地址“壓?!北4娴綏^。當子程序結束,單片機執行返回指令時(shí),就自動(dòng)地把棧區的內容“彈出”,作為下步指令執行的新地址。
PIC16F84單片機芯片內有一個(gè)8級13位寬(與PC同寬)的硬件堆棧,此堆棧既不占用程序存儲空間,也不占用數據存儲空間。當執行一條CALL指令或一個(gè)中斷被響應后,程序計數器PC中的斷點(diǎn)地址就自動(dòng)被壓棧(PUSH)保護,而當執行RETURN、RETLW或者RETFIE指令時(shí),堆棧中的斷點(diǎn)地址會(huì )彈回(POP)程序計數器PC中。無(wú)論是PUSH還是POP操作,都不影響PCLATH寄存器的內容?! ~啥肌⌒l東
知識競賽試題:
19簡(jiǎn)述PIC單片機I/O口的功能。
20P(pán)IC16C64A/RL64與PIC16C65的管腳數相等,管腳功能相近,但PIC16C64A/RL64的{16}腳無(wú)CCP2、{25}腳無(wú)TX/CK、{26}腳無(wú)RX/DT等功能,試繪出PIC16C64A/RL64的管腳功能圖。
7 延時(shí)和定時(shí)
在設計單片機應用系統時(shí),經(jīng)常會(huì )遇到需要使某一過(guò)程(如加溫、加壓等)持續一段時(shí)間的情況,如連續加壓1分鐘,通電2分鐘等。單片機如何正確確定這段時(shí)間呢?這里可通過(guò)兩種方式,即延時(shí)和定時(shí)來(lái)實(shí)現。試看下例。
在應用系統中要求PIC16F84單片機的RAO端控制一個(gè)發(fā)光二極管按一定頻率閃亮,可通過(guò)右圖的電路來(lái)實(shí)現。同時(shí)還必須為16F84單片機編制一個(gè)程序。由電路圖可知,要使發(fā)光二極管LED按一定的頻率閃亮,只要使RAO端輸出一個(gè)變化的高→低→高……電平即可。由此設計出如下的源程序(清單1):
list P=16F84,F=INHX8M
??;……
ORG 0
MOVLW 0 ;主程序開(kāi)始
TRIS 5 ;置RA口為輸出
BCF 5,0 ;RA口0位清零
LOOP:CALL DELAY;閃動(dòng)延時(shí)
COMF 5 ;RA口求反,亮—滅交替
GOTO LOOP ;循環(huán)
??;……
DELAY ;以下為延時(shí)子程序
MOVLW D′50
MOVWF 8
LOOP1:MOVWF 9
LOOP2:DECFSZ 9,F
GOTO LOOP2
DECFSZ 8,F
GOTO LOOP1
RETLW 0
由清單1可知,當主程序開(kāi)始時(shí),首先將工作寄存器W清零,然后將W寄存器的內容送TRISA寄存器,使其清零,以設置RA口為輸出。接著(zhù)又將RA口的第5位清零,使LED開(kāi)始時(shí)處于熄滅狀態(tài)。隨之持續一段時(shí)間,即執行延時(shí)子程序,再將RA口取反,變?yōu)楦唠娖捷敵?,LED發(fā)光,再延時(shí),又使RA口取反,LED熄滅……。這樣,LED就一暗一亮,持續交替進(jìn)行。
在這里,使LED亮、暗持續一段時(shí)間是通過(guò)單片機執行延時(shí)子程序DELAY來(lái)實(shí)現的。此延時(shí)程序的核心就是讓單片機的CPU反復執行使寄存器內容減1的指令DECFSZ。即將十進(jìn)制數50分別裝入通用寄存器F8、F9,以進(jìn)行50×50=2500次的減1操作。如果執行一次DECFSZ指令需1個(gè)指令周期(跳轉時(shí)需2個(gè)周期),若設振蕩頻率為100kHz,即指令周期為40μs,則延時(shí)時(shí)間為2500×40=100000μs=100ms,即01秒。實(shí)際上還略為大些。此延時(shí)時(shí)間已超過(guò)人眼的視覺(jué)保留時(shí)間。因而能看清LED的明、暗交替變化。
如果我們需要更長(cháng)的延時(shí)時(shí)間,可仿照上例,裝入更大的數或引入多重循環(huán)。因此,在原則上,延時(shí)時(shí)間可根據需要任意延長(cháng)。
不過(guò),采用延時(shí)程序來(lái)持續某一過(guò)程的方式有缺陷。延時(shí)就是使CPU在某幾條指令上“轉圈”,延時(shí)越長(cháng),“轉圈”數越多,這時(shí),CPU不能再去執行其它操作,如監視溫度、濕度等。這在某些實(shí)時(shí)控制系統中,不允許這樣做。為此,在單片機16F84單片機中,專(zhuān)門(mén)設置了一個(gè)“鬧鐘”——定時(shí)器TMR0。需要某過(guò)程延續多長(cháng)時(shí)間,可將其“撥入”TMR0,到時(shí)它會(huì )發(fā)生“中斷”,告訴CPU定時(shí)時(shí)間到。要CPU暫停其它工作,轉過(guò)來(lái)執行“中斷子程序”,完成輸出開(kāi)、關(guān)信號之類(lèi)的任務(wù)后,再回去執行其中斷的工作。這樣,就使CPU的工作效率提高。因而,延時(shí)的使用有局限性,采用定時(shí)器TMR0則可用于各種場(chǎng)合中。8 中斷
PIC單片機16F84具有實(shí)時(shí)處理功能,能對外界異常發(fā)生的事件由中斷技術(shù)作及時(shí)處理。
當單片機的CPU正在處理某事件時(shí),若外部發(fā)生了某一事件(如定時(shí)器溢出、引腳上電平變化),請求CPU迅速去處理,于是CPU就暫時(shí)中止當前的工作,轉去處理所發(fā)生的事件。中斷處理完該事件后,再回到原來(lái)被中止的地方,繼續執行原來(lái)的工作,如圖1所示。實(shí)現這種功能的部件稱(chēng)為中斷系統。產(chǎn)生中斷的請求源稱(chēng)為中斷源。中斷源向CPU提出的處理請求,稱(chēng)為中斷請求或中斷申請。CPU暫時(shí)中斷自身的事務(wù),轉去處理事件的過(guò)程,稱(chēng)為CPU的中斷響應過(guò)程。對事件的整個(gè)處理過(guò)程,稱(chēng)為中斷服務(wù)(或中斷處理)。處理完畢,再回到原來(lái)被中止的地方,稱(chēng)為中斷返回。
PIC16F84單片機芯片有4種中斷源,其邏輯電路如圖2所示。
9中斷控制
中斷主要由中斷控制寄存器INTCON(圖3)來(lái)控制。INTCON是一個(gè)可讀/寫(xiě)寄存器,含有定時(shí)器TMRO溢出、RB口的變化和外部INT引腳中斷等各種允許控制和標志位。
全局中斷允許位GIE(D7)置1,將開(kāi)放所有未被屏蔽的中斷,如將該位清零,將禁止所有的中斷。在響應中斷時(shí),GIE位將被清零,以禁止其它中斷,返回的斷點(diǎn)地址被壓棧保護,接著(zhù)把中斷入口地址0004h裝入程序計數器PC。在中斷服務(wù)程序中,通過(guò)對中斷標志位進(jìn)行查詢(xún),確定中斷標志位必須在重新開(kāi)放中斷之前用軟件清零,以避免不斷地中斷申請而反復進(jìn)入中斷。
(1)INT中斷。RBO/INT引腳上的外部中斷由邊沿觸發(fā),當INTEDG位(OPTION寄存器第6位)被置1時(shí),選用上升沿觸發(fā),如該位被清零,則由下降沿觸發(fā)。當檢測到引腳上有規定的有效邊沿時(shí),便把INTE位(INTCON的D4位)置1。在重新開(kāi)放這個(gè)中斷之前,必須在中斷服務(wù)程序中對INTE位清零?! ?2)TMRO中斷。當定時(shí)器TMRO的計數器計滿(mǎn)溢出(即由FFH變成00H)時(shí),硬件自動(dòng)把TOIF(INTCON的D2位)置1。其中斷可以通過(guò)對TOIE(INTCOND的D5位)置1或清零來(lái)控制該中斷是否開(kāi)放。
(3)PORTB口引腳電平變化中斷。在PORTB口的D7~D0引腳上一旦有電平變化,就會(huì )把RBIF(INTCON的D0位)置1。這個(gè)中斷可以通過(guò)對RBIE(INTCON的D3位)置1或清零來(lái)控制該中斷是否開(kāi)放。
(4)中斷的現場(chǎng)保護。在發(fā)生中斷時(shí),只有返回斷點(diǎn)的地址被壓棧保護。若用戶(hù)還希望保護關(guān)鍵的寄存器(如W寄存器和STATUS寄存器)。這需要由軟件來(lái)實(shí)現。有關(guān)中斷的現場(chǎng)保護,請參看本報第15期有關(guān)PIC單片機指令識讀中的實(shí)例。
成都 衛東
知識競賽試題:
23用簡(jiǎn)單的實(shí)例說(shuō)明中斷在PIC單片機中的用途。
編后語(yǔ):“PIC單片機系列專(zhuān)題”至今已刊登了十五期,余下還將刊載十期,共計二十五期。以后的內容將主要圍繞PIC單片機的匯編和實(shí)際應用及開(kāi)發(fā)來(lái)展開(kāi)介紹,歡迎廣大讀者對本專(zhuān)題多提意見(jiàn)和建議。為配合本專(zhuān)題,“《電子報》單片機公共實(shí)驗室”還為讀者及會(huì )員準備一系列性?xún)r(jià)比高,適合初學(xué)者的PIC單片機、編程器、仿真器,以后本欄目將逐步加以介紹。另外,本專(zhuān)題的“知識競賽”試題將于今年8月13日第32期《電子報》刊載完畢,歡迎讀者踴躍參加。參加的讀者務(wù)請在9月5日前,將所有試題按編號回答好后,寄往本報編輯部,或E-mail至dzb12@netdzb.com。我們將評出一、二、三等獎若干名,分別獎以獎金、PIC開(kāi)發(fā)器、書(shū)刊等(詳情見(jiàn)今年《電子報》第8期第十一版)。
成都 衛東 10 復位
復位是單片機的初始化操作。其主要功能是把程序計數器PCL初始化為000H,可使16F84單片機從000H單元開(kāi)始執行程序。
PIC16F84單片機有下列幾種不同的復位方式。
(1)芯片上電復位POR。
(2)正常工作狀態(tài)下通過(guò)外部MCLR引腳加低電平復位。
(3)在省電休眠狀態(tài)下通過(guò)外部MCLR引腳加低電平復位。
(4)監視定時(shí)器WDT超時(shí)溢出復位。
PIC16F84單片機片內集成有“上電復位”P(pán)OR電路,對于一般應用,只要把MCLR引腳接高電位即可。
在正常工作或休眠狀態(tài)下用MCLR復位,只需在MCLR引腳上加一按鍵瞬間接地即可。
單片機16F84復位操作,對其它一些寄存器會(huì )有影響,如表1所示。
11監視定時(shí)器WDT
單片機系統常用于工業(yè)控制,在操作現場(chǎng)通常會(huì )有各種干擾,可能會(huì )使執行程序彈飛到一種死循環(huán),從而導致整個(gè)單片機控制系統癱瘓。如果操作者在場(chǎng),就可進(jìn)行人工復位,擺脫死循環(huán)。但操作者不能一直監視著(zhù)系統,即使監視著(zhù)系統,也往往是引起不良后果之后才進(jìn)行人工復位。由于PIC16F84單片機中具有程序運行自動(dòng)監視系統,即監視定時(shí)器WDT(Watch Dog Time),直譯為“看門(mén)狗”定時(shí)器。這好比是主人養了一條狗,主人在正常干活時(shí)總不忘每隔一段時(shí)間就給狗喂食,狗就保持安靜,不影響主人干活。如果主人打嗑睡,不干活了,到一定時(shí)間,狗餓了,發(fā)現主人還沒(méi)有給它吃東西,就會(huì )大叫起來(lái),把主人喚醒。由此可見(jiàn),WDT有如下特性:
(1)本身能獨立工作,基本上不依賴(lài)CPU。
(2)CPU在一個(gè)固定的時(shí)間間隔中和WDT打一次交通(如使其清零,即喂一次狗),以表明系統目前工作正常。
(3)當CPU落入死循環(huán)后,能被WDT及時(shí)發(fā)覺(jué)(如WDT計數溢出),并使系統復位。
PIC16F84單片機內的WDT,其定時(shí)計數的脈沖序列由片內獨立的RC振蕩器產(chǎn)生,所以它不需要外接任何器件就可以工作。而且這個(gè)片內RC振蕩器與OSC1/CLKIN(引腳{16})上的振蕩電路無(wú)關(guān),即使OSC1和OSC2上的時(shí)鐘不工作,WDT照樣可以監視定時(shí)。例如:當PIC16F84在執行SLEEP指令后,芯片進(jìn)入休眠狀態(tài),CPU不工作,主振蕩器也停止工作,但是,WDT照樣可監視定時(shí)。當WDT超時(shí)溢出后,可激活(喚醒)芯片繼續正常的操作。而在正常操作期間,WDT超時(shí)溢出將產(chǎn)生一個(gè)復位信號。如果不需要這種監視定時(shí)功能,在固化編程時(shí),可關(guān)閉這個(gè)功能。附圖是監視定時(shí)器的結構框圖。表2是與WDT有關(guān)的寄存器。
WDT的定時(shí)周期在不加分頻器的情況下,其基本定時(shí)時(shí)間是18ms,這個(gè)定時(shí)時(shí)間還受溫度、VDD和不同元器件的工藝參數等的影響。如果需要更長(cháng)的定時(shí)周期,還可以通過(guò)軟件控制OPT/ON寄存器把預分頻器配置給WDT,這個(gè)預分頻器的最大分頻比可達到1∶128。這樣就可把定時(shí)周期擴大128倍,即達到23秒。
如果把預分頻器配置給WDT,用CLRWDT和SLEEP指令可以同時(shí)對WDT和預分頻器清零,從而防止計時(shí)溢出引起芯片復位。所以在正常情況下,必須在每次計時(shí)溢出之前執行一條CLRWDT指令(即喂一次“狗”),以避免引起芯片復位。當系統受到嚴重干擾處于失控狀態(tài)時(shí),就不可能在每次計時(shí)溢出之前執行一條CLR WDT指令,WDT就產(chǎn)生計時(shí)溢出,從而引起芯片復位,從失控狀態(tài)又重新進(jìn)入正常運行狀態(tài)。
當WDT計時(shí)溢出時(shí),還會(huì )同時(shí)清除狀態(tài)寄存器中的D4位T0,檢測T0位即可知道復位是否由于WDT計時(shí)溢出引起的?! ~?/P>
知識競賽試題:
24簡(jiǎn)述PIC單片機中看門(mén)狗WDT的作用和功能。 12 E2PROM的使用方法
在PIC16F84單片機中,除了可直接尋址的由SRAM構成的數據存儲器外,還另有可電擦、電寫(xiě)的E2PROM數據存儲器。該E2PROM共有64字節,其地址為00~3FH單元。由于E2PROM具有在線(xiàn)改寫(xiě),并在掉電后仍能保持數據的特點(diǎn),可為用戶(hù)的特殊應用提供方便。16F84的E2PROM在正常操作時(shí)的整個(gè)VDD工作電壓范圍內是可讀寫(xiě)的,典型情況下可重寫(xiě)100萬(wàn)次,數據保存期大于40年。
PIC16F84單片機的E2PROM并未映象在寄存器組空間中,所以它們不能像SRAM通用寄存器那樣用指令直接尋址訪(fǎng)問(wèn),而需要通過(guò)專(zhuān)用寄存器進(jìn)行間接尋址操作。因此,在16F84單片機中增加了以下四個(gè)專(zhuān)用寄存器,即EECON1、EECON2、EEDATA、EEADR,專(zhuān)門(mén)用于片內對E2PROM的操作。該專(zhuān)用寄存器中,EEDATA存放8位讀/寫(xiě)數據,EEADR存放正在被訪(fǎng)問(wèn)的E2PROM存儲單元的地址。
EECON1是只有低五位的控制寄存器,其高三位不存在,讀作“0”。具體見(jiàn)下表。
D7 D6 D5 D4 D3 D2 D1 D0
- - - EEIF WRERR WREN WR RD
控制位RD和WR分別用于讀寫(xiě)操作的啟動(dòng),這兩位可以由軟件置1,以啟動(dòng)讀、寫(xiě)操作,但不能用軟件清零,原因是防止不恰當的軟件操作會(huì )使寫(xiě)入失敗。當讀寫(xiě)操作完成后由硬件自動(dòng)清零,表示此刻未對E2PROM進(jìn)行讀寫(xiě)操作。當WREN位被置1時(shí),允許進(jìn)行寫(xiě)操作,而在上電時(shí)該位被清零。在正常操作時(shí),一旦有MCLR或WDT復位,WRERR位就置1,表示寫(xiě)操作被中止。當寫(xiě)操作完成時(shí),EEIF被置1(需由軟件清零);當寫(xiě)操作未完成或尚未啟動(dòng)時(shí),EEIF為“0”。
EECON2僅是一個(gè)邏輯上的寄存器,而不是一個(gè)物理上存在的寄存器,讀出時(shí)將總是為零。它只在寫(xiě)操作時(shí)起作用。
(1)E2PROM的讀操作
為進(jìn)行一次E2PROM讀操作,需執行如下步驟:
1)將E2PROM的單元地址放入EEADR。2)置RD(EECON的D0位)=1。3)讀取EEDATA寄存器。
程序段舉例,讀取25H處的E2PROM存儲器數據:
…
BCF STATUS,RP0 ;選Bank0
MOVLW 25H
MOVWF EEADR ;地址25H→EEADR
BSF STATUS,RP0 ;選Bank1
BSF EECON1,RD ;啟動(dòng)讀操作
BCF STATUS,RP0 ;選Bank0
MOVF EEDATA,W ;將E2PROM數據
… ;讀入W寄存器
(2)E2PROM的寫(xiě)操作
要進(jìn)行一次E2PROM寫(xiě)操作,需執行如下步驟:
1)將E2PROM單元地址放入EEADR;2)將寫(xiě)入數據放入EEDATA;3)執行一段控制程序段。
例如:將數據99H寫(xiě)入E2PROM的25H單元,需執行下列程序:
…
BCF STATUS,RP0 ;送Bank0
MOVLW 25H
MOVWF EEADR ;地址→EEADR
MOVLW 99H
MOVWF EEDATA ;寫(xiě)入數據→EEDATA
BSF STATUS,RP0??;選Bank1
BSF EECON1,WREN;寫(xiě)操作功能允許
1 BCF INTCON,GIE??;關(guān)閉總中斷
2 MOVLW 0x55
3 MOVWF EECON2
4 MOVLW 0xAA
5 MOVWF EECON2 ;操作EECON2
6 BSF EECON1,WR;啟動(dòng)寫(xiě)操作
7 BSF INTCON,GIE ;開(kāi)放總中斷
…
注意:上列程序中的2~6條各語(yǔ)句必須嚴格執行,否則不能啟動(dòng)E2PROM的寫(xiě)操作。而1~7條則是我們建議用戶(hù)執行的操作,即在E2PROM寫(xiě)操作序列步驟中要關(guān)閉所有中斷,以免這個(gè)序列被中斷打斷。
另外,WREN(EECON1的D2位)是用來(lái)保證E2PROM不會(huì )被意外寫(xiě)入而設置的,所以,在平時(shí),用戶(hù)程序應保持WREN=0以禁止寫(xiě)操作。只有當需對E2PROM寫(xiě)入時(shí)才置WREN=1,并在寫(xiě)入完成后將其恢復為0。用戶(hù)只有置WREN=1后才能置WREN=1啟動(dòng)寫(xiě)操作。上電復位后WREN位自動(dòng)清零。
E2PROM寫(xiě)操作約需10ms的時(shí)間才能完成。用戶(hù)程序可通過(guò)查詢(xún)WR位的狀態(tài)(當WR=0時(shí)表示操作已完成),或者用E2PROM寫(xiě)入完成中斷來(lái)判斷E2PROM寫(xiě)操作是否完成。如要使用中斷,應先置EEIF(INTCON的D6)為1,以開(kāi)中斷。E2PROM寫(xiě)完成要中斷標志位EEIF,只能用軟件清零。
電氣符號相關(guān)文章:電氣符號大全
單片機相關(guān)文章:單片機教程
單片機相關(guān)文章:單片機視頻教程
單片機相關(guān)文章:單片機工作原理
分頻器相關(guān)文章:分頻器原理 塵埃粒子計數器相關(guān)文章:塵埃粒子計數器原理
評論