国产精品无码一区二区三区A片_无码狠狠躁久久久久久久91_国产精品久久久久久久_国产99九九久久无码熟妇_国产人妻精品久久久久野外_久久夜色精品国产欧美乱极品_91精品国产色综合久久不卡98口_精品人妻系列无码人妻免费视频

技術(shù)熱線: 4007-888-234
設(shè)計(jì)開發(fā)

專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

開發(fā)工具

提供開發(fā)工具、應(yīng)用測試 完善的開發(fā)代碼案例庫分享

技術(shù)支持

從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力

新聞中心

提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動態(tài)

PIC單片機(jī)16F84內(nèi)部硬件資源

更新時間: 2019-03-21
閱讀量:3294

單片機(jī)開發(fā)商深圳英銳恩分享PIC單片機(jī)16F84內(nèi)部硬件資源,PIC16F84單片機(jī)點(diǎn)亮一只發(fā)光二極管的源程序?qū)嵗菫榱苏f明PIC單片機(jī)16F84具體應(yīng)用時的基本格式。
  現(xiàn)在我們已經(jīng)知道要單片機(jī)工作,就需用匯編語言編制程序。而對某個PIC單片機(jī)編程時,還需對選用的PIC單片機(jī)內(nèi)部硬件資源有所了解。這里介紹PIC16F84單片機(jī)的內(nèi)部結(jié)構(gòu),如圖1所示的框圖。由圖1看出,其基本組成可分為四個主要部分,即運(yùn)算器ALU和工作寄存器W;程序存儲器;數(shù)據(jù)存儲器和輸入/輸出(I/O)口;堆棧存儲器和定時器等?,F(xiàn)分別介紹如下。
  1運(yùn)算器ALU及工作寄存器W
  運(yùn)算器ALU是一個通用算術(shù)、邏輯運(yùn)算單元,用它可以對工作寄存器W和任何通用寄存器中的兩個數(shù)進(jìn)行算術(shù)(如加、減、乘、除等)和邏輯運(yùn)算(如與、或、異或等)。16F84是八位單片機(jī),ALU的字長是八位。在有兩個操作數(shù)的指令中,典型的情況是一個操作數(shù)在工作寄存器W中,而另一個操作數(shù)是在通用寄存器中,或者是一個立即數(shù)。在只有一個操作數(shù)的情況下,該數(shù)要么是在工作寄存器W中,要么是在通用寄存器中。W寄存器是一個專用于ALU操作的寄存器,它是不可尋址的。
  根據(jù)所執(zhí)行的指令,ALU還可能會影響框圖中狀態(tài)寄存器STATUS的進(jìn)位標(biāo)志C、全零標(biāo)志Z等。
  2程序存儲器
  單片機(jī)內(nèi)存放程序指令的存儲器稱為程序存儲器。PIC16F84的所有指令字長為14位。所以程序存儲器的各存儲單元是14位寬。一個存儲單元存放一條指令。16F84的程序存貯器有1024(28)個存儲單元(存儲容量為1k)。這些程序存儲器都是由FPEROM構(gòu)成的。
  程序存儲器是由程序計(jì)數(shù)器PC尋址的。16F84的程序計(jì)數(shù)器為13位寬,可尋址8K(8×1024)的程序存儲器空間,但16F84實(shí)際上只使用了1k的空間(單元地址為0~3FFH)。當(dāng)訪問超過這些地址空間的存儲單元時,將導(dǎo)致循環(huán)回到有效的存儲空間。
  對于用過其它單片機(jī)的用戶,可能會感到16F84的片內(nèi)存儲器容量太少了。實(shí)際上并非如此,因?yàn)?6F84的指令系統(tǒng)都是由單字指令構(gòu)成的,相應(yīng)于其它由二字節(jié)、三字節(jié)甚至四字節(jié)指令的單片機(jī)而言,PIC單片機(jī)的程序存儲器有效容量要比標(biāo)稱值擴(kuò)大25倍到3倍

