當前位置:首頁 » 編程語言 » 單片機c語言數組定義

單片機c語言數組定義

發布時間: 2023-03-15 18:50:53

1. c語言,如何定義數組為全局變數

在C語言中,全局變數和函數聲明及定義並列,也就是說,聲明在最外層作用域的變數即為全局變

如在如下程序中

inti;

intmain()
{
inti_=i;
i=9;
return0;
}

int i就是一個全局變數,故在main函數中可以調用或修改i的值

所以,定義數組也和普通全局變數的方法相同,如

charstr[10];

intmain()
{
str[0]='a';
str[1]='';

return0;
}

拓展資料

C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。

盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。

二十世紀八十年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標准局為C語言制定了一套完整的美國國家標准語法,稱為ANSI C,作為C語言最初的標准。目前2011年12月8日,國際標准化組織(ISO)和國際電工委員會(IEC)發布的C11標準是C語言的第三個官方標准,也是C語言的最新標准,該標准更好的支持了漢字函數名和漢字標識符,一定程度上實現了漢字編程。

2. 單片機C語言數組最多能定義多少個元素

  1. 原則上,C語言中數組所包含的元素個數理論上多少都侍鎮行,如果要開一個很大的數組,比如int arrayint[10000][10000];在main()中聲明該數組就會使應用程序退出,但是如果你把該數組的聲明放在所有函數體之外,讓它變成一個全局變數,就沒有任何限制了,你想開多大的數組都可以。

  2. 但在單片機c語言程序中,實老蘆粗際上還是有限制的,原因在於單片機的存儲空間是有限的,數組最多能有幾個元素取決於單片機型號。

  3. 你定義了一個全局的數組,unsigned char型的數組,最多隻能有93個元素,說明你嘩亂還有其他變數佔用存儲空間。如果需要一個512個元素的數組,用的單片機是stc15f2k60s2,可在定義數組時進行XDATA聲明,將數組存儲於外部RAM當中。

3. 51單片機C語言 幾個數組定義的區別

const 表示本數組不可修改 數組為常量數組

code 表示本數組生成後是在ROM區中 同樣不可修改

idata 表示數組生成後在在0x00~0xff的256個RAM中,使用指針定址

具體的參考下面

data,bdata,idata,pdata,xdata,code存儲類型與存儲區

bit是在內部數據存儲空間中 20H .. 2FH 區域中一個位的地址,或者 8051 位可定址 SFR 的一個位地址。

code是在亂顫肆 0000H .. 0FFFFH 之間的一個代碼地址。

data是在 0 到 127 之間的一個數據存儲器地址,或者在 128 .. 255 范圍內的一個特殊功能寄存器(SFR)地址。

idata是 0 to 255 范圍內的一個 idata 存儲器地址。

xdata 是 0 to 65535 范圍內的一個 xdata 存儲器地址。

指針類型和存儲區的關系詳解

一、存儲類型與存儲區關系

data ---> 可定址片內ram
bdata ---> 可位定址的片內ram
idata ---> 可定址片內ram,允許訪問全部內部ram
pdata ---> 分頁定址片外ram (MOVX @R0) (256 BYTE/頁)
xdata ---> 可定址片外ram (64k 地址范圍)
code ---> 程序存儲區 (64k 地址范圍),對應MOVC @DPTR

二、指針類型和存儲區的關系

對變數進行聲明時可以指定變數的存儲類型如:
uchar data x和data uchar x相等價都是在內ram區分配一個位元組的變數。

同樣對於指針變數的聲明,因涉及到指針變數本身的存儲位置和指針所指向的存儲區位置不同而進行相應的存儲區類型關鍵字的
使用如:

uchar xdata * data pstr

是指在內ram區分配一個指針變數("*"號後的data關鍵字的作用),而且這個指洞空針本身指向xdata區("*"前xdata關鍵字的作用),
可能初學C51時有點不好懂也不好記。沒關系,我們馬上就可以看到對應「*」前後不同的關鍵字的使用在編譯時嘩轎出現什麼情況。

......
uchar xdata tmp[10]; //在外ram區開辟10個位元組的內存空間,地址是外ram的0x0000-0x0009
......

第1種情況:

uchar data * data pstr;
pstr=tmp;

首先要提醒大家這樣的代碼是有bug的, 他不能通過這種方式正確的訪問到tmp空間。 為什麼?我們把編譯後看到下面的匯編
代碼:

MOV 0x08,#tmp(0x00) ;0x08是指針pstr的存儲地址

看到了嗎!本來訪問外ram需要2 byte來定址64k空間,但因為使用data關鍵字(在"*"號前的那個),所以按KeilC編譯環境來說
就把他編譯成指向內ram的指針變數了,這也是初學C51的朋友們不理解各個存儲類型的關鍵字定義而造成的bug。特別是當工程中的
默認的存儲區類為large時,又把tmp[10] 聲明為uchar tmp[10] 時,這樣的bug是很隱秘的不容易被發現。

