導航:首頁 > 源碼編譯 > 51編譯器分配

51編譯器分配

發布時間:2022-07-25 23:17:51

❶ 適合51單片機編譯器有哪些

編譯器叫KEIL4一般都用這個,下載器是STC-ISP,是通過串口下載的!

❷ 51單片機主程序默認為使用第0組通用寄存器么如果想改為其他組,應怎

C語言編譯器會自動分配通用寄存器,一般無需干預。如果需要指定某一組通用寄存器,可以使用using關鍵字。

匯編的話,需要人工處理寄存器分配問題,設置PSW寄存器即可。

❸ Keil C51下如何讓編譯器優先使用片內RAM

C51內存結構深度剖析
在編寫應用程序時,定義一個變數,一個數組,或是說一個固定表格,到底存儲在什麼地方;當定義變數大小超過MCU的內存范圍時怎麼辦;如何控制變數定義不超過存儲范圍;以及如何定義變數才能使得變數訪問速度最快,寫出的程序運行效率最高。以下將一一解答。

1 六類關鍵字(六類存儲類型)
data idata xdata pdata code bdata

code: code memory (程序存儲器也即只讀存儲器)用來保存常量或是程序。code memory 採用16位地址線編碼,可以是在片內,或是片外,大小被限制在64KB
作用:定義常量,如八段數碼表或是編程使用的常,在定義時加上code 或明確指明定義的常量保存到code memory(只讀)
使用方法:
char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
此關鍵字的使用方法等同於const

data data memory (數據存儲區)只能用於聲明變數,不能用來聲明函數,該區域位於片內,採用8位地址線編碼,具有最快的存儲速度,但是數量被限制在128byte或更少。
使用方法:
unsigned char data fast_variable=0;

idata idata memory(數據存儲區)只能用於聲明變數,不能用來聲明函數. 該區域位於片內,採用8位地址線編碼,內存大小被限制在256byte或更少。該區域的低地址區與data memory地址一致;高地址區域是52系列在51系列基礎上擴展的並與特殊功能寄存器具有相同地址編碼的區域。即:data memory是idata memory的一個子集。

xdata xdata memory 只能用於聲明變數,不能用來聲明函數,該區域位於MCU
外部,採用16位地址線進行編碼,存儲大小被限制在64KB以內。
使用方法:
unsigned char xdata count=0;

pdata pdata memory 只能用於聲明變數,不能用來聲明函數,該區域位於MCU外部,採用8位地址線進行編碼。存儲大小限制在256byte. 是xdata memory的低256byte。為其子集。
使用方法
unsigned char pdata count=0;

bdata bdata memory 只能用於聲明變數,不能用來聲明函數。該區域位於8051內部位數據地址。定義的量保存在內部位地址空間,可用位指令直接讀寫。
使用方法:
unsigned char bdata varab=0

註:有些資料講,定義字元型變數時,在預設unsigned 時,字元型變數,默認為無符號,與標准C不同,但我在Keil uVision3中測試的時候發現並非如此。在預設的情況下默認為有符號。或許在以前的編譯器是默認為無符號。所以看到有的資料上面這樣講的時候,要注意一下,不同的編譯器或許不同。所以我們在寫程序的時候,還是乖乖的把unsigned signed 加上,咱也別偷這個懶。
2函數的參數和局部變數的存儲模式
C51 編譯器允許採用三種存儲器模式:SMALL,COMPACT 和LARGE。一個函數的存儲器模式確定了函數的參數的局部變數在內存中的地址空間。處於SMALL模式下的函數參數和局部變數位於8051單片機內部RAM中,處於COMPACT和LARGE模式下的函數參數和局部變數則使用單片機外部RAM。在定義一個函數時可以明確指定該函數的存儲器模式。方法是在形參表列的後面加上一存儲模式。

示例如下:
#pragma large //此預編譯必須放在所有頭文前面
int func0(char x,y) small;
char func1(int x) large;
int func2(char x);
註:
上面例子在第一行用了一個預編譯命令#pragma 它的意思是告訴c51編譯器在對程序進行編譯時,按該預編譯命令後面給出的編譯控制指令LARGE進行編譯,即本常式序編譯時的默認存儲模式為LARGE.隨後定義了三個函數,第一個定義為SMALL存儲模式,第二個函數定義為LARGE第三個函數未指定,在用C51進行編譯時,只有最後一個函數按LARGE存儲器模式處理,其它則分別按它們各自指定的存儲器模式處理。
本例說明,C51編譯器允許採用所謂的存儲器混合模式,即允許在一個程序中將一些函數使用一種存儲模式,而其它一些則按另一種存儲器模式,採用存儲器混合模式編程,可以充分利用8051系列單片機中有限的存儲器空間,同時還可以加快程序的執行速度。

3絕對地址訪問 absacc.h(相當重要)

#define CBYTE ((unsigned char volatile code *) 0)
#define DBYTE ((unsigned char volatile data *) 0)
#define PBYTE ((unsigned char volatile pdata *) 0)
#define XBYTE ((unsigned char volatile xdata *) 0)
功能:CBYTE 定址 CODE區
DBYTE 定址 DATA區
PBYTE 定址 XDATA(低256)區
XBYTE 定址 XDATA區
例: 如下指令在對外部存儲器區域訪問地址0x1000
xvar=XBYTE[0x1000];
XBYTE[0x1000]=20;

