當前位置:
首頁 > 科技 > 通俗易懂講PIC單片機:從一竅不通到入門進步

通俗易懂講PIC單片機:從一竅不通到入門進步

單片機入門不難------談PIC系列(轉自礦石收音機論壇---嶗山)十年前的老帖子,講得通俗易懂,分享之。

請看圖1

通俗易懂講PIC單片機:從一竅不通到入門進步

這個8條腿的小螃蟹就是我們的第一頓飯,只要把它吃下去,以後的大餐就好辦了。

第1、8條腿接電源 +5V 和 地線。頭兩條腿是螃蟹鉗子,好吃的很。 現在剩下了 6 條腿

第2、3條腿 使用時外接一個晶振的東西 我們接一個 4 MHz的。

第4條腿是複位腳,是一個信號輸入腳。單片機正常運行時接高電平。當有一個低電平脈衝輸入到這個腳時單片機就複位。所謂複位就是單片機內部所有的工作部件統統回到規定的狀態,程序也複位到頭一句上開始逐條運行。例如,你設計的一個報警鎖定的 LED紅燈亮後,當需要解除報警時,用一個按鈕給這個腳瞬時接地一下,相當於給它一個夫脈衝,系統就複位了,led燈就熄滅了,程序從頭開始。

以上5個腳,幾乎所有單片機都有,包括世界上最複雜的,和世界比較簡單的單片機-----PIC12CE519

輪到底幾條腿啦?奧是第5條腿,這條叫單片機的 I/O 腳。就是輸入輸出腳。你可通過程序動態地控制它作為輸入或輸出,作為輸出時可以程序控制它的輸出電平為高1或低0。所以,他的工作狀態有四種:輸入0,輸入1,輸出0,輸出1

剩下的兩條腿和第5腳功能一個樣。

上邊我們已經把8條腿消化掉了,其實我們要弄明白的也就3隻腿,我們再簡單一些,先整明白兩條腿,即GP0,GP1.這兩條腿低級一點的用法,可以控制繼電器,LED燈,高級一些的用法可以進行I2C匯流排,RS232匯流排的通信,作為擴展輸入可以模擬出來A/D轉換器(6--7bit),可以測量一個電阻的粗略值。作為輸出也可以直接推動揚聲器奏出音樂。這是後話暫且不提。

現在要控制使用這兩隻腿,我這個三腳貓功夫的說書的不得不講一下軟體了,要想講明白軟體又不得不涉及到單片機的內部結構。那位說啦,你可別提這軟體和結構了,以前俺就是讓它們打敗的,現在聽到這個心裡就打鼓。嘿嘿,不要緊,果真如你所說,那你就不妨跟著我再失敗一次, 反正嗎多一次失敗又不納稅,嘿嘿。不過你也要有思想準備,徹底弄明白是個漸進的過程。

要說這程序和單片機內部結構,還真是老大難,不過蟹黃蟹肉都可都在裡面。我現在要是給你說PIC單片機是哈佛結構的,51系列是馮-諾伊曼結構的,恐怕你要立馬扎走人了。所以我得用點心思不讓你溜號。

好在PIC系列的製造商(microchip 微芯公司 美國)理解我等苦衷,全部只有35條指令,而且有一些指令我們一般很少使用,常用的也就十幾句,用的時候查手冊,無需記憶。就算我們兩天學習一句,也就兩三個月時間,總比到老了還怕它們強啊。廢話少說先看下面的兩個例語:

my_name006: movlw 02h "常數2進入w

movwf GPIO "W 的數進入 寄存器GPIO

這就是我們編的程序里的兩個句子,也叫源程序。有以下特點

每行只能寫一句話

每句話由四部分組成:

標號: 操作指令 操作數 "程序注釋

下面我結合例子把這四部分解釋一下。

第一部分 my_name006: 叫做標號,它是由字母或數字組成,由冒號結束。標號可有可無,比如第二句就沒有標號。

第二部分movlw 叫做操作指令。它是必須有的,不能省略。PIC 系列的單片機共有 35 條指令。

