第二章資料結構微控制器C

2021-03-20 09:55:25 字數 4636 閱讀 2487

第二章 c51資料結構及儲存模式

(注意:有一些內容在c語言中已學過,為了講課的完整性,有些內容還要講,但講的較快,複習性質)

資料結構中包含了一門語言的程式設計精髓,對於學習程式語言是相當重要的。

第一節資料型別

一、資料與資料型別

資料——各種字母、數字符號的組合、語音、圖形、影象等統稱為資料,資料經過加工後就成為資訊。不管使用任何語言、何種演算法進行程式設計,最終在計算機中執行的只有資料流。

資料型別——資料的不同格式叫作資料型別。

資料結構——資料按一定的資料型別進行的排列、組合及架構稱為資料結構。

c語言的資料結構是以資料型別出現的,資料型別可分為基本資料型別和構造資料型別,構造資料型別由基本資料型別構造而成。c語言中的基本資料型別有char,int,short,1ong,float和double。對於c51編譯器來說,short型與int型相同,double型與float型相同。

為了充分利用mcs-51 微控制器的資源特點,c51 在ansi c 的資料型別基礎上增設了位型變數,取消了布林變數,其實兩者的使用方法基本類似。cx51提供的資料結構是以資料型別的形式出現的。

keil cx51編譯器支援的資料型別、長度和值域如表所列。

主要型別解釋如下:

1. char字元型別

char型別的長度是乙個位元組,分無符號字元型別unsigned char和有符號字元型別signed char,由於編譯的智慧型化程度很高,在只定義了char型別,可以自動適應有符號或無符號,如果你用默無符號數,只要0-255之間有效,如果是有符號數,在-128~+127有效,否則編譯可以通過,但執行結果是錯誤的,將超出的位捨掉,應特別注意。

unsigned char型別用位元組中所有的位來表示數值,可以表達的數值範圍是0~255。signed char型別用位元組中最高位位元組表示資料的符號,"0"表示正數,"1"表示負數,負數用補碼表示。所能表示的數值範圍是-128~+127。

(應用時一定要注意資料範圍!)

char型別在ansi c中表示字元,在微控制器中常用它表示<256的數,像普通c語言中迴圈變數用整型,在微控制器c語言中,就可以用char型別作迴圈變數等。常用於處理ascii字元或用於處理小於或等於255的整型數。(正數的補碼與原碼相同,負二進位制數的補碼等於它的絕對值按位取反後加1。

)2. int整型

int整型長度為兩個位元組,在ram中按順序存放,資料0x1234,如右圖順序存放。

分有符號int整型數signed int和無符號整型數unsigned int,預設值為signed int型別。signed int表示的數值範圍是-32768~+32767,位元組中最高位表示資料的符號,"0"表示正數,"1"表示負數。unsigned int表示的數值範圍是0~65535。

3. long長整型

long長整型長度為四個位元組,用於存放乙個四位元組資料。

在ram中按順序存放,資料0x12345678,如右圖順序存放。

分有符號long長整型signed long和無符號長整型unsigned long,預設值為signed long型別。signed int表示的數值範圍是-2147483648~+2147483647,位元組中最高位表示資料的符號,"0"表示正數,"1"表示負數。unsigned long表示的數值範圍是0~4294967295。

在微控制器c語言中,盡量採用int、long運算,帶小數的數值能否用整型來運算,如果要保留幾位小數,可以將擴大,因為由感測器進入微控制器的量都是數字量,最後顯示時再將其縮小。

4. float浮點型

(注意:在c51中沒有double資料型別,定義double資料型別,實際應用的還是float資料型別,共32位,佔4個位元組。教材中有些提法是不對的,教材中還有許多例子,用普通c語言可以調通,而用cx51是調不通的,儘管如此,該教材仍然是微控制器c學習較好的教材。

)float浮點型在十進位制中具有7位有效數字,是符合ieee-754標準的單精度浮點型資料,占用四個位元組。表示的數值範圍是

±1.175494e-38~±3.402823e+38。

乙個浮點數的表示方式是(-1)s×2e-127×(1.m)。各字元含義及在記憶體中的存放格式如下:

其中:s—為符號位,存放在最高位元組的最高位。「l」表示負,「0」表示正。

e—為階碼,占用8位二進位制數,存放在高兩個位元組中。注意,階碼e值是以2為底的指數再加上偏移量127,這樣處理的目的是為了避免出現負的階碼值,而指數是可正可負的。階碼e的正常取值範圍是1~254,從而實際指數的取值範圍為-126~127。

m-為尾數的小數部分,用23位二進位制數表示,存放在低三個位元組中。尾數的整數部分永遠為1,因此不予儲存,但它是隱含存在的。小數點位於隱含的整數字「1」的後面。

例如浮點數-12.5,s=1,12.5的二進位制是1100.

1,小數點向前移到第乙個1的後面,移了3位,e=3+127=130(10000010),小數點前的1去掉,尾數為100100…,共23位,十六進製制為0xc1480000,在記憶體中的存放格式為:

需要指出的是,對於浮點型資料除了有正常數值之外,還可能出現非正常數值。根據ieee標準,當浮點型資料取以下數值(1 6進製數)時即為非正常值:

ffffffffh 非數(nan)

7f800000h e位255,最大為7e, 正溢位

ff800000h e位255,最大為fe,負溢位

由於805l微控制器不包括捕獲浮點運算錯誤的中斷向量,因此必須由使用者自己根據可能出現的錯誤條件用軟體來進行適當的處理。