第2種情況:

uchar xdata * data pstr;
pstr = tmp;

這種情況是沒問題的,這樣的使用方法是指在內ram分配一個指針變數("*"號後的data關鍵字的作用),而且這個指針本身指向
xdata區("*"前xdata關鍵字的作用)。編譯後的匯編代碼如下。

MOV 0x08,#tmp(0x00) ;0x08和0x09是在內ram區分配的pstr指針變數地址空間
MOV 0x09,#tmp(0x00)

這種情況應該是在這里所有介紹各種情況中效率最高的訪問外ram的方法了,請大家記住他。

第3種情況:

uchar xdata * xdata pstr;
pstr=tmp;

這中情況也是對的,但效率不如第2種情況。編譯後的匯編代碼如下。

MOV DPTR, #0x000A ;0x000A,0x000B是在外ram區分配的pstr指針變數地址空間
MOV A, #tmp(0x00)
MOV @DPTR, A
INC DPTR
MOV A, #tmp(0x00)
MOVX @DPTR, A

這種方式一般用在內ram資源相對緊張而且對效率要求不高的項目中。

第4種情況:

uchar data * xdata pstr;
pstr=tmp;

如果詳細看了第1種情況的讀者發現這種寫法和第1種很相似,是的,同第1 種情況一樣這樣也是有bug的,但是這次是把pstr分
配到了外ram區了。編譯後的匯編代碼如下。

MOV DPTR, #0x000A ;0x000A是在外ram區分配的pstr指針變數的地址空間
MOV A, #tmp(0x00)
MOVX @DPTR, A

第5種情況:

uchar * data pstr;
pstr=tmp;

大家注意到"*"前的關鍵字聲明沒有了,是的這樣會發生什麼事呢?下面這么寫呢!對了用齊豫的一首老歌名來說就是 「請跟我
來」,請跟我來看看編譯後的匯編代碼,有人問這不是在講C51嗎?為什麼還要給我們看匯編代碼。C51要想用好就要盡可能提升C51
編譯後的效率,看看編譯後的匯編會幫助大家盡快成為生產高效C51代碼的高手的。還是看代碼吧!

MOV 0x08, #0X01 ;0x08-0x0A是在內ram區分配的pstr指針變數的地址空間
MOV 0x09, #tmp(0x00)
MOV 0x0A, #tmp(0x00)

注意:這是新介紹給大家的,大家會疑問為什麼在前面的幾種情況的pstr指針變數都用2 byte空間而到這里就用3 byte空間了
呢?這是KeilC的一個系統內部處理,在KeilC中一個指針變數最多佔用 3 byte空間,對於沒有聲明指針指向存儲空間類型的指針,
系統編譯代碼時都強制載入一個位元組的指針類型分辯值。具體的對應關系可以參考KeilC的help中C51 User's Guide。

第6種情況:

uchar * pstr;
pstr=tmp;

這是最直接最簡單的指針變數聲明,但他的效率也最低。還是那句話,大家一起說好嗎!編譯後的匯編代碼如下。

MOV DPTR, #0x000A ;0x000A-0x000C是在外ram區分配的pstr指針變數地址空間
MOV A, #0x01
MOV @DPTR, A
INC DPTR
MOV DPTR, #0x000A
MOV A, #tmp(0x00)
MOV @DPTR, A
INC DPTR
MOV A, #tmp(0x00)
MOVX @DPTR, A

這種情況很類似第5種和第3種情況的組合,既把pstr分配在外ram空間了又增加了指針類型的分辨值。

4. 單片機C語言編程中,是不是沒有傳統的數組定義例如:int a[] = {1,2,3..};好像單片機里沒有這種寫法

這個 不一定 你也可以定義成 不是code的形式,如果定義問code 的形式數據是悉舉存儲在ROM里的,裡面的數據是不能修改的,如果定義成非code形式 數據是存在RAM里,因為單片機的RAM有限 如果是一些固睜清碧定的數據最正扒好定義成不是code的形式。int a[]著這種形式 完全可以,其實你自己試試就知道了。

5. 單片機C語言中如何在外RAM中定義數組

unsigned char xdata arr[];數組定義在外部
arr[0] = XBYTE [0000]; 數組的起氏櫻始殲纖叢地豎悶址

6. 單片機C語言如何定義2維數組

跟C語言一樣呀:比如
unsigned char ary[10][10];
unsigned char * ary[10];
這些褲頌都基純鉛可以是二搏好維數組。

7. 單片機C語言里怎麼定義BYTE型的數組

1、C語言中的字元類型裂碰即char類型,一般者源爛情況佔1個位元組,因此一般使用char類型來描述位元組數首漏組。比如

charsz_byte[256];