第三部分02h 叫做操作數。有的指令沒有操作數或者操作數是默認的,也不用寫。

第四部分是程序注釋,必須以單引號開頭,主要作用是提醒和備忘。注釋也是可有可無。

第二個例句中,省略了標號,當然注釋也可以省略。他的指令是movwf, 操作數是GPIO。操作數不一定是數字,也可能是一個由字母組成的字元串。

知道了語句格式以後,我們下面就學習一些常用語句。我們先把這兩個例句弄清楚。

這兩句話的作用是把 2 這個常數寫入到 GPIO 這個寄存器里。

單片機里有一些部件需要我們使用和操作,都是通過讀寫寄存器來實現的。每個部件都對應有操控它的寄存器,例如我們要控制使用的管腳GP0,GP1 這兩個管腳對應的寄存器就叫做GPIO。對GPIO寄存器讀操作,實際等效察看管腳電平的高低;對GPIO寄存器相應的位寫1操作,實際等校讓管腳輸出高電平。寫0,輸出低電平。

每個寄存器可以儲存一個八位的二進位數。這八個位的每個位都有名稱,從左向右的名稱是:

左端第首位名稱叫D7,

左端第二位名稱叫D6,

左端第三位名稱叫D5,

左端第四位名稱叫D4,

左端第五位名稱叫D3,

左端第六位名稱叫D2,

左端第七位名稱叫D1,

最後一位叫D0,

而每一個位對應一個管腳的電平,例如當GPIO寄存器的D0位等於1時表示管腳GP0 的電平是高電平。D0位等於0時表示管腳GP0 的電平是低電平。常數2的八位二進位表示是「00000010」 所以,GPIO寄存器存放的8位2進位數的每個位的值以及管腳電平是:

D7對 應於內部匯流排管腳的電平 D7=0 內部匯流排管腳輸出低電平

D6對應於內部匯流排管腳的電平 D6=0 內部匯流排管腳輸出低電平

D5對應於GP5 管腳的電平 D5=0 GP5 管腳輸出低電平

D4對應於GP4 管腳的電平 D4=0 GP4 管腳輸出低電平

D3對應於GP3 管腳的電平 D3=0 GP3 管腳輸出低電平

D2對應於GP2 管腳的電平 D2=0 GP2 管腳輸出低電平

D1對應於GP1 管腳的電平 D1=1 GP1 管腳輸出低電平

D0對應於GP0 管腳的電平 D0=0 GP0 管腳輸出低電平

GP0---GP5管腳我們可以從上一講的圖1硬體中查出所對應的管腳。d7 d6 對應的內部時鐘和數據匯流排我們現在暫且不要管它。以後本事大了在調教它們。在我們的例句中,向GPIO寄存器寫入了2,常數2的八位二進位表示是「00000010」 因此如果此時GP0, Gp1等都已經被定義成輸出的話,那麼GP1輸出高電平(接LED燈亮),GP0 輸出低電平(所接led燈熄) 。

截止到現在,你已經學會如何控制管腳的電平高低了。儘管還有一些疑問,比如怎樣定義管腳為輸出腳(以後會說),我得說如果事先gp1,gp0這兩個管腳處於輸入狀態,這兩個例句無效,是控制不了電平的。

無論如何,這一會兒,你就學會了兩個指令,35條我看也沒啥難的。

"------------------------------------------------------------------------------

再加深一下對寄存器的認識:

要把一個常數存儲到,或者說寫到一個寄存器中,僅用一條指令是辦不到的,必須通過一個特殊的寄存器W,把數據倒過去. 這就應該使用到兩個語句。

movlw 02H 指令的意思是把一個常數存入特殊寄存器W, 這個常數是3,後面的H是表示十六進位

movwf GPIO 指令的意思是把特殊寄存器W的數值存入寄存器. 這個寄存器的名稱是 GPIO

這裡涉及到兩個概念,常數和寄存器.

常數好說,比如說十進位數 35, 26 但要注意,在單片機系統里我們一般不用十進位,而使用十六進位. 有關數制轉換方面的知識,是計算機的基礎,必須會熟練地在二進位、十六進位、十進位之間轉換,我就不羅索了.