3  數(shù)據(jù)存儲器
  在單片機(jī)PIC16F84中,除了有存放程序的程序存儲器外,還有數(shù)據(jù)存儲器。單片機(jī)在執(zhí)行程序過程中,往往需要隨時向單片機(jī)輸入一些數(shù)據(jù),而且有些數(shù)據(jù)還可能隨時改變。在這種情況下就需用數(shù)據(jù)存儲器。由于數(shù)據(jù)存儲器不但要能隨時讀取存放在其各個單元內(nèi)的數(shù)據(jù),而且還需隨時寫進(jìn)新的數(shù)據(jù),或改寫原來的數(shù)據(jù)。因此,數(shù)據(jù)存儲器需由隨機(jī)存儲器RAM構(gòu)成。RAM存儲器在斷電時,所存數(shù)據(jù)隨即丟失,這在實(shí)際應(yīng)用中有時會帶來不便。但是,在16F84單片機(jī)中有64×8位E2PROM數(shù)據(jù)存儲器。存放在E2PROM中的數(shù)據(jù)在斷電時不會丟失。
  16F84單片機(jī)中的RAM數(shù)據(jù)存儲器如表1所示,該RAM分為兩個存儲體:即存儲體0(Bank0)和存儲體1(Bank1)。每個存儲體均可以直接用內(nèi)部總線傳送信息,所以它們都是以寄存器方式工作和尋址。這些八位寄存器,又可分為通用寄存器和專用寄存器兩個部分。通用寄存器存放數(shù)據(jù),專用寄存器存放控制單片機(jī)運(yùn)作的信息。每個存儲體最大可擴(kuò)展到7FH(128個字節(jié))。在每個存儲體中,專用寄存器被安排在低位地址空間,通用寄存器被安排在高位地址空間。
  通用寄存器用法單一,但專用寄存器卻各有各的用處,現(xiàn)將較基本的專用寄存器作一簡單介紹。
  (1)程序計(jì)數(shù)器(PCL、PCLATH)。程序計(jì)數(shù)器PC是對程序進(jìn)行管理的計(jì)數(shù)器。PIC16F84的程序計(jì)數(shù)器為13位寬,最大可尋址的存儲空間為8k×14位。實(shí)際上16F84只使用前1k×14位(0000~03FFH)存儲空間。因程序計(jì)數(shù)器有13位寬,而專用寄存器只有8位。因此PC由兩個專用寄存器構(gòu)成。其低八位PCL是一個可讀/寫寄存器(地址為02H或82H),而高字節(jié)PCH(有效位5位)不能直接進(jìn)行讀/寫操作,它是通過一個8位的保持寄存器PCLATH(地址為0A或8AH)把高5位地址傳送給程序計(jì)數(shù)器的高字節(jié)。當(dāng)執(zhí)行CALL、GOTO指寫PCL時,PC值的高字節(jié)就從PCLATH寄存器中裝入。
  (2)狀態(tài)寄存器STATUS。狀態(tài)寄存器STATUS含有算術(shù)邏輯單元ALU運(yùn)算結(jié)果的狀態(tài)(如有無進(jìn)位等)、復(fù)位狀態(tài)及數(shù)據(jù)存儲體選擇位。有關(guān)位位的設(shè)定如表2所示,功能如下:
  1)第0位。進(jìn)位/借位位C。執(zhí)行加、減運(yùn)算指令
表2  
 IRP RP1 RP0 TO PD Z DC C
后,若結(jié)果有進(jìn)位或借位,則C被置1,否則置0。在執(zhí)行移位指令時,也要用到這一位。
  2)第1位。輔助進(jìn)位/借位位DC。執(zhí)行加、減運(yùn)算指令后,若結(jié)果的低四位向高四位有進(jìn)位或借位,則DC置1,否則置0。
  3)第2位。零標(biāo)志位運(yùn)算結(jié)果為零,Z被置1;運(yùn)算結(jié)果不為零,Z被清零。
  4)第3位。低功耗標(biāo)志位PD。上電復(fù)位或執(zhí)行CLRWDT指令后置1,執(zhí)行SLEEP指令后被清零。
  5)第4位。定時時間到標(biāo)志位TO。上電復(fù)位或執(zhí)行CLRWDT、SLEEP指令后被置1,監(jiān)視定時器的定時時間到被清零。
  6)第5位和第6位(RP0、RP1)。這兩位是用于直接尋址時的寄存器體選擇位。即00——選中Bank0(00H~7FH);01——選中Bank1(80H~FFH),16F84只有兩個存儲體。故10、11不用。
  7)第7位IRP。這是間接尋址的寄存體選擇位。0——選中Bank0、1(00H~FFH),1——選中Bank2、3。16F84只有Bank0、1,所以此IRP位應(yīng)被置為0。
  (3)間接尋址INDF和FSR寄存器
  INDF寄存器不是一個物理寄存器,而是一個邏輯功能的寄存器(地址為00H或80H),當(dāng)對INDF寄存器進(jìn)行尋址時,實(shí)際上是訪問FSR寄存器內(nèi)容所指的單元,即把FSR寄存器作為間接寄存器使用。FSR稱為“寄存器選擇”寄存器,地址為(04H或84H)。對INDF寄存器本身進(jìn)行間接尋址訪問,將讀出FSR寄存器的內(nèi)容,例如當(dāng)FSR=00H時,間接尋址讀出INDF的數(shù)據(jù)將為00H。用間接尋址方式寫入INDF寄存器時,雖然寫入操作可能會影響STATUS中的狀態(tài)字,但寫入的數(shù)據(jù)是無效的。

