<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PIC單片機(jī)16F84的內(nèi)部硬件資源

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

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

          成都 衛(wèi)東

            知識競賽試題:
            15簡述PIC系列單片機(jī)助記符指令中操作數(shù)f、d、b、k取值的可能范圍,并簡要說明其依據(jù)。
            16指出PIC16F84單片機(jī)框圖(上文圖1)中寄存器的類型和不能訪問的寄存器名稱?

          3 數(shù)據(jù)存儲器
            在單片機(jī)PIC16F84中,除了有存放程序的程序存儲器外,還有數(shù)據(jù)存儲器。單片機(jī)在執(zhí)行程序過程中,往往需要隨時(shí)向單片機(jī)輸入一些數(shù)據(jù),而且有些數(shù)據(jù)還可能隨時(shí)改變。在這種情況下就需用數(shù)據(jù)存儲器。由于數(shù)據(jù)存儲器不但要能隨時(shí)讀取存放在其各個(gè)單元內(nèi)的數(shù)據(jù),而且還需隨時(shí)寫進(jìn)新的數(shù)據(jù),或改寫原來的數(shù)據(jù)。因此,數(shù)據(jù)存儲器需由隨機(jī)存儲器RAM構(gòu)成。RAM存儲器在斷電時(shí),所存數(shù)據(jù)隨即丟失,這在實(shí)際應(yīng)用中有時(shí)會帶來不便。但是,在16F84單片機(jī)中有64×8位E2PROM數(shù)據(jù)存儲器。存放在E2PROM中的數(shù)據(jù)在斷電時(shí)不會丟失。
            16F84單片機(jī)中的RAM數(shù)據(jù)存儲器如表1所示,該RAM分為兩個(gè)存儲體:即存儲體0(Bank0)和存儲體1(Bank1)。每個(gè)存儲體均可以直接用內(nèi)部總線傳送信息,所以它們都是以寄存器方式工作和尋址。這些八位寄存器,又可分為通用寄存器和專用寄存器兩個(gè)部分。通用寄存器存放數(shù)據(jù),專用寄存器存放控制單片機(jī)運(yùn)作的信息。每個(gè)存儲體最大可擴(kuò)展到7FH(128個(gè)字節(jié))。在每個(gè)存儲體中,專用寄存器被安排在低位地址空間,通用寄存器被安排在高位地址空間。
            通用寄存器用法單一,但專用寄存器卻各有各的用處,現(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è)專用寄存器構(gòu)成。其低八位PCL是一個(gè)可讀/寫寄存器(地址為02H或82H),而高字節(jié)PCH(有效位5位)不能直接進(jìn)行讀/寫操作,它是通過一個(gè)8位的保持寄存器PCLATH(地址為0A或8AH)把高5位地址傳送給程序計(jì)數(shù)器的高字節(jié)。當(dāng)執(zhí)行CALL、GOTO指寫PCL時(shí),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í)行移位指令時(shí),也要用到這一位。
            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位。定時(shí)時(shí)間到標(biāo)志位TO。上電復(fù)位或執(zhí)行CLRWDT、SLEEP指令后被置1,監(jiān)視定時(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位應(yīng)被置為0。
            (3)間接尋址INDF和FSR寄存器
            INDF寄存器不是一個(gè)物理寄存器,而是一個(gè)邏輯功能的寄存器(地址為00H或80H),當(dāng)對INDF寄存器進(jìn)行尋址時(shí),實(shí)際上是訪問FSR寄存器內(nèi)容所指的單元,即把FSR寄存器作為間接寄存器使用。FSR稱為“寄存器選擇”寄存器,地址為(04H或84H)。對INDF寄存器本身進(jìn)行間接尋址訪問,將讀出FSR寄存器的內(nèi)容,例如當(dāng)FSR=00H時(shí),間接尋址讀出INDF的數(shù)據(jù)將為00H。用間接尋址方式寫入INDF寄存器時(shí),雖然寫入操作可能會影響STATUS中的狀態(tài)字,但寫入的數(shù)據(jù)是無效的。 6定時(shí)器/計(jì)數(shù)器TMRO
            PIC單片機(jī)16F84中有一個(gè)定時(shí)器,此定時(shí)器也可用于計(jì)數(shù),因此稱為定時(shí)器/計(jì)數(shù)器,符號為TMRO。TMRO可用于定時(shí)控制、延時(shí)、對外部事件計(jì)數(shù)和檢測等場合。TMRO是一個(gè)8位增量(加1)計(jì)數(shù)器。它在數(shù)據(jù)存貯器中的地址為01。定時(shí)器所用的時(shí)鐘源可以是內(nèi)部系統(tǒng)時(shí)鐘(OSC/4,即四倍振蕩周期),也可以是外部時(shí)鐘。若TMRO對內(nèi)部系統(tǒng)時(shí)鐘的標(biāo)準(zhǔn)脈沖系列進(jìn)行計(jì)數(shù)時(shí),就成為定時(shí)器;對外部脈沖進(jìn)行計(jì)數(shù)時(shí)TMRO就成為計(jì)數(shù)器。
            不管是定時(shí)還是計(jì)數(shù)方式,TMRO在對內(nèi)部時(shí)鐘或?qū)ν獠渴录?jì)數(shù)時(shí),都不占用CPU時(shí)間,除非TMRO溢出,才可能中斷CPU的當(dāng)前操作??梢?,定時(shí)器是單片機(jī)16F84中效率高且工作靈活的部件。
            為了擴(kuò)大定時(shí)或計(jì)數(shù)的范圍,配合TMRO的使用,還有一個(gè)可編程預(yù)定標(biāo)器。此定標(biāo)器實(shí)際上是一個(gè)可編程分頻器。
            TMRO的內(nèi)部結(jié)構(gòu)示意圖如附圖所示。其工作方式由數(shù)據(jù)存儲器中的項(xiàng)選寄存器OPTION控制。OPTION是一個(gè)可讀/寫的寄存器,如附表所示。它含有配置TMRO/WDT預(yù)定標(biāo)器、外部INT中斷、TMRO等的各種控制位。
            TMRO的定時(shí)、計(jì)數(shù)方式是由OPTION寄存器中的D5(即TOCS位)確定。當(dāng)TOCS=0時(shí),工作于定時(shí)器方式;當(dāng)TOCS=1時(shí),工作于計(jì)數(shù)器方式。作定時(shí)器時(shí),每個(gè)指令周期加1(無預(yù)分頻時(shí));而作計(jì)數(shù)器時(shí),則在每個(gè)RA4/TOCKI引腳上電平變化時(shí)加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)時(shí),溢出位送入中斷控制寄存器INTCON。
            由附圖可知,預(yù)分頻器也是一個(gè)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時(shí),所有寫入TMRO的指令,如CLRF 1、MOVWF 1、BSF 1、等都將對預(yù)分頻器清零。需要注意的是,預(yù)分頻器是不能讀寫的。此分頻器可用于TMRO,也可用于WDT,其切換由軟件控制。為了避免意外的芯片復(fù)位,當(dāng)需要切換時(shí),必須執(zhí)行相應(yīng)的一段程序,以下是從WDT切換到TMRO時(shí)所需執(zhí)行的程序:
            CLRWDT   ??;
                       對WDT和預(yù)定標(biāo)器清零
            BSF  STATUS,RP0 ;選中存儲體1
            MOVLWB′xxxx0xxx′;PSA=0,選中TMRO
            MOVWFOPTION  ??;送入OPTION寄存器
            BCF STATUS,RP0;復(fù)位存儲體0

            成都 衛(wèi)東

            知識競賽試題:
            21根據(jù)本版左下文介紹,請以表的形式列出PIC16C8X單片機(jī)(有兩個(gè)存儲體和A、B兩口)至少11個(gè)專用寄存器的名稱和地址。

          4 I/O口
            單片機(jī)作為一個(gè)控制器件必定有數(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ī)芯片有兩個(gè)I/O端口(PROTA和PORTB)。端口A為5位口,端口B為8位口,共占用13位引腳。每個(gè)端口由一個(gè)鎖存器(即數(shù)據(jù)存儲器中的特殊功能寄存器05H、06H單元)、一個(gè)輸出驅(qū)動器和輸入緩沖器等組成。當(dāng)把I/O口作輸出時(shí),數(shù)據(jù)可以鎖存;作輸入口時(shí),數(shù)據(jù)可以緩沖。
            16F84 PORTA口中的RA4是斯密特觸發(fā)輸入、漏極開路輸出。而其它的RA口引腳都是TTL電平輸入和全CMOS驅(qū)動輸出。端口PORTB是一個(gè)八位雙向可編程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”時(shí),其輸出驅(qū)動器(由P溝道和N溝道MOS管串接而成)呈高阻態(tài),即兩個(gè)MOS管均截止,I/O口被定義為輸入。此時(shí),數(shù)據(jù)由I/O端輸入,經(jīng)TTL輸入緩沖器到D觸發(fā)器。當(dāng)執(zhí)行讀指令時(shí),此D觸發(fā)器使能,數(shù)據(jù)經(jīng)三態(tài)門進(jìn)入數(shù)據(jù)總線。
            當(dāng)TRISA的位置為“0”時(shí),I/O口被定義為輸出,此時(shí)輸出鎖存器的輸出電平就是I/O口的輸出電平。
            讀PORTA寄存器的結(jié)果就是讀取I/O引腳上的電平,而寫PORTA寄存器的結(jié)果是寫入I/O鎖存器。所有的寫I/O口的操作都是一個(gè)“讀入/修改/寫入”的過程,即先讀I/O引腳電平,然后由程序修改(按要求給定一個(gè)值),再置入I/O鎖存器。
            PIC16F84單片機(jī)的輸出可提供20mA的電流,所以它可直接驅(qū)動LED。PORTA和PORTB各個(gè)位均可分別定義為輸入和輸出。下面以PORTA口初始化程序的實(shí)例,說明選擇I/O口的方法。
            CLRF PORTA;端口A被清零
            BSF STATUS;狀態(tài)寄存器STATUS的RPO位置為1,選BANK1。
            MOVLW 0xCF;將定向值
                 ??;11001111置入W工作寄存器
            MOVWF TRISA;置RA(3~0)位為輸入
                 ??;RA 54位為輸出
                  ??;TRISA 76位未用
            在使用I/O口時(shí)應(yīng)注意:
            (1)當(dāng)需要一個(gè)I/O口一會做輸入、一會又做輸出時(shí),輸出值會不確定。
            (2)I/O引腳輸出驅(qū)動電路為CMOS互補(bǔ)推挽輸出。當(dāng)其為輸出狀態(tài)時(shí),不能與其它輸出腳接成“線或”或“線與”,否則,會因電流過載燒壞單片機(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í)行程序時(shí),常常要執(zhí)行調(diào)用子程序。這樣就產(chǎn)生了一個(gè)問題:如何記憶是從何處調(diào)用的子程序,以便執(zhí)行子程序之后正確返回。此外,在程序執(zhí)行過程中,還可能會發(fā)生中斷,轉(zhuǎn)而執(zhí)行中斷子程序,這時(shí),又如何記憶從何處中斷,以便返回呢?
            滿足上述功能的方法就是“堆?!奔夹g(shù)。
            “堆?!笔且粋€(gè)用來保存臨時(shí)數(shù)據(jù)的棧區(qū)。當(dāng)主程序調(diào)用子程序時(shí),單片機(jī)執(zhí)行到CALL指令或發(fā)生中斷時(shí),就自動將下一條指令的地址“壓?!北4娴綏^(qū)。當(dāng)子程序結(jié)束,單片機(jī)執(zhí)行返回指令時(shí),就自動地把棧區(qū)的內(nèi)容“彈出”,作為下步指令執(zhí)行的新地址。
            PIC16F84單片機(jī)芯片內(nèi)有一個(gè)8級13位寬(與PC同寬)的硬件堆棧,此堆棧既不占用程序存儲空間,也不占用數(shù)據(jù)存儲空間。當(dāng)執(zhí)行一條CALL指令或一個(gè)中斷被響應(yīng)后,程序計(jì)數(shù)器PC中的斷點(diǎn)地址就自動被壓棧(PUSH)保護(hù),而當(dāng)執(zhí)行RETURN、RETLW或者RETFIE指令時(shí),堆棧中的斷點(diǎn)地址會彈回(POP)程序計(jì)數(shù)器PC中。無論是PUSH還是POP操作,都不影響PCLATH寄存器的內(nèi)容?! ~啥肌⌒l(wèi)東 
            知識競賽試題:
            19簡述PIC單片機(jī)I/O口的功能。
            20PIC16C64A/RL64與PIC16C65的管腳數(shù)相等,管腳功能相近,但PIC16C64A/RL64的{16}腳無CCP2、{25}腳無TX/CK、{26}腳無RX/DT等功能,試?yán)L出PIC16C64A/RL64的管腳功能圖。

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

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

           成都 衛(wèi)東

          知識競賽試題:
            23用簡單的實(shí)例說明中斷在PIC單片機(jī)中的用途。
            編后語:“PIC單片機(jī)系列專題”至今已刊登了十五期,余下還將刊載十期,共計(jì)二十五期。以后的內(nèi)容將主要圍繞PIC單片機(jī)的匯編和實(shí)際應(yīng)用及開發(fā)來展開介紹,歡迎廣大讀者對本專題多提意見和建議。為配合本專題,“《電子報(bào)》單片機(jī)公共實(shí)驗(yàn)室”還為讀者及會員準(zhǔn)備一系列性價(jià)比高,適合初學(xué)者的PIC單片機(jī)、編程器、仿真器,以后本欄目將逐步加以介紹。另外,本專題的“知識競賽”試題將于今年8月13日第32期《電子報(bào)》刊載完畢,歡迎讀者踴躍參加。參加的讀者務(wù)請?jiān)?月5日前,將所有試題按編號回答好后,寄往本報(bào)編輯部,或E-mail至dzb12@netdzb.com。我們將評出一、二、三等獎若干名,分別獎以獎金、PIC開發(fā)器、書刊等(詳情見今年《電子報(bào)》第8期第十一版)。

           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)視定時(shí)器WDT超時(shí)溢出復(fù)位。
            PIC16F84單片機(jī)片內(nèi)集成有“上電復(fù)位”POR電路,對于一般應(yīng)用,只要把MCLR引腳接高電位即可。
            在正常工作或休眠狀態(tài)下用MCLR復(fù)位,只需在MCLR引腳上加一按鍵瞬間接地即可。
            單片機(jī)16F84復(fù)位操作,對其它一些寄存器會有影響,如表1所示。

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

          成都 衛(wèi)東


            知識競賽試題:
            24簡述PIC單片機(jī)中看門狗WDT的作用和功能。

          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在正常操作時(shí)的整個(gè)VDD工作電壓范圍內(nèi)是可讀寫的,典型情況下可重寫100萬次,數(shù)據(jù)保存期大于40年。
            PIC16F84單片機(jī)的E2PROM并未映象在寄存器組空間中,所以它們不能像SRAM通用寄存器那樣用指令直接尋址訪問,而需要通過專用寄存器進(jìn)行間接尋址操作。因此,在16F84單片機(jī)中增加了以下四個(gè)專用寄存器,即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時(shí),允許進(jìn)行寫操作,而在上電時(shí)該位被清零。在正常操作時(shí),一旦有MCLR或WDT復(fù)位,WRERR位就置1,表示寫操作被中止。當(dāng)寫操作完成時(shí),EEIF被置1(需由軟件清零);當(dāng)寫操作未完成或尚未啟動時(shí),EEIF為“0”。
            EECON2僅是一個(gè)邏輯上的寄存器,而不是一個(gè)物理上存在的寄存器,讀出時(shí)將總是為零。它只在寫操作時(shí)起作用。
            (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)閉所有中斷,以免這個(gè)序列被中斷打斷。
            另外,WREN(EECON1的D2位)是用來保證E2PROM不會被意外寫入而設(shè)置的,所以,在平時(shí),用戶程序應(yīng)保持WREN=0以禁止寫操作。只有當(dāng)需對E2PROM寫入時(shí)才置WREN=1,并在寫入完成后將其恢復(fù)為0。用戶只有置WREN=1后才能置WREN=1啟動寫操作。上電復(fù)位后WREN位自動清零。
            E2PROM寫操作約需10ms的時(shí)間才能完成。用戶程序可通過查詢WR位的狀態(tài)(當(dāng)WR=0時(shí)表示操作已完成),或者用E2PROM寫入完成中斷來判斷E2PROM寫操作是否完成。如要使用中斷,應(yīng)先置EEIF(INTCON的D6)為1,以開中斷。E2PROM寫完成要中斷標(biāo)志位EEIF,只能用軟件清零。

            

          電氣符號相關(guān)文章:電氣符號大全


          單片機(jī)相關(guān)文章:單片機(jī)教程


          單片機(jī)相關(guān)文章:單片機(jī)視頻教程


          單片機(jī)相關(guān)文章:單片機(jī)工作原理


          分頻器相關(guān)文章:分頻器原理
          塵埃粒子計(jì)數(shù)器相關(guān)文章:塵埃粒子計(jì)數(shù)器原理


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();