寄存器也叫單片機的內存。

一個寄存器可以存儲的數值範圍是0--255,用十六進位表示就是 0---FFH.用二進位表示就是00000000----11111111.

以後要養成習慣用十六進位表示數.

那麼,一個單片機里有多少個這樣的寄存器哩,pic12ce512裡面有1024個這樣的寄存器可以供你使用,為了使用方便生產商已經給它們編上了號碼,第一號碼是000H,往下依照次序為 001H,002H........3FFH.(怎麼樣,開始用十六進位說事了吧,如果你不熟悉熟制轉換趕緊補課來得及)

有了編號就像我們居住的房間有了房間號碼,使用就方便的多了.房間號碼在郵政行業叫地址,因此我們稱這些號碼叫做寄存器地址,或稱地址數 例如 名稱為 GPIO 的寄存器,他的地址,或地址數是 06H 。所以我們的兩個例句完全等同於:

my_name006: movlw 02h "常數2進入w

movwf 06H "W 的數進入 寄存器GPIO

"-----------------------------------------

有兩個寄存器比較特殊,它們沒有地址,一個名字叫做 W, 另一個叫做 TRIS. 所以他們兩個在存儲數據的時候比較快,一個指令就可以解決問題,例如: movlw 03H 一條指令就把常數3寫入到W寄存器了。關於TRIS寄存器,我們以後用到它再說.

除了他們兩個以外的其他所有寄存器,在寫入數據時一般都要用兩條指令進行。

今天就扯到這裡,雖然只有兩個指令,但主要目的是要同學們接觸一下指令,建立寄存器的概念以及他們同硬體部件的聯繫。增強學習的信心。能有這些體會,這一節就算過關了。

隨著以後的深入,你會發現小小單片機裡面是一個大世界,興趣也由此而生。

我們上一次講的兩個指令是是如何控制管腳電平的高低。前提是所有管腳已經被定義成輸出了(OUT)如果被定義成了輸入,則上次的指令雖然也能運行,但運行後絲毫不能改變管腳電平高低,因為此時管腳是輸入狀態,電平取決於外部輸入,指令無法改變。

在PIC單片機系列中,改變I/O口的輸入輸出依靠寫入寄存器TRIS的值,相應位寫0,表示對應管腳被定義成了輸出,寫1,就是輸入。

現在假如預把GP1、GP2管腳定義成輸出,其他腳全是輸入。那就應該向TRIS 寄存器寫入二進位數 11111001,換算成十六進位就是

F9H.

依照以前我們學到的知識,在PIC系列單片機里,本來應該用下列的語句來完成我們的設定:

movlw 0F9H "常數進W 以字母開頭的常數前面必須加0

movwf TRISA "把W內的數複製到TRIS

實際上PIC系列的單片機也都是這麼寫的,後面加的A,表示第一個8位的口(有的單片機不僅一個口,還有好幾個8位的I/O口如TRISB TRISC TRISD等等) .

但是,記住了, PIC12系列的單片機必須改寫成為:

movlw 0F9H "常數進W 以字母開頭的常數前面必須加0

tris GPIO "把W內的數複製到TRIS 以後凡見到這個指令一律理解成 movwf TRISA

寫法不同,意思是一樣的. 這樣你就又學了一個指令TRIS,不過這個指令的實質還是你曾經學過的movwf 只是寫法不同罷了.

在PIC12系列裡TRIS作為指令, 在其他系列(PIC161718)里把 TRIS 作為普通寄存器看待.

因為我們現在講的就是PIC12CE519,所以我們暫時用

tris GPIO

這個格式,等以後進入PIC16C877 我們再寫成 movwf TRISA , 至於理解按照後者進行.

"-----------

如果我們要控制GP1 GP2管腳的輸出電平, 其他管腳作為輸入.並且讓GP1輸出低電平,GP2輸出高電平.完整的程序如下:

movlw 0F9H "常數進W

tris GPIO "把W內的數複製到TRIS ,GP1 GP2為輸出,其他為輸入