4  I/O口
  單片機(jī)作為一個控制器件必定有數(shù)據(jù)輸入和輸出。輸入量可能是溫度、壓力、轉(zhuǎn)速等,而輸出量可能是開關(guān)量和數(shù)據(jù),以保證受控過程在規(guī)定的范圍內(nèi)運(yùn)行。數(shù)據(jù)的輸入和輸出都需通過單片機(jī)內(nèi)部有關(guān)電路,再與引腳構(gòu)成輸入/輸出(I/O)端口。PIC16F84單片機(jī)芯片有兩個I/O端口(PROTA和PORTB)。端口A為5位口,端口B為8位口,共占用13位引腳。每個端口由一個鎖存器(即數(shù)據(jù)存儲器中的特殊功能寄存器05H、06H單元)、一個輸出驅(qū)動器和輸入緩沖器等組成。當(dāng)把I/O口作輸出時,數(shù)據(jù)可以鎖存;作輸入口時,數(shù)據(jù)可以緩沖。
  16F84 PORTA口中的RA4是斯密特觸發(fā)輸入、漏極開路輸出。而其它的RA口引腳都是TTL電平輸入和全CMOS驅(qū)動輸出。端口PORTB是一個八位雙向可編程I/O口。各端口雖然也由鎖存器、驅(qū)動器、緩沖器等構(gòu)成,但因功能略有不同而導(dǎo)致電路亦存在差別?,F(xiàn)以PORTA口的RA0 ~RA3的電路(見左圖)為例,說明其基本工作原理。
  圖中RA口的I/O引腳是由數(shù)據(jù)方向位(寄存器TRISA)來定義數(shù)據(jù)流向。當(dāng)TRISA寄存器的位置為“1”時,其輸出驅(qū)動器(由P溝道和N溝道MOS管串接而成)呈高阻態(tài),即兩個MOS管均截止,I/O口被定義為輸入。此時,數(shù)據(jù)由I/O端輸入,經(jīng)TTL輸入緩沖器到D觸發(fā)器。當(dāng)執(zhí)行讀指令時,此D觸發(fā)器使能,數(shù)據(jù)經(jīng)三態(tài)門進(jìn)入數(shù)據(jù)總線。
  當(dāng)TRISA的位置為“0”時,I/O口被定義為輸出,此時輸出鎖存器的輸出電平就是I/O口的輸出電平。
  讀PORTA寄存器的結(jié)果就是讀取I/O引腳上的電平,而寫PORTA寄存器的結(jié)果是寫入I/O鎖存器。所有的寫I/O口的操作都是一個“讀入/修改/寫入”的過程,即先讀I/O引腳電平,然后由程序修改(按要求給定一個值),再置入I/O鎖存器。
  PIC16F84單片機(jī)的輸出可提供20mA的電流,所以它可直接驅(qū)動LED。PORTA和PORTB各個位均可分別定義為輸入和輸出。下面以PORTA口初始化程序的實(shí)例,說明選擇I/O口的方法。
  CLRF PORTA;端口A被清零
  BSF STATUS;狀態(tài)寄存器STATUS的RPO位置為1,選BANK1。
  MOVLW 0xCF  ;將定向值
          ;11001111置入W工作寄存器
  MOVWF TRISA;置RA(3~0)位為輸入
       ?。籖A 54位為輸出
        ??;TRISA 76位未用
  在使用I/O口時應(yīng)注意:
  (1)當(dāng)需要一個I/O口一會做輸入、一會又做輸出時,輸出值會不確定。
  (2)I/O引腳輸出驅(qū)動電路為CMOS互補(bǔ)推挽輸出。當(dāng)其為輸出狀態(tài)時,不能與其它輸出腳接成“線或”或“線與”,否則,會因電流過載燒壞單片機(jī)。
  (3)當(dāng)對I/O口進(jìn)行寫操作后不宜直接進(jìn)行讀操作,一般要求在兩條連續(xù)的寫、讀指令間至少加入一條NOP指令。
  例:MOVWF 6 ;寫I/O
     NOP        ;穩(wěn)定I/O電平
    MOVF 6,W;讀I/O
  5堆棧
  單片機(jī)執(zhí)行程序時,常常要執(zhí)行調(diào)用子程序。這樣就產(chǎn)生了一個問題:如何記憶是從何處調(diào)用的子程序,以便執(zhí)行子程序之后正確返回。此外,在程序執(zhí)行過程中,還可能會發(fā)生中斷,轉(zhuǎn)而執(zhí)行中斷子程序,這時,又如何記憶從何處中斷,以便返回呢?
  滿足上述功能的方法就是“堆棧”技術(shù)。
  “堆棧”是一個用來保存臨時數(shù)據(jù)的棧區(qū)。當(dāng)主程序調(diào)用子程序時,單片機(jī)執(zhí)行到CALL指令或發(fā)生中斷時,就自動將下一條指令的地址“壓棧”保存到棧區(qū)。當(dāng)子程序結(jié)束,單片機(jī)執(zhí)行返回指令時,就自動地把棧區(qū)的內(nèi)容“彈出”,作為下步指令執(zhí)行的新地址。
  PIC16F84單片機(jī)芯片內(nèi)有一個8級13位寬(與PC同寬)的硬件堆棧,此堆棧既不占用程序存儲空間,也不占用數(shù)據(jù)存儲空間。當(dāng)執(zhí)行一條CALL指令或一個中斷被響應(yīng)后,程序計(jì)數(shù)器PC中的斷點(diǎn)地址就自動被壓棧(PUSH)保護(hù),而當(dāng)執(zhí)行RETURN、RETLW或者RETFIE指令時,堆棧中的斷點(diǎn)地址會彈回(POP)程序計(jì)數(shù)器PC中。無論是PUSH還是POP操作,都不影響PCLATH寄存器的內(nèi)容?!?/p>