2、有時候為了閱讀文件,會將char類型說明為BYTE類型。需要藉助於typedef關鍵字。比如

typedefcharBYTE;
BYTEbuff[16]={0};

8. 單片機c語言的數組可以這樣定義嗎

汗,你這個問題不是已經說過了嗎,數組賦值要麼你直接賦予常量,要麼你在程搜基序中賦值,怎麼能在全局攜陵直接賦值呢。世隱謹

unsigned char uint8;

unsigned int uint16;

uint8 r1, r2, r3, r4, r5, r6, r7, r8, r9, r10,
r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,
r21,r22,r23,r24,r25,r26,r27,r28,r29,r30,
r31,r32,r33,r34,r35,r36,r37,r38,r39,r40,
r41,r42,r43,r44,r45,r46,r47,r48,r49,r50,
r51,r52,r53,r54,r55,r56,r57,r58,r59,r60,
r61,r62,r63,r64,r65,r66,r67,r68,r69,r70,
r71,r72,r73,r74,r75,r76,r77,r78,r79,r80,
r81,r82,r83,r84,r85,r86,r87,r88,r89,r90,
r91,r92,r93,r94,r95,r96,r97,r98,r99,r100;

uint16 Tab[100]={0};
viod main(void)
{
Tab[1]=r1; Tab[2]=r2; Tab[3]=r3; Tab[4]=r4; Tab[5] =r5;
Tab[6]=r6; Tab[7]=r7; Tab[8]=r8; Tab[9]=r9; Tab[10]=r10;
Tab[11]=r11;Tab[12]=r12;Tab[13]=r13;Tab[14]=r14;Tab[15]=r15;
Tab[16]=r16;Tab[17]=r17;Tab[18]=r18;Tab[19]=r19;Tab[20]=r20;
Tab[21]=r21;Tab[22]=r22;Tab[23]=r23;Tab[24]=r24;Tab[25]=r25;
Tab[26]=r26;Tab[27]=r27;Tab[28]=r28;Tab[29]=r29;Tab[30]=r30;
Tab[31]=r31;Tab[32]=r32;Tab[33]=r33;Tab[34]=r34;Tab[35]=r35;
Tab[36]=r36;Tab[37]=r37;Tab[38]=r38;Tab[39]=r39;Tab[40]=r40;
Tab[41]=r41;Tab[42]=r42;Tab[43]=r43;Tab[44]=r44;Tab[45]=r45;
Tab[46]=r46;Tab[47]=r47;Tab[48]=r48;Tab[49]=r49;Tab[50]=r50;
Tab[51]=r51;Tab[52]=r52;Tab[53]=r53;Tab[54]=r54;Tab[55]=r55;
Tab[56]=r56;Tab[57]=r57;Tab[58]=r58;Tab[59]=r59;Tab[60]=r60;
Tab[61]=r61;Tab[62]=r62;Tab[63]=r63;Tab[64]=r64;Tab[65]=r65;
Tab[66]=r66;Tab[67]=r67;Tab[68]=r68;Tab[69]=r69;Tab[70]=r70;
Tab[71]=r71;Tab[72]=r72;Tab[73]=r73;Tab[74]=r74;Tab[75]=r75;
Tab[76]=r76;Tab[77]=r77;Tab[78]=r78;Tab[79]=r79;Tab[80]=r80;
Tab[81]=r81;Tab[82]=r82;Tab[83]=r83;Tab[84]=r84;Tab[85]=r85;
Tab[86]=r86;Tab[87]=r87;Tab[88]=r88;Tab[89]=r89;Tab[90]=r90;
Tab[91]=r91;Tab[92]=r92;Tab[93]=r93;Tab[94]=r94;Tab[95]=r95;
Tab[96]=r96;Tab[97]=r97;Tab[98]=r98;Tab[99]=r99;Tab[100]=r100;
while (1);
}

你可以這樣做。

熱點內容
動態規劃01背包演算法 發布:2024-11-05 22:17:40 瀏覽:849
nasm編譯器如何安裝 發布:2024-11-05 22:01:13 瀏覽:180
登錄密碼在微信的哪裡 發布:2024-11-05 22:00:29 瀏覽:739
c防止反編譯工具 發布:2024-11-05 21:56:14 瀏覽:247
安卓虛擬機怎麼用 發布:2024-11-05 21:52:48 瀏覽:344
php時間搜索 發布:2024-11-05 20:58:36 瀏覽:478
燕山大學編譯原理期末考試題 發布:2024-11-05 20:13:54 瀏覽:527
華為電腦出現臨時伺服器 發布:2024-11-05 20:05:08 瀏覽:408
斗戰神免費挖礦腳本 發布:2024-11-05 19:53:25 瀏覽:665
網吧伺服器分別是什麼 發布:2024-11-05 19:45:32 瀏覽:392