芯片IC單片機解密百科

十年專注單片機解密

單片機的C語言編程基礎知識(初學注意)

80C51上的C語言編程 C51的特色,也是IC解密基礎語言

(1)學習過C語言的同學在對單片機有了基本了解之後,就可以開始試著寫一兩個基於單片機的C語言的程序了。C51語言繼承了ANSI C 的絕大部分的特性,基本的語法相同,同學們上手會比較快。但是,由於C51語言是對硬件進行控製的編程語言,其本身又在硬件結構上有所擴展以增強C語言對硬件的控製,如關鍵字sbit,data,code等(後麵會講他們是做什麽的)。


(2)因為單片機不是BBIN导航平時用的計算機,他的英文名為MCU(微控製器),特點體現在這個“微”字。因而,它裏麵的硬件資源是非常少的,所以你在寫程序的時候就要注意對RAM(存儲數據)和ROM(存儲程序)的使用。說白了,就是也程序的時候要盡量精簡,如各種算法,不要讓係統負擔太大。少用浮點運算,能夠使用unsigned的無符號型數據,就不要使用有符號的(當你寫程序時,你會發現很多位置都用的unsigned,不像BBIN导航在ANSI C裏麵不同,不太注意,C51裏麵就非常注意資源的控製)。避免乘除,多用移位運算(寫走馬燈程序時,會使用到,很有意思,不是BBIN导航想象的用循環控製)。


基本的特性了解之後,BBIN导航來講下,具體的東西:


首先,是C51針對硬件控製增加的一些關鍵字,數據類型。


(1)bit : 和BBIN导航平時用的int,char相同,隻不過int是兩個字節(16位,16bit),char是單字節(8位,8bit),bit就是一位,取值範圍是0和1,類似windows編程裏的BOOL。


(2)sbit : sbit是對應可位尋址空間的一個位,可位尋址區:20H~2FH。一旦用了sbit xxx = REGE^6這樣的定義(例如,sibt a = P0^0,定義P0口的第0位為變量a,此時對a賦值0或者1時,就是在對P0口的第0位進行控製,賦低電平或高電平),這個sbit量就確定地址了。(sbit大部分是用在特殊功能寄存器中的,方便對寄存器的某位進行操作的。)


(3)sfr:用於定義特殊功能寄存器(8位的)(在程序中會寫頭文件#include,在Keil中右鍵點擊打開reg51.h,就可以看到很多sfr的定義),如sfr P0 = 0x80,就定義了端口P0。


(4)sfr16:同上用於16位的


其次,C51還提供了對8051所有存儲區的訪問。


8051芯片的存儲區從邏輯上分為內部數據存儲區,外部數據存儲區和程序存儲區(內外統一編址)。


80C51有4KB的內部程序存儲區(片內ROM)(0000H~0FFFH),其中前43單元有特殊用處,0000H~0002H無條件跳轉,0003H~002AH用於存放中斷程序(中斷程序這裏不解釋)


256B的內部數據存儲區(片內RAM),分為低128B和高128B,有不同作用(可見硬件資源有多小了吧,所以BBIN导航要節省使用),低128B又分為為工作寄存器區,又稱通用寄存器(00H~1FH),位尋址區(20H~2FH,之前的sbit就是對應位尋址空間中的一位),數據緩衝區(30H~7FH,這個區域就是給用戶用得,沒有任何限製,一共80個單位)


高128B為特殊功能寄存器(就是上麵說的sfr),具體的內容在很多書上麵都有。


http://www.mytutorialcafe.com/Microcontroller%20Special%20Function%20Register.htm


給個英文的sfr的解釋的網址,不過沒必要看,看書就行了。


在這裏講這麽多的原因是因為C51中在對變量進行聲明的時候還可以明確的指定存儲空間。關鍵字有:DATA,IDATA,BDATA(RAM中高128B),CODE等。


(1)DATA指定RAM中低128B,可以在一個機器周期內直接尋址,尋址速度最快,所以應該把經常使用的變量放在DATA區


例如:unsigned char data system_status = 0;


(2)BDATA指定的是RAM中的位尋址區,在這個區域定義的變量可以進行位操作,什麽意思呢?舉例吧


unsigned char bdata status_byte,這裏定義變量status_byte,是一個單字節(8位)的數據變量,BBIN导航可以對這個變量中的一位進行置0或置1的操作。BBIN导航把 status_byte=0x00,即變量裏麵的8位都置為了0,前麵講過一個sbit,用於位尋址區域中的一位,sbit a = status_byte^2;a = 1,表示把變量 status_byte的第2位置為了1(0,1,2,3,4,5,6,7共八位),於是變量 status_byte就等於了0x02;


(3)CODE 程序存儲區,他裏麵的內容是不變的,BBIN导航要使用的一些固定數據存於這個裏麵就不用占用RAM的空間了,比如BBIN导航學習數碼管顯示程序時,數碼管上麵的每一個數字都對應一個16進製的數字,BBIN导航可以把它存到程序存儲區中去,例如:


unsigned char code table[]={


0x3f,0x06,0x5b,0x4f,


0x66,0x6d,0x7d,0x07,


0x7f,0x6f,0x77,0x7c,


0x39,0x5e,0x79,0x71};


關於特殊功能寄存器sfr的使用,BBIN导航以一個簡單的程序為例,在80C51芯片的P0^0上接上一個發光二極管LED,一個電阻RES和一個電源VCC,三者串聯,電流方向是從電源流向P0^0口。給80C51接上電源,接地,晶振,複位電路。如果使用proteus仿真,則這些電路不用接。


在Keil軟件中寫程序


#include


sbit a = P0^0;


void main(){


a = 0;


while(1);


}


因為芯片剛剛上電,P0管教為高電位,BBIN导航在程序中把它置為0;電流就可以流過LED,於是LED燈就會發光。並用while(1)讓程序停在這裏。


一個最簡單的單片機C語言程序就寫完了,C51對C語言的擴展有所了解,知道可以通過C語言對硬件進行控製,學會常用的關鍵字。