6定時器/計(jì)數(shù)器TMRO
  PIC單片機(jī)16F84中有一個定時器,此定時器也可用于計(jì)數(shù),因此稱為定時器/計(jì)數(shù)器,符號為TMRO。TMRO可用于定時控制、延時、對外部事件計(jì)數(shù)和檢測等場合。TMRO是一個8位增量(加1)計(jì)數(shù)器。它在數(shù)據(jù)存貯器中的地址為01。定時器所用的時鐘源可以是內(nèi)部系統(tǒng)時鐘(OSC/4,即四倍振蕩周期),也可以是外部時鐘。若TMRO對內(nèi)部系統(tǒng)時鐘的標(biāo)準(zhǔn)脈沖系列進(jìn)行計(jì)數(shù)時,就成為定時器;對外部脈沖進(jìn)行計(jì)數(shù)時TMRO就成為計(jì)數(shù)器。
  不管是定時還是計(jì)數(shù)方式,TMRO在對內(nèi)部時鐘或?qū)ν獠渴录?jì)數(shù)時,都不占用CPU時間,除非TMRO溢出,才可能中斷CPU的當(dāng)前操作。可見,定時器是單片機(jī)16F84中效率高且工作靈活的部件。
  為了擴(kuò)大定時或計(jì)數(shù)的范圍,配合TMRO的使用,還有一個可編程預(yù)定標(biāo)器。此定標(biāo)器實(shí)際上是一個可編程分頻器。
  TMRO的內(nèi)部結(jié)構(gòu)示意圖如附圖所示。其工作方式由數(shù)據(jù)存儲器中的項(xiàng)選寄存器OPTION控制。OPTION是一個可讀/寫的寄存器,如附表所示。它含有配置TMRO/WDT預(yù)定標(biāo)器、外部INT中斷、TMRO等的各種控制位。
  TMRO的定時、計(jì)數(shù)方式是由OPTION寄存器中的D5(即TOCS位)確定。當(dāng)TOCS=0時,工作于定時器方式;當(dāng)TOCS=1時,工作于計(jì)數(shù)器方式。作定時器時,每個指令周期加1(無預(yù)分頻時);而作計(jì)數(shù)器時,則在每個RA4/TOCKI引腳上電平變化時加1。OPTION寄存器的位4(TOCS位)決定外部脈沖的觸發(fā)方式,當(dāng)TOSE=1,下降沿觸發(fā);TOSE=0,上升沿觸發(fā)。當(dāng)TMRO內(nèi)部計(jì)數(shù)器發(fā)生計(jì)數(shù)溢出(從FFh→00h)時,溢出位送入中斷控制寄存器INTCON。
  由附圖可知,預(yù)分頻器也是一個8位計(jì)數(shù)器。其分頻數(shù)是由OPTION寄存器中的PS2~PS0三位值來改變。分頻數(shù)可以是以下8種之一:1∶1、1∶2、1∶4、1∶8、1∶16、1∶32、1∶64和1∶128。
  當(dāng)分頻器用于TMRO時,所有寫入TMRO的指令,如CLRF 1、MOVWF 1、BSF 1、等都將對預(yù)分頻器清零。需要注意的是,預(yù)分頻器是不能讀寫的。此分頻器可用于TMRO,也可用于WDT,其切換由軟件控制。為了避免意外的芯片復(fù)位,當(dāng)需要切換時,必須執(zhí)行相應(yīng)的一段程序,以下是從WDT切換到TMRO時所需執(zhí)行的程序:
  CLRWDT         ;
             對WDT和預(yù)定標(biāo)器清零
  BSF      STATUS,RP0 ;選中存儲體1
  MOVLW  B′xxxx0xxx′   ;PSA=0,選中TMRO
  MOVWF  OPTION  ?。凰腿隣PTION寄存器
  BCF    STATUS,RP0  ;復(fù)位存儲體0