和長整型相比,同樣是4個位元組,編譯成組合語言,位元組長度要大的多。將資料都存到片內ram的條件下,曾用c語言編了乙個簡單的加法程式實驗過,處理long型別的程式**長度為41個位元組,而float型別卻要佔367個位元組。

5.*指標型

指標型本身就是乙個變數,在這個變數中存放的是乙個資料存放的位址。這個指標變數要佔據一定的記憶體單元,對不同的處理器長度也不盡相同,在c51中它的長度一般為1~3個位元組。指標變數也具有型別,在後面講。

6. bit位型bit位型是c51編譯器的一種擴充資料型別,利用它可定義乙個位型,但不能定義位指標,也不能定義位陣列。它的值是乙個二進位制位,不是0就是1,類似一些高階語言中的boolean型別中的true和false。

7. sfr特殊功能暫存器

sfr也是微控制器c擴充資料型別,值域為0~255。利用它可以訪問51微控制器內部的所有特殊功能暫存器。

如sfr p1 = 0x90;定義p1為微控制器p1埠在片內的暫存器,在後面的語句中我們用p1 = 255(對p1埠的所有引腳置高電平)之類的語句來操作特殊功能暫存器。

*at89c51的特殊功能暫存器表(直接開啟c51檔案看)

8.sfr16 16位特殊功能暫存器

sfr16占用兩個記憶體單元,值域為0~65535。sfr16和sfr一樣用於操作特殊功能暫存器,所不同的是它用於操作佔兩個位元組的暫存器,如定時器t0和t1、資料指標暫存器dptr。

9. sbit可定址位型

sbit同位型一樣是c51中的一種擴充資料型別,利用它可以訪問晶元內部的ram中的可定址位或特殊功能暫存器中的可定址位。具體應用在後面講。

兩點說明:

1、8051系列是8位機,有位儲存空間,凡佔一位或乙個位元組的資料型別直接支援機器指令,執行速度快;其他型別要佔多個位元組,並順序存放。

2、由於微控制器記憶體很少,不但關係到執行速度,還涉及程式在所設計的系統中是否可以執行。程式設計時選擇資料型別很重要。

二、資料型別的選用

1、選用原則:

微控制器c語言程式設計不同於一般的c語言程式設計的顯著的乙個特點,就是要和程式儲存器資源結合起來,雖然其提供的資料據型別十分豐富,但是只有bit和char等資料型別是是機器語言直接支援的資料型別,用此類資料型別的語句所生成的**較短;而其它的資料型別如整型、浮點型等資料要有一定的內部程式或內部函式的支援,相對來說用該類資料型別的語句生成的**要長。有些c語言程式表面上看起來十分的簡單,但在在實際編譯時,生成的**卻相當長。因此我們要按照實際需要,合理地選用資料,可以大大的減少所生成的**長度。

1)盡量用char型別和位型別。

2)有符號型別比無符號的佔儲存容量和記憶體都大。

3)浮點數編譯後,程式**比長整型的占用空間大的多。

4)在選擇資料型別時,一定要認真分析資料的性質,盡量選用佔儲存容量小的資料型別。

例1:一位移測量儀,最大行程為10mm,顯示精度為0.001mm,程式設計時要儲存該測量值,選用何種資料型別。

該資料最大為10000,如果位移全為正,可以用unsigned int,範圍為0-65535;如果計量有正有負,用signed int,範圍為-32768~32767。也可以給採集的資料加20000,微控制器處理的資料全為正數。

三、c語言的識別符號和關鍵字

識別符號是用來標識源程式中某個物件的名字的,這些物件可以是語句、資料型別、函式、變數、陣列等等。c語言是大小字敏感的一種高階語言,如果我們要定義乙個定時器1,可以寫做"timer1",如果程式中有"timer1",那麼這兩個是完全不同定義的識別符號。識別符號由字母,數字和下劃線等組成,注意的是第乙個字元必須是字母或下劃線,如"1timer"是錯誤的,編譯時便會有錯誤提示。

有些編譯系統專用的識別符號是以下劃線開頭,所以一般不要以下劃線開頭命名識別符號。識別符號在命名時應當簡單,含義清晰,這樣有助於閱讀理解程式。在c51編譯器中,只支援識別符號的前32位為有效標識,一般情況下也足夠用了。

關鍵字則是程式語言保留的特殊識別符號,它們具有固定名稱和含義,在程式編寫中不允許識別符號與關鍵字相同。在keil uvision2中的關鍵字除了有ansi c標準的32個關鍵字外還根據51微控制器的特點擴充套件了相關的關鍵字。

資料結構第二章練習題答案

getelem l,3,e printf 6 順序表l的第3個元素 c n e printf 7 元素a的位置 d n locateelem l,a printf 8 在第4個元素位置上插入f元素 n listinsert l,4,f printf 9 輸出順序表l displist l print...

《資料結構》第二章線性表習題

資料結構 一 單項選擇題 1.線性表是 a 乙個有限序列,可以為空 b 乙個有限序列,不可以為空 c 乙個無限序列,可以為空 d 乙個無限序列,不可以為空 2.在乙個長度為n的順序表中刪除第i個元素 0 i n 時,需向前移動個元素。a n i b n i l c n i 1 d i 3.線性表採用...

資料結構習題第二章線性表答案

第2章線性表 一 選擇題 二 判斷題 部分答案解釋如下。1 頭結點並不 僅起 標識作用,並且使操作統一。另外,頭結點資料域可寫入鍊錶長度,或作監視哨。4 兩種儲存結構各有優缺點,應根據實際情況選用,不能籠統說哪乙個好。7 集合中元素無邏輯關係。9 非空線性表第乙個元素無前驅,最後乙個元素無後繼。13...