"此行無命令,起到的作用是容易讀懂程序

movlw 04H "常數4的二進位是 00000100 ,GP1=0 GP2=1

movwf GPIO "W內的數進GPIO 輸出生效,原來定義成輸入的腳的電平,不會受該句影響

上面已經學會了三條指令,但是8位寄存器的概念概念一定要建立起來,程序通過寫入寄存器不同的數據

控制管腳作為輸入使用還是輸出使用,作為輸出時是輸出高電平還是低電平。

這樣的操作又一個特點,就是每次寫入數據,同時控制的往往不是一個管腳,而是好幾個個.最多一次可

以控制8個管腳.在單片機里往往每8個腳叫做一個口,如口A, 口B,用英文表示就是GPIO PORTA PORTB PORTC 等.

更多的情況是:某個口內的某一個管腳需要改變電平,其他腳電平不變.例如我們僅需要GPIO口上的GP1

這個管腳的電平拉高,其他管腳電平不發生變化.這時候位操作指令為我們提供了方便,假如我們事先已經把GP1管腳定義過輸出了(方法見前面講過的):

bcf GPIO,GP1 "注釋 GPIO口上GP1管腳電平拉低,我們行話叫 清除。

bSf GPIO,GP1 "注釋 GPIO口上GP1管腳電平拉高,我們行話叫 置位。

怎麼樣,這樣控制某一個管腳的電平就方便多了,你的編程效率大大提高啊.

記住:PIC所有單片機所有寄存器都是可以位操作的,這在51的單片機上是不能完全實現的.

不僅如此,PIC所有單片機所有管腳的單腿驅動輸出電流可以高達 25mA,所以如果你驅動一個 5到10mA電流的LED發光二極體,根本不用加三極體,串個電阻直接掛在單片機上就得了,這在51的單片機上也是不能實現的,要加驅動三極體或驅動晶元.

怎麼樣,學PIC有好處吧. 也別急,好處還有那,且聽我慢慢地白話。

一不小心,你已經會 5 個指令了,還有30個,加油啊。

繼續

單片機的大部分指令,或者說單片機所做的大部分工作,多數在寫入或讀出寄存器。關於寄存器的初步概念我想我們已經建立起來了,它是一個能夠存儲8位二進位數據(最大255 = 0FFH) 的單元 每個單元都有它的編號,我們叫做它的地址,或地址編碼. 地址編碼也是十六進位的. 另外寄存器里的數據掉電就會丟失。

寄存器的英文是RAM 也要記住.

PIC12CE519 裡面共有有48個寄存器供我們操作使用, 它們每一個都有固定的地址編碼。

地址編碼並不是連續的號碼,而是分成了兩段:

第一段: 從00H 開始, 依次是01H, 02H, 03H ....0AH, 0BH......到1FH 結束. 計32個寄存器

第二段: 從30H 開始, 依次是31H, 32H, ......................到3FH 結束 計16個寄存器

這種地址不連續編號, 而是要跳過去一段的做法, 對於我們新手來說很是不習慣. 為了讓我們容易入門, 我們暫時先不管第二段RAM, 只當它不存在, 所有程序我們只涉及到第一段連續的ram 地址. 等我們熟練的掌握好了ram 的使用,再涉及第二段地址的RAM, 那時,你就會理解單片機設計者把它們分成兩段的苦心了.

為了規範,我們今後一律把RAM的分段, 叫做分頁. 第一地址段叫00頁面, 第二地址段叫01頁面.

例如: 我們學過的 I/O 口電平控制寄存器 GPIO, 它的地址編碼是 06H, 屬於00頁面.

"-----------------

所有這32+16=48個寄存器除了在地址上分成了兩個頁面以外,又把它們分成兩類:

一類專用寄存器,一類通用寄存器.

所謂專用,就是這個寄存器的功能已經由系統分配好了.例如 地址為06H 的名稱就做GPIO寄存器的功能,是它的每個位,都對應到一個I/O腳的電平.

另一類 是通用寄存器,你可以理解成它的功能系統沒有事先預定,而是由你在編程序的時候隨機使用.