7   延時和定時
  在設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)時,經(jīng)常會遇到需要使某一過程(如加溫、加壓等)持續(xù)一段時間的情況,如連續(xù)加壓1分鐘,通電2分鐘等。單片機(jī)如何正確確定這段時間呢?這里可通過兩種方式,即延時和定時來實(shí)現(xiàn)。試看下例。
  在應(yīng)用系統(tǒng)中要求PIC16F84單片機(jī)的RAO端控制一個發(fā)光二極管按一定頻率閃亮,可通過電路來實(shí)現(xiàn)。同時還必須為16F84單片機(jī)編制一個程序。由電路圖可知,要使發(fā)光二極管LED按一定的頻率閃亮,只要使RAO端輸出一個變化的高→低→高……電平即可。由此設(shè)計(jì)出如下的源程序(清單1):
  list P=16F84,F(xiàn)=INHX8M
 ??;……
     ORG   0
     MOVLW 0 ;主程序開始
     TRIS  5   ;置RA口為輸出
     BCF   5,0   ;RA口0位清零
  LOOP:CALL  DELAY;閃動延時
     COMF 5   ;RA口求反,亮—滅交替
     GOTO LOOP   ;循環(huán)
  ;……
  DELAY      ;以下為延時子程序
      MOVLW  D′50
      MOVWF   8
  LOOP1:MOVWF   9
  LOOP2:DECFSZ   9,F(xiàn)
      GOTO   LOOP2
     DECFSZ   8,F(xiàn)
     GOTO    LOOP1
  RETLW       0
  由清單1可知,當(dāng)主程序開始時,首先將工作寄存器W清零,然后將W寄存器的內(nèi)容送TRISA寄存器,使其清零,以設(shè)置RA口為輸出。接著又將RA口的第5位清零,使LED開始時處于熄滅狀態(tài)。隨之持續(xù)一段時間,即執(zhí)行延時子程序,再將RA口取反,變?yōu)楦唠娖捷敵觯琇ED發(fā)光,再延時,又使RA口取反,LED熄滅……。這樣,LED就一暗一亮,持續(xù)交替進(jìn)行。
  在這里,使LED亮、暗持續(xù)一段時間是通過單片機(jī)執(zhí)行延時子程序DELAY來實(shí)現(xiàn)的。此延時程序的核心就是讓單片機(jī)的CPU反復(fù)執(zhí)行使寄存器內(nèi)容減1的指令DECFSZ。即將十進(jìn)制數(shù)50分別裝入通用寄存器F8、F9,以進(jìn)行50×50=2500次的減1操作。如果執(zhí)行一次DECFSZ指令需1個指令周期(跳轉(zhuǎn)時需2個周期),若設(shè)振蕩頻率為100kHz,即指令周期為40μs,則延時時間為2500×40=100000μs=100ms,即01秒。實(shí)際上還略為大些。此延時時間已超過人眼的視覺保留時間。因而能看清LED的明、暗交替變化。
  如果我們需要更長的延時時間,可仿照上例,裝入更大的數(shù)或引入多重循環(huán)。因此,在原則上,延時時間可根據(jù)需要任意延長。
  不過,采用延時程序來持續(xù)某一過程的方式有缺陷。延時就是使CPU在某幾條指令上“轉(zhuǎn)圈”,延時越長,“轉(zhuǎn)圈”數(shù)越多,這時,CPU不能再去執(zhí)行其它操作,如監(jiān)視溫度、濕度等。這在某些實(shí)時控制系統(tǒng)中,不允許這樣做。為此,在單片機(jī)16F84單片機(jī)中,專門設(shè)置了一個“鬧鐘”——定時器TMR0。需要某過程延續(xù)多長時間,可將其“撥入”TMR0,到時它會發(fā)生“中斷”,告訴CPU定時時間到。要CPU暫停其它工作,轉(zhuǎn)過來執(zhí)行“中斷子程序”,完成輸出開、關(guān)信號之類的任務(wù)后,再回去執(zhí)行其中斷的工作。這樣,就使CPU的工作效率提高。因而,延時的使用有局限性,采用定時器TMR0則可用于各種場合中。

