專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應(yīng)用測試 完善的開發(fā)代碼案例庫分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!
提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力
提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動態(tài)
陳韋中、欉振廷
-作者就讀於逢甲大學(xué)電子工程系 指導(dǎo)老師 蕭敏學(xué)-
前言
近年來由於半導(dǎo)體技術(shù)發(fā)展快速,使得電子產(chǎn)品的製造成本大幅降低,電子產(chǎn)品的使用也逐漸成為日常生活之中人們不可或缺的一部份,由於使用者的需求不同,電子產(chǎn)品也需不斷的求新求變。目前許多電子產(chǎn)品需利用單晶片微電腦(Single
Chip Microcomputer)
作為控制核心,這一類的產(chǎn)品特色在於,只要將寫好的控制程式寫入單晶片的記憶體中,而且在單晶片外接一些週邊的電子元件,就可以形成一個(gè)新的電子產(chǎn)品,這一類電子產(chǎn)品在日常生活中隨處可見,例如生日卡片上的音樂IC、各式遙控器、行動電話,以及家電用品和汽車等其他產(chǎn)品均有單片機(jī)的運(yùn)用,除此之外在個(gè)人電腦(PC)以及相關(guān)週邊也都需利用單片機(jī),另外工業(yè)控制應(yīng)用上更是少不了單片機(jī)。
繼學(xué)習(xí)和使用Intel
MCS-51系列單片機(jī)之後,我們決定再研究Microchip
PIC16F87X系列單片機(jī),以PIC16F877為研究目標(biāo),來探討單片機(jī)微電腦的組成架構(gòu),程式開發(fā)及控制應(yīng)用技術(shù),以此作為基礎(chǔ),再擴(kuò)展於其他類型單晶片的運(yùn)用與應(yīng)用電路設(shè)計(jì)。
簡 介
1.1單片機(jī)基本架構(gòu)
單片機(jī)係指由中央處理單元(CPU),記憶體單元(Memory)及輸入/輸出單元三大部分所組成。其中CPU可分為兩部分,即算數(shù)邏輯(ALU)及控制單元(CU),CPU透過匯流排(BUS)執(zhí)行程式碼的Fetch、Decode、算數(shù)邏輯運(yùn)算及讀寫時(shí)序信號的控制。記憶體單元提供存放程式與資料之空間,包含唯讀記憶體(ROM)與隨機(jī)存取記憶體(RAM)。而輸入/輸出單元提供與外界週邊設(shè)備或元件溝通的管道。
1.1.1單片機(jī)微電腦
單片機(jī)微電腦(Single
Chip
Microcomputer)簡稱為單片機(jī),而所謂單片機(jī)微電腦就是構(gòu)成一部微電腦系統(tǒng)所需的元件,如中央處理單元(CPU)、記憶體單元(Memory)、輸入/輸出(I/O)、時(shí)脈產(chǎn)生單元及相關(guān)週邊裝置製作在同一晶片上,而成為一能夠獨(dú)立運(yùn)作的控制系統(tǒng)。
1.2 PIC16F877 單晶片微電腦
PIC 16F87X系列單晶片是Microchip 公司所推出的產(chǎn)品,它為一顆RISC的八位元微電腦控制單晶片,搭配了高達(dá)8K的採用Flah型式的程式記憶體及5組的I/O PORT,和支援達(dá)14個(gè)中斷。
PIC16F877的特性說明如下:
●採用高性能的RISC CPU核心
●8位元微電腦控制晶片
●8Kx14程式記憶體(Flash)
●368Bytes資料記憶體及256Bytes的EEPROM資料記憶體
●5組I/O ports(A,B,C,D,E)
●2組8位元計(jì)時(shí)/計(jì)數(shù)器Timer0,Timer2,及1組16位元計(jì)時(shí)/計(jì)數(shù)器Timer1
●支援14個(gè)中斷處理
1.3 MPLAB
MPLAB是Microchip 公司對PIC系列單片機(jī)所發(fā)展的一套整合發(fā)展環(huán)境(Integrated Development Environment , IDE) MPLAB包含下列工具:
☆MPLAB Editor─程式編輯器
☆MPASM Assembler─程式組譯器
☆MPLAB-SIM Software Simulator─軟體模擬器
☆MPLAB-ICEMULATOR─硬體模擬器
☆MPLAB-ICD─ICD元件的偵錯(cuò)模擬環(huán)境
II 系統(tǒng)架構(gòu)
2.1 PIC16F87X單片機(jī)核心架構(gòu)
PIC系列單片機(jī)為RISC架構(gòu)單片機(jī),它所採用的Harvard結(jié)構(gòu)和過去一般單晶片所採用的Von
Neumann架構(gòu)最大的差異在於匯流排的改變。Von
Neumann結(jié)構(gòu)是傳統(tǒng)的單晶片結(jié)構(gòu),程式記憶體和資料記憶體是在同一個(gè)記憶體區(qū)塊,記憶體與CPU之間只使用單一匯流排,不論是要對程式記憶體或資料記憶體作存取都是使用此匯流排,因此要完成一個(gè)指令通常必須依序使用匯流排,從指令的擷取、解碼、資料讀取、執(zhí)行到資料的寫入,最後的結(jié)果是一個(gè)指令大都需要等待好幾個(gè)週期才能完成。Harvard結(jié)構(gòu)改善了這樣的缺點(diǎn),主要是程式記憶體和資料記憶體使用不同的記憶體區(qū)塊,而且也有各自獨(dú)立的匯流排,這樣的做法大大的改善了指令執(zhí)行的頻寬,兩個(gè)匯流排可以同時(shí)的工作,最大的優(yōu)點(diǎn)是當(dāng)一個(gè)指令在執(zhí)行時(shí),已經(jīng)可以去抓下一個(gè)指令,因此對於運(yùn)作的效率會有顯著的提昇。
2.2內(nèi)部結(jié)構(gòu)圖
圖2.2為 PIC16F877單片機(jī)的內(nèi)部功能架構(gòu)圖,圖中說明匯流排和各個(gè)功能方塊之間的連接方式,利用架構(gòu)圖可以讓我們對於整個(gè)系統(tǒng)更加的了解。
2.3接腳功能描述
下面列出PIC16F877單片機(jī)的接腳功能與說明。
2.3單片機(jī)的振盪時(shí)脈
振盪時(shí)脈的速度決定了工作的速度,因?yàn)閮?nèi)部所有的動作都是這個(gè)時(shí)脈來驅(qū)動進(jìn)行。PIC16F87X的時(shí)脈輸入是由OSC/CLKIN和OSC2/CLKOUT兩支接腳來輸入的,時(shí)脈的速度可以分成四種模式:
●LP模式─低功率振盪器
●XT模式─振盪器/諧振器
●HS模式─快速振盪器/諧振器
●RC模式─電阻器/電容器
在LP、XT和HS模式之下,通常是使用石英振盪器(Crystal)或是陶瓷諧振器(ceramic
resonator)連接在OSC1/CLKIN和OSC2/CLKOUT這兩支接腳上來產(chǎn)生振盪信號。或是直接用外部的時(shí)脈信號輸入作為單晶片的時(shí)脈,這個(gè)時(shí)脈信號從OSC1/CLKIN接腳輸入單晶片,OSC2/CLKOUT接腳則不使用。
採用RC模式在成本考量會比較低,在實(shí)際的應(yīng)用上只需一個(gè)電容與一個(gè)電阻即可。
2.3.1指令週期與指令流程
工作時(shí)脈是單片機(jī)工作心臟,PIC16F877單片機(jī)時(shí)脈輸入是由OSC1接腳進(jìn)入單晶片,此時(shí)脈進(jìn)入單晶片後會被除以四,以產(chǎn)生四個(gè)不重疊的四相序時(shí)脈Q1~Q4,圖2-1為時(shí)序圖。在程式的執(zhí)行中,程式計(jì)數(shù)器(Program
Counter ,
PC)用來記錄下一個(gè)要被執(zhí)行的指令碼位址,PC值的遞增由Q1上緣觸發(fā),接下來PC中指向位址的程式碼便會被從程式記憶體中擷取出來,並放入指令暫存器(Instruction
Register , IR)
之中,這個(gè)動作是在Q1相序中完成,下依次Q1上緣觸發(fā)來臨時(shí)會觸發(fā)下一個(gè)PC值得擷取,而在同樣的Q2~Q4相序中,剛剛放在IR中的指令會解碼並被執(zhí)行。因此一個(gè)Q1~Q4相序便是一個(gè)指令週期,這種在一個(gè)指令週期中同時(shí)進(jìn)行「指令擷取」與「指令執(zhí)行」的動作架構(gòu),即是所謂管線架構(gòu)(Pipeline),而PIC16F877採用兩層的Pipeline。
2.4記憶體架構(gòu)
PIC16F877單片機(jī)的記憶體配置可分成三個(gè)部分,程式記憶體(Program Memory),資料記憶體(Data Memory)和EEPROM資料記憶體。
2.4.1程式記憶體
PIC16F877單片機(jī)總共具有8K的程式記憶體,程式記憶體以2K的大小為單位分頁(Page),因此共有四個(gè)分頁。其中特別注意記憶體中兩個(gè)位址,一個(gè)是0000h,稱之為「重置向量」(Reset
Vector),這是程式的起始位址,也是單晶片重置後的起始位址;另一個(gè)位只是0004h,稱之為「中斷向量」(Interrupt
Vector),當(dāng)有致能的中斷產(chǎn)生時(shí),程式計(jì)數(shù)器便會將當(dāng)時(shí)的pc值放到堆疊裡,然後跳到此位址,執(zhí)行此位址的指令。圖2.7為程式記憶體配置。
2.4.2資料記憶體
資料記憶體用來儲存程式執(zhí)行時(shí)的資料,PIC16F877單片機(jī)的資料記憶體在`用途上,可分為「特殊功能暫存器」(Special
Function Register)和「一般用途暫存器」(General Purpose
Register)兩種。特殊功能暫存器是單晶片內(nèi)部CPU與各週邊模組所使用的暫存器,由於這些週邊之功能的設(shè)定與使用都是透過記憶體存取的方式來設(shè)定相關(guān)的參數(shù)和存取其內(nèi)容,因此稱為「記憶體映射暫存器」。一般用途暫存器是留給寫程式人自行規(guī)劃使用,作為程式執(zhí)行中一些變數(shù)臨時(shí)儲存之用。
PIC16F877資料記憶體以128Bytes的大小規(guī)劃為一個(gè)Bank,共有四個(gè)Bank,在使用不同Bank中的記憶體位址時(shí),必須先設(shè)定STATUS暫存器中Bank
Select Bit , RP1:RP0STATUS<6:5>。RP1和RP0位元對應(yīng)所選擇Bank的如下:
2.5 ALU與特殊功能暫存器
2.5.1算數(shù)邏輯單元與工作暫存器
PIC16F877單片機(jī)的核心包含一個(gè)8位元的「算數(shù)邏輯單元」(Arithmetic
Logic Unit , ALU)它可以對「工作暫存器」(Working Register ,
W)中的資料和其他暫存器檔案中的資料進(jìn)行算數(shù)與邏輯的運(yùn)算,在運(yùn)算的過程中ALU也控制狀態(tài)位元(位於STATUS暫存器中),用來表示運(yùn)算的結(jié)果狀態(tài)。
「工作暫存器」(Working
Register),即簡稱W暫存器,這是一個(gè)8位元的暫存器,它不屬於資料記憶體的一部份,而是位於CPU之中供ALU在運(yùn)算中使用,因此W暫存器不是一個(gè)記憶體映射暫存器?;旧螦LU中所有的運(yùn)算都會用到W暫存器,但W暫存器是無法定址存取,只能借用所提供的指令來使用。
2.5.2狀態(tài)暫存器
STATUS暫存器,即狀態(tài)暫存器,其內(nèi)容包含了ALU計(jì)算結(jié)果的狀態(tài)、單晶片的重置狀態(tài)以及資料記憶體的選擇位元。
2.5.3程式計(jì)數(shù)器
「程式計(jì)數(shù)器」(Program
counter , PC
)儲存了下一個(gè)所要執(zhí)行指令在程式記憶體中的位址,因此程式計(jì)數(shù)器中的內(nèi)容代表了程式記憶體中某個(gè)位址,所以程式記憶體內(nèi)容的位元寬度和可以定址的位址寬度大小是相同,PIC16F877的程式計(jì)數(shù)器為13位元寬,因此可以定址的程式記憶體大小為8K。PC中13個(gè)位元,可以分成兩部分,較低八個(gè)位元PC<7:0>為PCL,較高五個(gè)位元PC<13:8>為PCH,PCH是我們看不到也無法存取,PCL則是一個(gè)記憶體映射暫存器,位址是0x02而且是一個(gè)unbank的暫存器,也就是透過0x82、0x102和0x182都可以直接使用與存取。
在使用GOTO與CALL指令時(shí),要注意一下希望跳躍到的程式位址是位於程式記憶體的哪一頁(Page)。因?yàn)檫@兩個(gè)指令可用的位址範(fàn)圍為2K,恰為記憶體暫存器一頁的大小,所以這兩個(gè)指令只能在同一頁的程式記憶體內(nèi)範(fàn)圍跳躍。因此當(dāng)所要跳躍的位只有跨頁(Cross
Page)的情形時(shí),必須要根據(jù)目標(biāo)位址在哪一頁,由設(shè)定PCLTH<4:3>這兩個(gè)位元決定。
2.5.4堆疊
在程式的執(zhí)行流程上,有一個(gè)很重要的部分就是「堆疊」的使用,PIC16F877單片機(jī)的內(nèi)部有一個(gè)13位元寬,8層深的硬體堆疊,這個(gè)堆疊的目的是用來放置程式中有中斷或副程式呼叫時(shí),原來程式分歧點(diǎn)的PC內(nèi)容。堆疊的空間並不屬於任何的記憶體空間,而是一塊獨(dú)立的區(qū)塊,而且堆疊的使用時(shí)有一個(gè)堆疊指標(biāo)也不是我們可以讀取與控制的。當(dāng)中斷發(fā)生而且致能位元也有設(shè)定時(shí),當(dāng)時(shí)的PC值便會被放到堆疊之中,然後將PC填入0x04的值,0x04是PIC16877單晶片中斷向量位址,目的是將程式的執(zhí)行轉(zhuǎn)移到中斷起始位址,然後執(zhí)行相對應(yīng)的中斷副程式。在中斷副程式結(jié)束之後,再由堆疊中取回剛剛跳出程式的PC值,繼續(xù)執(zhí)行下去。同樣的使用CALL指令呼叫副程式時(shí),PC值也會放到堆疊中,待副程式執(zhí)行完後再取出。
由於堆疊有八層深,因此程式可以有八層的「跳躍─返回」的動作,依照跳躍的順序先後,將跳躍位置的PC值存入堆疊中,取出PC值時(shí)則依相反的順序,先進(jìn)後出,後進(jìn)先出的方式取出PC值。如果已經(jīng)PUSH了八個(gè)PC值到堆疊中之後,再PUSH一個(gè)PC值到堆疊中,這個(gè)PC值會放到第一個(gè)放入PC值得位置,也就是以循環(huán)的方式來存入PC值,不過PIC的堆疊並沒有任何溢位旗標(biāo)或警告,因此在有好幾層副程式呼叫時(shí),要注意一下堆疊的使用是否溢位。
2.6中斷
在單片機(jī)內(nèi)軟體的流程處理,中斷有其非常重要的角色,中斷允許在主要程式流程中,插入其他事件處理的副程式作優(yōu)先運(yùn)算,並且把運(yùn)算結(jié)果回存到特定暫存器,供主程式運(yùn)算。PIC16F877提供了14個(gè)中斷源,每一個(gè)中斷都有一個(gè)中斷旗標(biāo)位元和一個(gè)中斷致能位元,中斷旗標(biāo)位元表示中斷元是否產(chǎn)生這個(gè)中斷,中斷致能位元決定要不要使用這個(gè)中斷,可經(jīng)使用者利用致能位元作需要的規(guī)劃。這14個(gè)中斷中11個(gè)中斷源屬於週邊模組的中斷,由一個(gè)週邊中斷致能位元PEIE來統(tǒng)一控制所有週邊有關(guān)的中斷使用與否,另外還有3個(gè)中斷位元加上這個(gè)週邊中斷致能位元再由一個(gè)全域中斷致能位元GIE來控制,圖2.9中斷元控制流程。