pic12ce519 的專用寄存器有 7 個, 位置在我們第00葉面的最前面. 這7個專用寄存器的地址編碼是: 00H,01H, 02H, ----06 H

剩下的所有寄存器包括所有第01頁面, 全部都是通用寄存器.

例子: 在兩個通用寄存器 09H, 0AH 內, 寫入常數 FC H

movlw 0FCH "常數進W

movwf 9H "複製W內的數到通用寄存器09H

movwf 0AH "複製W內的數到通用寄存器0AH 由於此時W內並沒有改變,W不用再進常數.

"----------------------------------------------

下面是PIC12CE519的 寄存器ram的地址地圖:

圖最上端的 00 01 表示的是頁面號碼,或叫頁面地址。

左側 從00 --- 1FH 是00頁面, 右側是01頁面。

從00H 到 06H 都已經起好了名稱 ,它們是專用寄存器,用處各有不同。以後我們會逐個介紹它們

剩下的都是通用寄存器 或者叫普通寄存器 General Purpose Registers 意思是一般用途的寄存器

地址從20H 到 2FH 也不是「空洞」,也不是不能訪問,只是讀寫它們的時候等於讀寫它們左側對應的00頁面。這一點我們可能有些迷惑,弄不明白也沒有關係,以後隨著程序理解的深入,會搞清楚的。

內存圖譜,不要求記下來,但是應該有個大體印象,用的時候會察看就可以了。等編程時間一長

就那麼幾個位元組,自然就記住了。

所謂位元組是衡量二進位數據長度的一個單位。一個寄存器剛好能記住一個位元組的數據。如果你要存儲的數據比較大超過了255,那就要佔2個存儲器甚至更多。描述的時候通常我們不說這個數值佔了多少個寄存器,而是說這個數據是幾個位元組的。

位元組的英文是byte 一個二進位數的一位,叫比特 英文bit 1 byte 包含 8 bit

繼續

下面我們學習一條新指令,叫做空操作指令

nop "什麼事情也不做,但執行這個指令也要消耗掉一點時間。它沒有操作數。

"不要理解成程序停了,實際上程序仍在正常運行。執行一連串的空操作指令,單片機

"白耗費時間,什麼活也不幹,往往用於延時

如果你需要一個很短時間的延時,可以採用一連串的空操作。注意每個 nop 也是佔一行, 例如:

bsf GPIO,GP1 "管腳GP1輸出高電平點亮LED燈(如果你已經接上燈的話)

nop

... .

bcf GPIO,GP1 "管腳GP1輸出低電平關閉LED燈

...

運行的效果是接在管腳GP1上的LED燈先亮一段時間,再熄滅一段時間的閃爍。

這回再說一個程序轉向的語句,goto 指令,學過basic 和 c 等語言的對它不陌生。

單片機對程序的執行是逐句自上而下進行。當它運行到某個位置,如果你不希望繼續運行它下面的語句,而是希望它無條件的強行轉到某一句上,就可以使用goto語句。

我們還是通過例子來說明goto 的使用方法。

已知外部晶振的頻率為4 MHz, 設計程序從pic12ce512 單片機的GP1管腳上輸出一個方波信號,信號頻率固定並計算出頻率的值。

myWAVE: bsf GPIO,GP1 "管腳GP1輸出高電平點亮LED燈(如果你已經接上燈的話)

goto myWAVE "myWAVE是標號,某行必須有這個標號,否則程序通不過

nop "由於goto的存在,以下語句得不到運行

當程序自上而下運行到goto 語句時, 不再繼續運行它底下的語句, 而是讓程序強行轉向到標號為myWAVE的語句上,並繼續運行.

這樣一來的結果,程序會永遠在標號myWAVE的這一句 bsf GPIO,GP1 到goto之間循環, 打轉轉.

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 電子產品世界 的精彩文章:

3D列印最新發展趨勢:2018年將增長近20%,達到120億美元
心疼華為:美國兩大運營商相繼與華為終止合作

TAG:電子產品世界 |