隨著單片機應用領域的逐漸擴展和顯示、通信技術的不斷進步, 單片機開發所要求的人機界面越來越豐富, 以單片機為核心應用的產品已由純實用向功能化、可視化、網路化發展。HMI (人機界面) 技術及產品在近兩年成為發展最快的領域。為了實現以更多的人機交互信息、更清晰的儀錶硬體描述為特徵的HMI 功能,相應地, 單片機編程中的參數量及參數類型不斷增加,僅有基本類型變數(如位、位元組、整型、浮點型、指針型)和數組變數已不能完全有效地表達參數的特性。使用C51 編譯支持的一種結構體(struct)數據類型,可有效地解決許多編程中所面臨的種種數據結構管理問題。
1 結構體數據
除了基本類型數據, 數組是C51 編程中一種常用的構造類型數據。它由上述基本類型數據(位、指針除外)組成, 並且一個數組的各元素應屬於同一個類型。但是,只有這些數據類型並不能很好地表達我們所要引用的數據,有時需要將不同類型的數據組合成一個有機的整體,以便於引用。例如, 要保存一組採樣值:時間(月、日、時、分)、溫度、流量等,如果分別將它們定義為互相獨立的簡單變數,難以反映它們的內在聯繫。應當把它們組織成一個組合項, 在一個組合項中包含若干個類型不同(也可以相同)的數據項。這樣的數據結構稱為結構體(structure)。定義一個結構體類型的一般形式為:
struct 結構體名
{成員表列};
例如上面提到的一組數據, 可以表示為:
struct sample /* 結構體名 */
{char month; /* 月 */
char day; /* 日 */
char hour; /* 時 */
char minute; /* 分 */
int temprature; /* 溫度 */
float flow;…… /* 流量等 */
}sample1,Sample2;
它定義了一個反映某一時刻採得的溫度值、流量值等的結構體sample,同時定義了兩個具有struct sample類型的變數(或參數)。
2 結構體數據的優點
(1)有效利用內存空間
在C51 編譯時,結構成員在內存中是順序存放的,因而不同類型的數據被有機地結合成了一個數據塊,使單片機有限的內存資源空間得以充分利用。
(2)參數組織結構緊密、清晰結構體數據在多參數的智能化儀錶設計中尤為適用, 它可將同一屬性、不同類型的數據組織在一起,參數便於識別、調用。如編製某些通用型儀錶的程序, 可定義下列結構體數據。
例1 :放大環節描述
struct amplifier
{ int gain;
char offset;
} input_amp,output_amp;
以上定義了一個表示放大環節(amplifier)的結構體類型。它由放大環節增益(gain ) 和放大環節零點(offset)組成,並且定義了輸入環節(input_amp)和輸出環節(output_amp)兩個結構體數據。
例2 :儀錶特徵描述
描述儀錶特徵的數據可以組合成一個有機的結構體, 以便於識別與調用。
struct meter
{ int meter_no; /*儀錶編號*/
char meter_code[10]; /*儀錶編碼*/
int meter_size; /*儀錶口徑*/
float meter_factor; /*儀錶係數*/
char meter_zero; /*儀錶零點*/
} meter1;
(3)參數調用方便
結構體數據的調用方式有多種,最直接的方式為:
結構體變數名.成員名
如例2中,可以對變數賦值:meter1.meter_factor=1.0;
這裡著重介紹一種通過指針調用的方式。該方式在對結構體數據作順序存取時尤為方便。在數據存儲區有以下結構:
structpara
{
int pr0;
char pr1;
float pr2;
……
} parameter;
在程序存儲區與之相對應存放一組成員名數據表parameter_name[m][n]。該表包含表1 所列內容。
參數類型 | 地址偏移量 | 參數名 | 備註 |
i | 0 | "XXXXXX" | 成員0 |
c | 2 | "XXXXXX" | 成員1 |
f | 3 | "XXXXXX" | 成員2 |
…… | …… | …… | 成員n |
3 總結
由於單片機內存資源的限制, 如何合理、有效地組織利用數據內存空間, 對於編製大型的單片機程序尤為重要。儘可能利用編譯器提供的便利, 優化程序, 使程序做到更簡化、更易於擴展,是每個編程人員追求的目標。結構體數據類型即是C51 為單片機開發人員提供的
一種有效的數據組織方式。
[admin via 研發互助社區 ] C51的結構體數據在單片機編程中的應用已經有9675次圍觀
http://cocdig.com/docs/show-post-42339.html