當前位置:才華齋>計算機>C語言>

初學C語言程式設計基礎知識

C語言 閱讀(1.29W)

初學C語言的人,很多基礎知識是需要學習的,下面小編為大家帶來了初學C語言程式設計的基礎知識,歡迎大家閱讀!

初學C語言程式設計基礎知識

  初學C語言程式設計基礎知識

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

(2)因為微控制器不是我們平時用的計算機,他的英文名為MCU(微控制器),特點體現在這個“微”字。因而,它裡面的硬體資源是非常少的,所以你在寫程式的時候就要注意對RAM(儲存資料)和ROM(儲存程式)的使用。說白了,就是也程式的時候要儘量精簡,如各種演算法,不要讓系統負擔太大。少用浮點運算,能夠使用unsigned的無符號型資料,就不要使用有符號的(當你寫程式時,你會發現很多位置都用的unsigned,不像我們在ANSI C裡面不同,不太注意,C51裡面就非常注意資源的控制)。避免乘除,多用移位運算(寫走馬燈程式時,會使用到,很有意思,不是我們想象的用迴圈控制)。

基本的特性瞭解之後,我們來講下,具體的東西:

首先,是C51針對硬體控制增加的一些關鍵字,資料型別。

(1)bit : 和我們平時用的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,有不同作用(可見硬體資源有多小了吧,所以我們要節省使用),低128B又分為為工作暫存器區,又稱通用暫存器(00H~1FH),位定址區(20H~2FH,之前的sbit就是對應位定址空間中的一位),資料緩衝區(30H~7FH,這個區域就是給使用者用得,沒有任何限制,一共80個單位)

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

給個英文的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位)的資料變數,我們可以對這個變數中的一位進行置0或置1的操作。我們把 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 程式儲存區,他裡面的內容是不變的,我們要使用的一些固定資料存於這個裡面就不用佔用RAM的空間了,比如我們學習數碼管顯示程式時,數碼管上面的每一個數字都對應一個16進位制的數字,我們可以把它存到程式儲存區中去,例如:

unsigned char code table[]={

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

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

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

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

關於特殊功能暫存器sfr的使用,我們以一個簡單的程式為例,在80C51晶片的P0^0上接上一個發光二極體LED,一個電阻RES和一個電源VCC,三者串聯,電流方向是從電源流向P0^0口。給80C51接上電源,接地,晶振,復位電路。如果使用proteus模擬,則這些電路不用接。

在Keil軟體中寫程式

#include

sbit a = P0^0;

void main(){

a = 0;

while(1);

}

因為晶片剛剛上電,P0管教為高電位,我們在程式中把它置為0;電流就可以流過LED,於是LED燈就會發光。並用while(1)讓程式停在這裡。

一個最簡單的微控制器C語言程式就寫完了。講了這麼多希望同學們瞭解,C51對C語言的擴充套件有所瞭解,知道可以通過C語言對硬體進行控制,學會常用的關鍵字。