C語言程式設計總結

2021-10-16 18:27:41 字數 4121 閱讀 2756

其餘的資料型別如char、short、int、long、float等與標準c語言完全相同。

bit、sbit、sfr、和sfr16資料型別專門用於51微控制器硬體和c51編譯器,並不是標準c語言的一部分,不能通過指標進行訪問。bit、sbit、sfr、和sfr16資料型別專門用於訪問51微控制器的特殊功能暫存器,例如sfr p0=0x80,表示宣告p0,並為其分配特殊功能暫存器位址0x80。

當結果為不同的資料型別時,c51編譯器自動轉換資料型別。例如位變數在整數分配中就被轉換成乙個整數。除了資料型別的轉換之外,帶變數的符號擴充套件也是自動完成的。

儲存型別及儲存區

c51編譯器支援51微控制器及其擴充套件系列,並提供對51所有儲存區的訪問。儲存區可分為內部資料儲存區、外部資料儲存區以及程式儲存區。51微控制器內部的資料儲存區是可讀寫的,51派生系列最多可有節的內部資料儲存區,其中低節可直接定址,高節(從0x80到0xff)只能間接定址。

從20h開始的16位元組可位定址。內部資料區又可分為3個不同的儲存型別:data、idata和bdata。

外部資料區也是可讀寫的,訪問外部資料區比訪問內部資料區慢,因為外部資料區是通過資料指標載入位址來間接訪問的。 c51編譯器提供兩種不同的儲存型別xdata和pdata訪問外部資料。程式code儲存區是唯讀的,不能寫。

程式儲存區可能在51微控制器cpu內或者在外部或者內外都有,這由51微控制器派生的硬體決定。

每個變數可以明確地分配到指定的儲存空間,對內部資料儲存器的訪問比外部資料儲存器的訪問快許多,因此應當將頻繁使用的變數放在內部資料儲存器中,而把用的較少的變數放在外部資料儲存器中。各儲存區的簡單描述如表1所示。

變數宣告中還包括了對儲存器型別的指定,即指定變數存放的位置。

下面分別詳細介紹各儲存區並給出應用例項。

data區 data區的定址是最快的,所以用該把經常使用的變數放在data區;但是data區的空間是有限的,data區除了包含程式變數外,還包含了堆疊和暫存器組。data區宣告中的儲存型別識別符號為data,通常指低節的內部資料區儲存的變數,可直接定址。宣告舉例如下:

unsigned char data sustem_status=0;

unsigned int data unit_id[2];

char data inp_string[16];

float data outp_value;

mymtype data new_val;

標準變數和使用者自宣告變數都可以儲存在data區中,只要不超過data區的範圍即可。因為c51使用預設的暫存器組來傳遞引數,這樣data區至少失去了8位元組的空間。另外,當內部堆疊溢位的時候,程式會復位。

這是因為51微控制器沒有硬體報錯機制,堆疊的溢位只能以這樣的方式表示出來,因此要宣告足夠大的堆疊空間來防止堆疊溢位。

bdata區 bdata區實際就是data區中的位定址區,在這個區宣告變數就可進行位定址。位變數的宣告對狀態暫存器來說是十分有用的,因為它可能僅僅需要使用某一位,而不是整位元組。bdata區宣告中的儲存型別識別符號為bdata,指內部可位定址的16位元組儲存區(20h到2fh)可位定址變數的資料型別。

以下是在bdata區中宣告的位變數的例子:

unsigned char bdata status_byte;

unsigned int bdata status_word;

unsigned long bdata status_dword;

對變數位進行定址產生的彙編**比宣告data區的位元組位所產生的彙編**要好,如果對宣告在bdata區中的位元組位採用偏移量進行定址而不是用先前宣告的位變數名時,編譯後的**是錯誤的。

idata區 idata區也可存放使用比較頻繁的變數,使用暫存器作為指標進行定址,即在暫存器中設定8位位址進行間接定址。與外部儲存器定址相比它的執行週期和**長度都比較短,idata區宣告的儲存型別識別符號為idata,指內部的節的儲存區,但是只能間接定址,速度比直接定址慢。

宣告舉例如下:

unsigned char idata system_status=0;

unsigned int idata unit_id[2];

char idata inp_string[16];

float idata outp_value;

pdata和xdata區 pdata和xdata區屬於外部儲存區,外部資料區是可讀寫的儲存區,最多可有64kb,當然這些位址不是必須用作儲存區的。訪問外部資料儲存區比訪問內部資料儲存區慢,因為外部資料儲存區是通過資料指標載入位址來間接訪問的。

在這兩個區,變數的宣告和其他區的語法是一樣的,但pdata區只有節而xdata可達節。對pdata和xdata的操作是相似的;對pdata區的定址比對xdata區的定址要快,因為對pdata區定址只需裝入8位位址,而對xdata區定址需裝入16位位址,所以盡量把外部資料儲存在pdata段中。