8  中斷
  PIC單片機(jī)16F84具有實(shí)時處理功能,能對外界異常發(fā)生的事件由中斷技術(shù)作及時處理。
  當(dāng)單片機(jī)的CPU正在處理某事件時,若外部發(fā)生了某一事件(如定時器溢出、引腳上電平變化),請求CPU迅速去處理,于是CPU就暫時中止當(dāng)前的工作,轉(zhuǎn)去處理所發(fā)生的事件。中斷處理完該事件后,再回到原來被中止的地方,繼續(xù)執(zhí)行原來的工作,如圖1所示。實(shí)現(xiàn)這種功能的部件稱為中斷系統(tǒng)。產(chǎn)生中斷的請求源稱為中斷源。中斷源向CPU提出的處理請求,稱為中斷請求或中斷申請。CPU暫時中斷自身的事務(wù),轉(zhuǎn)去處理事件的過程,稱為CPU的中斷響應(yīng)過程。對事件的整個處理過程,稱為中斷服務(wù)(或中斷處理)。處理完畢,再回到原來被中止的地方,稱為中斷返回。
  PIC16F84單片機(jī)芯片有4種中斷源,其邏輯電路如圖2所示。

  9中斷控制
  中斷主要由中斷控制寄存器INTCON(圖3)來控制。INTCON是一個可讀/寫寄存器,含有定時器TMRO溢出、RB口的變化和外部INT引腳中斷等各種允許控制和標(biāo)志位。
  全局中斷允許位GIE(D7)置1,將開放所有未被屏蔽的中斷,如將該位清零,將禁止所有的中斷。在響應(yīng)中斷時,GIE位將被清零,以禁止其它中斷,返回的斷點(diǎn)地址被壓棧保護(hù),接著把中斷入口地址0004h裝入程序計(jì)數(shù)器PC。在中斷服務(wù)程序中,通過對中斷標(biāo)志位進(jìn)行查詢,確定中斷標(biāo)志位必須在重新開放中斷之前用軟件清零,以避免不斷地中斷申請而反復(fù)進(jìn)入中斷。
  (1)INT中斷。RBO/INT引腳上的外部中斷由邊沿觸發(fā),當(dāng)INTEDG位(OPTION寄存器第6位)被置1時,選用上升沿觸發(fā),如該位被清零,則由下降沿觸發(fā)。當(dāng)檢測到引腳上有規(guī)定的有效邊沿時,便把INTE位(INTCON的D4位)置1。在重新開放這個中斷之前,必須在中斷服務(wù)程序中對INTE位清零?! ?2)TMRO中斷。當(dāng)定時器TMRO的計(jì)數(shù)器計(jì)滿溢出(即由FFH變成00H)時,硬件自動把TOIF(INTCON的D2位)置1。其中斷可以通過對TOIE(INTCOND的D5位)置1或清零來控制該中斷是否開放。
  (3)PORTB口引腳電平變化中斷。在PORTB口的D7~D0引腳上一旦有電平變化,就會把RBIF(INTCON的D0位)置1。這個中斷可以通過對RBIE(INTCON的D3位)置1或清零來控制該中斷是否開放。
  (4)中斷的現(xiàn)場保護(hù)。在發(fā)生中斷時,只有返回斷點(diǎn)的地址被壓棧保護(hù)。若用戶還希望保護(hù)關(guān)鍵的寄存器(如W寄存器和STATUS寄存器)。這需要由軟件來實(shí)現(xiàn)。有關(guān)中斷的現(xiàn)場保護(hù),請參看本報第15期有關(guān)PIC單片機(jī)指令識讀中的實(shí)例。

