接下來的幾節(jié),我們會帶著大家編寫第一個單片機程序。在此之前,我們先來了解一些 51 單片機特有的程序語法以及 Keil 軟件的基本操作步驟,請大家一定要有耐心。
我們主要是用 C 語言來對單片機編程,而有的單片機有那么幾條很特殊的獨有的編程語句,51 單片機就有,先介紹 2 條。
第一條語句是:sfr P0 = 0x80;
sfr 這個關(guān)鍵字,是 51 單片機特有的,他的作用是定義一個單片機特殊功能寄存器(specialfunction register)。51 單片機內(nèi)部有很多個小模塊,每個模塊居住在擁有唯一房間號的房間內(nèi),同時每個模塊都有 8 個控制開關(guān)。P0 就是一個功能模塊,就住在了 0x80 這個房間里,我們就是通過設(shè)置 P0 內(nèi)部這個模塊的 8 個開關(guān),來讓單片機的 P0 這 8 個 IO 口輸出高電平或者低電平的。而 51 單片機內(nèi)部有很多寄存器,如果我們想使用的話必須提前進行 sfr 聲明。不過 Keil 軟件已經(jīng)把所有這些聲明都預先寫好并保存到一個專門的文件中去了,我們要用的話只要文件開頭添加一行#include
第二條語句是:sbit LED = P0^0;
這個 sbit,就是對剛才所說的 SFR 里邊的 8 個開關(guān)其中的一個進行定義。經(jīng)過上邊第二條語句后,以后只要在程序里寫 LED,就代表了 P0.0 口(“^”這個符號在數(shù)字鍵 6 上邊),注意這個 P 必須大寫,也就是說我們給 P0.0 又取了一個更形象的名字叫做 LED。
了解了這兩個語句后,我們來大概看一下單片機的特殊功能寄存器。請注意,每個型號的單片機都會配有生產(chǎn)廠商所編寫的數(shù)據(jù)手冊(Datasheet),所以我們來看一下 STC89C52 的數(shù)據(jù)手冊,從 21 頁到 24 頁,全部是對特殊功能寄存器的介紹以及地址映射列表。我們在使用這個寄存器之前,必須對這個寄存器的地址進行說明。是不是花花綠綠的太多了,記不住啊,這個沒關(guān)系的,不需要你記住,了解一下,后邊大部分我會慢慢給大家解釋,少部分需要用到的時候,自己過來查手冊就可以了,做技術(shù)不是為了應(yīng)付考試,你可以隨時翻閱手冊查找你需要的資料。
如圖 2-7,是截取的手冊中第 22 頁最下邊的一個表格。
圖 2-7 IO 口特殊功能寄存器
我們來看一下這個表,其中 P4 口 STC89C52 對標準 51 的擴展,我們先忽略它,只看前邊的 P0、P1、P2、P3 這 4 個,每個 P 口本身又有 8 個控制端口。大家可以結(jié)合我們的開發(fā)板原理圖或者圖 2-1 來看,那么這樣就確定了我們的單片機一共有 32 個 IO 口(IO,Input和 Output,分別是輸入和輸出)。
其中 P0 口所在的地址是 0x80,一共有從 7 到 0 這 8 個 IO 口控制位,后邊有個 Reset Value(復位值),這個很重要,是我們看寄存器必看的一個參數(shù),8 個控制位復位值全部都是 1。
這就是告訴我們,每當單片機上電復位的時候,所有的引腳的值默認是都是 1,即高電平,我們在設(shè)計電路的時候也要充分的考慮這個問題。
那么上邊那 2 條語句,我們寫 sfr 的時候,必須要根據(jù)手冊里的這個地址(Add)去寫,寫sbit 的時候,就可以直接將一個字節(jié)其中某一位取出來。我們編程的時候,也有現(xiàn)成的寫好寄存器地址的頭文件,我們直接包含該頭文件就可以了,不需要逐一去寫了。