#define CWORD ((unsigned int volatile code *) 0)
#define DWORD ((unsigned int volatile data *) 0)
#define PWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0)

功能:與前面的一個宏相似,只是它們指定的數據類型為unsigned int .。
通過靈活運用不同的數據類型,所有的8051地址空間都是可以進行訪問。

DWORD[0x0004]=0x12F8;
即內部數據存儲器中(0x08)=0x12; (0x09)=0xF8

註:用以上八個函數,可以完成對單片機內部任意ROM和RAM進行訪問,非常方便。還有一種方法,那就是用指鍾,後面會對C51的指針有詳細的介紹。

4寄存器變數(register)
為了提高程序的執行效率,C語言允許將一些頻率最高的那些變數,定義為能夠直接使用硬體寄存器的所謂的寄存器變數。定義一個變數時,在變數類型名前冠以「register」 即將該變數定義成為了寄存器變數。寄存器變數可以認為是一自動變數的一種。有效作用范圍也自動變數相同。由於計算機寄存器中寄存器是有限的。不能將所有變數都定義成為寄存器變數,通常在程序中定義寄存器變數時,只是給編譯器一個建議,該變數是否真正成為寄存器變數,要由編譯器根據實際情況來確定。另一方面,C51編譯器能夠識別程序中使用頻率最高的變數,在可能的情況下,即使程序中並未將該變數定義為寄存器變數,編譯器也會自動將其作為寄存器變數處理。被定義的變數是否真正能成為寄存器變數,最終是由編譯器決定的。

5內存訪問雜談
1指鍾
指鍾本身是一個變數,其中存放的內容是變數的地址,也即特定的數據。8051的地址是16位的,所以指針變數本身佔用兩個存儲單元。指針的說明與變數的說明類似,僅在指針名前加上「*」即可。
如 int *int_point; 聲明一個整型指針
char *char_point; 聲明一個字元型指針
利用指針可以間接存取變數。實現這一點要用到兩個特殊運算符
& 取變數地址
* 取指針指向單元的數據

示例一:
int a,b;
int *int_point; //定義一個指向整型變數的指針
a=15;
int_point=&a; //int_point指向 a
*int_point=5; //給int_point指向的變數a 賦值5 等同於a=5;
示例二:
char i,table[6],*char_point;
char_point=table;
for(i=0;i<6;i++)
{
char_point=i;
char_point++;
}
註:
指針可以進行運算,它可以與整數進行加減運算(移動指針)。但要注意,移動指針後,其地址的增減量是隨指針類型而異的,如,浮點指針進行自增後,其內部將在原有的基礎上加4,而字元指針當進生自增的時候,其內容將加1。原因是浮點數,佔4個內存單元,而字元佔一個位元組。

宏晶科技最新一代STC12C5A360S2系列,每一個單片機出廠時都有全球唯一身份證號碼(ID號),用戶可以在單片機上電後讀取內部RAM單元F1H~F7H的數值,來獲取此單片機的唯一身份證號碼。使用MOV @Ri 指令來讀取。下面介紹C51 獲取方法:
char id[7]={0};
char i;
char idata *point;
for(i=0;i<7;i++)
{
id[i]=*point;
point++;
}

(此處只是對指針做一個小的介紹,達到訪問內部任何空間的方式,後述有對指針使用的詳細介紹)
2對SFR,RAM ,ROM的直接存取
C51提供了一組可以直接對其操作的擴展函數
若源程序中,用#include包含頭文件,io51.h 後,就可以在擴展函數中使用特殊功能寄存器的地址名,以增強程序的可讀性:

注 此方法對SFR,RAM,ROM的直接存取不建議使用.因為,淡io51.h這個頭文件在KEIL中無法打開,可用指針,或是採用absacc.h頭文件,

❹ 主流C51單片機編譯器比對

int short 的大小是因機器而異嘛(准確點應該是編譯器)。你都說了人家規定的是「最小」為16位,又不是只能是16位,也沒有說兩者應該相等(事實上是short不超過int就OK啦)。所以當然可以short類型為半個機器字長,而int類型則為一個機器字長的啦。

「C++標准規定了每個算術類型的最小存儲空間,但他並不自知編譯器使用更大的存儲空間 」

說簡單點就是C++規定了個最小的值,但是將你的代碼編譯成機器碼的編譯器則確定了你這個長度值為多少。因為C++是一種語言,一個規范,或者說只是一種規定,然後要將你按這種規范寫的代碼編譯成能在機器上運行的代碼的是編譯器。而在不同的機器上運行的程序的實際結構是不一樣的,比如單片機與PC相差就很大。要將按相同規范寫的程序在各種各樣亂七八糟的機器上運行,就需要相應的編譯器了。所以實際的大小是由你編譯代碼的編譯器確定的。