10  復(fù)位
  復(fù)位是單片機(jī)的初始化操作。其主要功能是把程序計(jì)數(shù)器PCL初始化為000H,可使16F84單片機(jī)從000H單元開始執(zhí)行程序。
  PIC16F84單片機(jī)有下列幾種不同的復(fù)位方式。
  (1)芯片上電復(fù)位POR。
  (2)正常工作狀態(tài)下通過外部MCLR引腳加低電平復(fù)位。
  (3)在省電休眠狀態(tài)下通過外部MCLR引腳加低電平復(fù)位。
  (4)監(jiān)視定時器WDT超時溢出復(fù)位。
  PIC16F84單片機(jī)片內(nèi)集成有“上電復(fù)位”POR電路,對于一般應(yīng)用,只要把MCLR引腳接高電位即可。
  在正常工作或休眠狀態(tài)下用MCLR復(fù)位,只需在MCLR引腳上加一按鍵瞬間接地即可。
  單片機(jī)16F84復(fù)位操作,對其它一些寄存器會有影響,如表1所示。

  11監(jiān)視定時器WDT
  單片機(jī)系統(tǒng)常用于工業(yè)控制,在操作現(xiàn)場通常會有各種干擾,可能會使執(zhí)行程序彈飛到一種死循環(huán),從而導(dǎo)致整個單片機(jī)控制系統(tǒng)癱瘓。如果操作者在場,就可進(jìn)行人工復(fù)位,擺脫死循環(huán)。但操作者不能一直監(jiān)視著系統(tǒng),即使監(jiān)視著系統(tǒng),也往往是引起不良后果之后才進(jìn)行人工復(fù)位。由于PIC16F84單片機(jī)中具有程序運(yùn)行自動監(jiān)視系統(tǒng),即監(jiān)視定時器WDT(Watch Dog Time),直譯為“看門狗”定時器。這好比是主人養(yǎng)了一條狗,主人在正常干活時總不忘每隔一段時間就給狗喂食,狗就保持安靜,不影響主人干活。如果主人打嗑睡,不干活了,到一定時間,狗餓了,發(fā)現(xiàn)主人還沒有給它吃東西,就會大叫起來,把主人喚醒。由此可見,WDT有如下特性:
  (1)本身能獨(dú)立工作,基本上不依賴CPU。
  (2)CPU在一個固定的時間間隔中和WDT打一次交通(如使其清零,即喂一次狗),以表明系統(tǒng)目前工作正常。
  (3)當(dāng)CPU落入死循環(huán)后,能被WDT及時發(fā)覺(如WDT計(jì)數(shù)溢出),并使系統(tǒng)復(fù)位。
  PIC16F84單片機(jī)內(nèi)的WDT,其定時計(jì)數(shù)的脈沖序列由片內(nèi)獨(dú)立的RC振蕩器產(chǎn)生,所以它不需要外接任何器件就可以工作。而且這個片內(nèi)RC振蕩器與OSC1/CLKIN(引腳{16})上的振蕩電路無關(guān),即使OSC1和OSC2上的時鐘不工作,WDT照樣可以監(jiān)視定時。例如:當(dāng)PIC16F84在執(zhí)行SLEEP指令后,芯片進(jìn)入休眠狀態(tài),CPU不工作,主振蕩器也停止工作,但是,WDT照樣可監(jiān)視定時。當(dāng)WDT超時溢出后,可激活(喚醒)芯片繼續(xù)正常的操作。而在正常操作期間,WDT超時溢出將產(chǎn)生一個復(fù)位信號。如果不需要這種監(jiān)視定時功能,在固化編程時,可關(guān)閉這個功能。附圖是監(jiān)視定時器的結(jié)構(gòu)框圖。表2是與WDT有關(guān)的寄存器。
  WDT的定時周期在不加分頻器的情況下,其基本定時時間是18ms,這個定時時間還受溫度、VDD和不同元器件的工藝參數(shù)等的影響。如果需要更長的定時周期,還可以通過軟件控制OPT/ON寄存器把預(yù)分頻器配置給WDT,這個預(yù)分頻器的最大分頻比可達(dá)到1∶128。這樣就可把定時周期擴(kuò)大128倍,即達(dá)到23秒。
  如果把預(yù)分頻器配置給WDT,用CLRWDT和SLEEP指令可以同時對WDT和預(yù)分頻器清零,從而防止計(jì)時溢出引起芯片復(fù)位。所以在正常情況下,必須在每次計(jì)時溢出之前執(zhí)行一條CLRWDT指令(即喂一次“狗”),以避免引起芯片復(fù)位。當(dāng)系統(tǒng)受到嚴(yán)重干擾處于失控狀態(tài)時,就不可能在每次計(jì)時溢出之前執(zhí)行一條CLR WDT指令,WDT就產(chǎn)生計(jì)時溢出,從而引起芯片復(fù)位,從失控狀態(tài)又重新進(jìn)入正常運(yùn)行狀態(tài)。
  當(dāng)WDT計(jì)時溢出時,還會同時清除狀態(tài)寄存器中的D4位T0,檢測T0位即可知道復(fù)位是否由于WDT計(jì)時溢出引起的。  