pdata和xdata區宣告中的儲存型別識別符號分別為pata和xdata,xdata儲存型別識別符號可以指定外部資料區64kb的任何位址,而pdata儲存型別識別符號僅指定一頁或節的外部資料區。宣告舉例如下:

unsigned char xdata system_status=0;

unsigned int pdata unit_id[2];

char xdata inp_string[16];

float pdata outp_value;

外部位址段中除了包含儲存器第之外,還包含i/o器件的位址,對外部器件定址可通過指標或51提供的巨集,使用巨集對外部器件進行定址更具可讀性。

巨集宣告使得儲存區看上去像char和int型別的資料組,下面是一些絕對暫存器定址的例子:

如果要對bdata和bit段之外的其他資料區定址,則要包含標頭檔案absacc.h,並採用以上方法定址。

code區程式儲存區code的資料是不可改變的,跳轉向量和狀態表對code段的訪問和對xdata區的訪問時間是一樣的。編譯的時候要對程式儲存區中的物件進行初始化,否則就會產生錯誤。程式儲存區code宣告中的識別符號為code,在c51編譯器中可用code儲存區型別識別符號來訪問程式儲存區。

下面是程式儲存區宣告的例子:

unsigned char code a[ ]=

;儲存器模式

儲存器模式是函式自變數、自動變數和沒有明確規定儲存型別的變數的預設儲存器型別。指定儲存器型別需要在命令中使用small、compact和large3個控制命令中的1個,例如:

void fun1(void) small;

small在該模式中,所有變數都預設地位於51內部資料儲存器,這和使用data指定儲存器型別的方式一樣。在此模式下,變數訪問的效率很高,但所有的資料物件和堆疊必須適合內部ram。

確定堆疊的大小是很關鍵的,因為使用的堆疊空間是由不同函式巢狀的深度決定的。通常,如果bl51聯結器/定位器將變數都配置在內部資料儲存器內,則small模型是最佳選擇。

compact 當使用compact模式時,所有變數都被預設為在外部資料儲存器的頁內,這和使用pdata指定儲存器型別是一樣的。該儲存器型別適用於變數不超過節的情況,此限制是由於定址方式所決定的;和small模式相比,該儲存模型的效率比較低,對變數的訪問速度也慢一些。但是比large模式快。

large 在large模式中,所有的變數都預設為位於外部資料儲存器(這和使用xdata指定儲存器型別是一樣的),並使用資料指標dptr進行定址。通過資料指標訪問外部資料儲存器的效率低,特別是當變數為2位元組或更多位元組時,該模式要比small和compact產生更多的**。

特殊功能暫存器(sfr)

51微控制器提供節的sfr定址區,位址為80h~ffh。51微控制器,除了程式計數器pc和4組通用暫存器組之外,其他所有的暫存器均為sfr,並位於片內的特殊暫存器區。這個區域可位定址、位元組定址或字定址,用以控制定時器、計數器、串列埠、i/o及其他部件。

特殊功能暫存器可由以下幾種關鍵字說明:

「=」後面的位址必須是常數,不允許帶有運算子的表示式。這個常數的範圍必須在特殊功能暫存器位址範圍內,位於0x80h到0xffh之間。

(2)sfr16 許多新的8051派生系列微控制器用兩個連續位址來確定sfr來指定16位值,例如8052用位址0xcc和0xcd表示定時器/計數器2的低和高位元組,如sfr16 t2=0xcc;表示t2口位址的低位址t2l=0xcc,高位址t2h=0xcd。sfr16宣告和sfr宣告遵循相同的原則,任何符號名都可用在sfr16的宣告中。宣告中名字後面不是賦值語句。

而是乙個sfr位址,其高位元組必須位於低位元組之後。這種宣告適用於所有的sfr,但不能用於定時/計數器0和計數器1。

C語言程式設計總結

一 c語言程式的基本結構 include stdio.h void main 二 變數的定義 1 整型 int a b,s 0 可以在定義的同時為變數進行賦值 長整型 long 無符號整型 非負整數 unsigned 2 單精度實型 float x,y,z 1.0 3 雙精度實型 double l,...

C語言程式設計

題目答案知識點評析 填空題請補充函式fun 該函式的功能是 把從主函式中輸入的字串str2接在字串str1的後面。例如 str1 how do str2 you do?結果輸出 how do you do?注意 部分源程式給出如下。請勿改動主函式main和其他函式中的任何內容,僅在函式fun的橫線上...

C語言程式設計規範

編碼規範 1.標頭檔案編碼規範 3 2.函式編寫規範 3 3.識別符號命名與定義 3 3.1通用命名規則 3 3.2 變數命名規則 4 3.3函式命名規則 4 3.4 巨集的命名規則 4 4.變數 4 5.巨集 常量 5 6.質量保證 5 7.程式效率 6 8.注釋 6 9.排版與格式 7 10.表...