PS:當然當前一般的PC上int都是32位,short16位的。因為現在32位的機子是主流嘛。如果你不寫什麼單片機的程序可以不用太在意這個問題。但是寫單片機程序時就要注意了,因為一般一個單片機的編譯器可以編譯很多種型號晶元的代碼,而這些型號有可能從8位到32位都有……

❺ C51中如果定義變數的存儲器為什麼,則編譯器將其分配與位定址區存儲

不為什麼。
編譯器的工作,是自動的。
它有它的一套優化方式,使用者,是無須理解的。

❻ 關於c51單片機使用keil編譯器的一些問題

1.如果沒有被調用,就不會被編譯,自然不佔用空間。
2.只要結構體有元素被使用,就要佔據整個結構體的空間。
3.多出來的0.2是位變數,表示你用了兩個bit的變數。

❼ keil c51編譯器的問題

51的標準定址空間的確只有16位、64kB。不過藉助外部擴展的手段(Px口或分時鎖存)理論上可以訪問無限大的存儲空間。
Keil C51本身支持最大16MB的定址空間,不過單片機的管腳連接必須符合一定規定。具體可翻閱一下說明書。

❽ 51單片機匯編語言如何定義局部變數高手幫幫忙……

51單片機匯編語言如何聲明局部變數?
--用 EQU 偽指令,即可。

51單片機定義或聲明一個變數在程序執行時是否需要時間?
--偽指令,不佔用單片機的時間。

或是定義一個變數,這條指令的執行時間是多少?
--零秒。
--偽指令,不用單片機執行。

❾ 51單片機擴展外部數據存儲器6264,怎麼用C語言實現對其操作

2.擴展RAM編程基礎
(1)弄清擴展器件的地址
在圖7.2.5中,U3的ABC接單片機A13,A14,A15,所以片選信號對應地址最高位,即:「CBAxxxxx xxxxxxxx」(x為任意)。U4片選接CS1,即Y1,CBA=001,可得U4的地址范圍是0x2000~0x3fff。U5接CS3,即Y3,CBA=011,地址為0x6000~0x7fff。U6接CS4,即Y4,CBA=100,地址為0x8000~0x9fff。知道了器件地址,可以利用直接地址、外部數據指針來訪問存儲器。通過設置,也可以讓編譯器在擴展RAM中自動分配存儲單元。
(2)直接地址訪問
①向U4寫數據:
XBYTE[0x2000+addr]=dat; //addr為U4內部地址,取值為0~0x1fff;dat為數據。
②讀出U4數據:
dat=XBYTE[0x2000+addr];
也可以用頁訪問方式。頁訪問方式,實際就是先把16位地址高8位送P2口,通過低8位地址讀寫。
③按頁讀寫U4:
P2=0x20+page; // page為頁,取值為0x00~0x1F。
PBYTE[addr]=dat; // addr為頁內地址,取值為0x00~0xFF。
dat=PBYTE[addr];
④讀U6
dat=XBYTE[0x8000];//讀U6,地址取0x8000~0x9fff任何值,都一樣。
⑤寫U5
XBYTE[0x6000]=dat; //寫U5,地址取0x6000~0x7fff任何值,都一樣。
(3)數據指針
如,讀寫U4,可以這樣寫:
unsigned char xdata *p=0x3000; //聲明指針p,並初始指向0x3000單元
x=*p; //讀指針所指向的位置
p=p+1; //指針指向下一單元
*p=0x16; //向指針所指向的位置寫入數據
(4)讓編譯器自動分配存儲空間
①為了能讓編譯器自動分配存儲空間,並使用擴展RAM,必須設置擴展RAM地址。在Keil編程軟體中,點擊工具欄快捷圖標「 」,彈出目標選項對話框。按圖7.2.6所示,設置RAM起始地址和長度。
②變數聲明時使用xdata關鍵詞。如:
unsigned char xdata a;//變數a使用擴展RAM空間。
特別注意,擴展RAM直接地址訪問方式與自動分配存儲空間方式最好不要混用,否則可能產生沖突。
摘自《單片機控制裝置安裝與調試》下冊,雷林均主編

閱讀全文

與51編譯器分配相關的資料

熱點內容
非對稱型密碼演算法 瀏覽:687
安卓qq分享屏幕怎麼分享電視聲音 瀏覽:933
雲之家程序員 瀏覽:623
怎麼讓表格中的名稱生成文件夾 瀏覽:184
網頁控制單片機需要哪些js文件 瀏覽:670
類似7z002的壓縮文件如何解壓 瀏覽:561
移動dsn伺服器地址 瀏覽:691
90後女性嫁給程序員 瀏覽:304
fcm演算法原理 瀏覽:805
上海興力壓縮機 瀏覽:701
什麼app可以推送小區 瀏覽:594
韓國解壓視頻網站 瀏覽:621
做庫管用什麼app 瀏覽:35
pdf轉dwg怎麼轉 瀏覽:55
單片機微小電阻測量 瀏覽:138
表格25兆怎麼壓縮 瀏覽:69
java開發公司的 瀏覽:131
東風天錦壓縮車工作指示燈不亮 瀏覽:985
劍俠情緣1源碼 瀏覽:532
cad2011怎麼轉換成pdf格式 瀏覽:966