12  E2PROM的使用方法
  在PIC16F84單片機(jī)中,除了可直接尋址的由SRAM構(gòu)成的數(shù)據(jù)存儲器外,還另有可電擦、電寫的E2PROM數(shù)據(jù)存儲器。該E2PROM共有64字節(jié),其地址為00~3FH單元。由于E2PROM具有在線改寫,并在掉電后仍能保持?jǐn)?shù)據(jù)的特點(diǎn),可為用戶的特殊應(yīng)用提供方便。16F84的E2PROM在正常操作時的整個VDD工作電壓范圍內(nèi)是可讀寫的,典型情況下可重寫100萬次,數(shù)據(jù)保存期大于40年。
  PIC16F84單片機(jī)的E2PROM并未映象在寄存器組空間中,所以它們不能像SRAM通用寄存器那樣用指令直接尋址訪問,而需要通過專用寄存器進(jìn)行間接尋址操作。因此,在16F84單片機(jī)中增加了以下四個專用寄存器,即EECON1、EECON2、EEDATA、EEADR,專門用于片內(nèi)對E2PROM的操作。該專用寄存器中,EEDATA存放8位讀/寫數(shù)據(jù),EEADR存放正在被訪問的E2PROM存儲單元的地址。
  EECON1是只有低五位的控制寄存器,其高三位不存在,讀作“0”。具體見下表。
  D7 D6 D5 D4  D3  D2 D1 D0
   -  -  - EEIF WRERR WREN WR RD
  控制位RD和WR分別用于讀寫操作的啟動,這兩位可以由軟件置1,以啟動讀、寫操作,但不能用軟件清零,原因是防止不恰當(dāng)?shù)能浖僮鲿箤懭胧?。?dāng)讀寫操作完成后由硬件自動清零,表示此刻未對E2PROM進(jìn)行讀寫操作。當(dāng)WREN位被置1時,允許進(jìn)行寫操作,而在上電時該位被清零。在正常操作時,一旦有MCLR或WDT復(fù)位,WRERR位就置1,表示寫操作被中止。當(dāng)寫操作完成時,EEIF被置1(需由軟件清零);當(dāng)寫操作未完成或尚未啟動時,EEIF為“0”。
  EECON2僅是一個邏輯上的寄存器,而不是一個物理上存在的寄存器,讀出時將總是為零。它只在寫操作時起作用。
  (1)E2PROM的讀操作
  為進(jìn)行一次E2PROM讀操作,需執(zhí)行如下步驟:
  1)將E2PROM的單元地址放入EEADR。2)置RD(EECON的D0位)=1。3)讀取EEDATA寄存器。
  程序段舉例,讀取25H處的E2PROM存儲器數(shù)據(jù):
  …
  BCF   STATUS,RP0 ;選Bank0
  MOVLW 25H
  MOVWF EEADR   ;地址25H→EEADR
  BSF   STATUS,RP0 ;選Bank1
  BSF EECON1,RD ;啟動讀操作
  BCF STATUS,RP0 ;選Bank0
  MOVF EEDATA,W ;將E2PROM數(shù)據(jù)
        …   ;讀入W寄存器
  (2)E2PROM的寫操作
  要進(jìn)行一次E2PROM寫操作,需執(zhí)行如下步驟:
  1)將E2PROM單元地址放入EEADR;2)將寫入數(shù)據(jù)放入EEDATA;3)執(zhí)行一段控制程序段。
  例如:將數(shù)據(jù)99H寫入E2PROM的25H單元,需執(zhí)行下列程序:
       …
  BCF   STATUS,RP0 ;送Bank0
  MOVLW 25H
  MOVWF EEADR    ;地址→EEADR
  MOVLW 99H
  MOVWF EEDATA   ;寫入數(shù)據(jù)→EEDATA
  BSF   STATUS,RP0 ;選Bank1
  BSF   EECON1,WREN;寫操作功能允許
  1 BCF   INTCON,GIE??;關(guān)閉總中斷
  2 MOVLW 0x55
  3 MOVWF EECON2
  4 MOVLW 0xAA
  5 MOVWF EECON2 ;操作EECON2
  6 BSF  EECON1,WR;啟動寫操作
  7 BSF   INTCON,GIE ;開放總中斷
    …
  注意:上列程序中的2~6條各語句必須嚴(yán)格執(zhí)行,否則不能啟動E2PROM的寫操作。而1~7條則是我們建議用戶執(zhí)行的操作,即在E2PROM寫操作序列步驟中要關(guān)閉所有中斷,以免這個序列被中斷打斷。
  另外,WREN(EECON1的D2位)是用來保證E2PROM不會被意外寫入而設(shè)置的,所以,在平時,用戶程序應(yīng)保持WREN=0以禁止寫操作。只有當(dāng)需對E2PROM寫入時才置WREN=1,并在寫入完成后將其恢復(fù)為0。用戶只有置WREN=1后才能置WREN=1啟動寫操作。上電復(fù)位后WREN位自動清零。
  E2PROM寫操作約需10ms的時間才能完成。用戶程序可通過查詢WR位的狀態(tài)(當(dāng)WR=0時表示操作已完成),或者用E2PROM寫入完成中斷來判斷E2PROM寫操作是否完成。如要使用中斷,應(yīng)先置EEIF(INTCON的D6)為1,以開中斷。E2PROM寫完成要中斷標(biāo)志位EEIF,只能用軟件清零。