導航:首頁 > 源碼編譯 > c51語言編譯模式

c51語言編譯模式

發布時間:2022-10-07 00:30:09

㈠ 「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語言中如何嵌入匯編語言

keil C 語言中嵌入匯編語言進行混合編程,方法如下:

1、在C 文件中要嵌入匯編代碼片以如下方式加入匯編代碼

#pragma ASM

; Assembler Code Here

#pragma ENDASM

2、在Project 窗口中包含匯編代碼的C 文件上右鍵,選擇「Options for ...」

4、編譯,即可生成目標代碼

實例:

#include<reg52.h>

#define uchar unsigned char

sbit LED1=P1^0;

//C 嵌入匯編常式

void delay_ms(void)

{

#pragma asm

MOV R0,#0FFH

MOV R1,#0FFH

D_LOOP1:

DJNZ R0,D_LOOP1

MOV R0,#0FFH

DJNZ R1,D_LOOP1

#pragma endasm

}

void main(void)

{

uchar i;

P1 = 0xFF;

while(1)

{

i++;

delay_ms();

if(i>=7)

{

LED1 =~LED1;

i=0;

}

}

}

㈢ 匯編語言和C51語言對單片機系統進行編程有何區別

c51是基於c語言的,兩者的區別就是c語言和匯編語言的區別,所以c51更易學,只要有對應單片機的頭文件,兼容性沒問題的,建議你學c51吧,現在學匯編的已經不多了,學好了c51前途很光明的。你可以去下載keil
c51編程開發環境,不大,裡面有大部分單片機的頭文件,很不錯,我現在也學單片機,就在摸索它呢

㈣ C51用匯編語言寫,用什麼編譯器

匯編語言的51程序可以用KEIL編譯,也可以用ASM51編譯。

㈤ C51語言的編程技巧

C語言是一種高級程序設計語言,它提供了十分完備的規范化流程式控制制結構。因此採用C51語言設計單片機應用系統程序時,首先要盡可能地採用結構化的程序設計方法,這樣可使整個應用系統程序結構清晰,易於調試和維護。對於一個較大的程序,可將整個程序按功能分成若干個模塊,不同的模塊完成不同的功能。對於不同的功能模塊,分別指定相應的入口參數和出口參數,而經常使用的一些程序最好編成函數,這樣既不會引起整個程序管理的混亂,還可增強可讀性,移植性也好。
在程序設計過程中,要充分利用C51語言的預處理命令。對於一些常用的常數,如TRUE,FALSE,PI以及各種特殊功能寄存器,或程序中一些重要的依據外界條件可變的常量,可採用宏定義#define或集中起來放在一個頭文件中進行定義,再採用文件包含命令#include將其加入到程序中去。這樣當需要修改某個參量時,只須修改相應的包含文件或宏定義,而不必對使用它們的每個程序文件都作修改,從而有利於文件的維護和更新。現舉例說明如下:
例1 對於不同的單片機晶振,程序取不同的延時時間,而且可根據外界條件的變化修改延時時間的長短。對於這樣的程序,可利用宏定義和條件編譯來實現。程序如下:
#define flag 1
#ifdef flag==1
#define fosc 6M
delay=10;
#elif flag = = 0
#define fosc 8M
delay=12;
#else
#define fosc 12M
delay=20;
#endif
main()
{
for(I=0;I
}
這樣源程序不作任何修改就可適用於不同時鍾頻率的單片機系統,並可根據情況的不同取不同的delay值,完成不同的目的。

㈥ c51語言編譯錯誤找不到錯誤,定義的全局變數不能初始化賦值,求大神指導,感激不盡,程序如下:

因為一維數組的初始化是在定義一維數組的同時,對其賦初值,所以出現了錯誤

㈦ C51單片機用的是C語言還是匯編語言謝謝

兩種語言都可以,因為最後燒寫到晶元中的是二進制文件,該二進制文件由編輯器(如KEIL)編譯連接C語言源碼,或者匯編語言源碼獲得

㈧ c51語言頭文件包括的內容有8051單片機

3章C51編程語言基礎
【內容概要】本章介紹有關C51語言編程的基礎知識,對C51語言與8051匯編語言編程進行比較,了解C51語言與標准C語言的差別,並對C51語言的數據類型與存儲類型,C51語言的基本運算,分支與循環結構,數組、指針、函數等也做以介紹。

隨著單片機應用系統的日趨復雜,對程序的可讀性、升級與維護以及模塊化的要求越來越高,對軟體編程的要求也越來越高,這就要求編程人員在短時間內編寫出執行效率高、運行可靠的程序代碼。同時,也要方便多個編程人員來進行協同開發。

C51語言是目前的8051單片機應用開發中,普遍使用的程序設計語言。C51語言能直接對8051單片機硬體進行操作,它既有高級語言的特點,又有匯編語言的特點,因此在8051單片機程序設計中,C51語言得到非常廣泛的使用。

3.1C51編程語言簡介

C51語言是在標准C語言的基礎上針對8051單片機的硬體特點進行了擴展,並向8051單片機上移植,經過多年努力,C51語言已成為公認的高效、簡潔的8051單片機的實用高級編程語言。與8051匯編語言相比,C51語言在功能上、結構性、可讀性、可維護性上有明顯優勢,且易學易用。

3.1.1C51語言與8051匯編語言的比較

與8051單片機匯編語言相比, C51語言具有如下優點。

(1)可讀性好。C51語言程序比匯編語言程序的可讀性好,編程效率高,程序便於修改、維護以及升級。

(2)模塊化開發與資源共享。用C51語言開發的程序模塊可以不經修改,直接被其他工程所用,使得開發者能夠很好地利用已有的大量標准C程序資源與豐富的庫函數,從而減少重復勞動,同時也有利於多個程序設計者協同開發。

(3)可移植性好。為某種型號單片機開發的C語言程序,只需將與硬體相關的頭文件和編譯鏈接的參數進行適當修改,就可方便地移植到其他型號的單片機上。例如,為8051單片機編寫的程序通過改寫頭文件以及少量的程序行,就可方便地移植到PIC單片機上。

(4)生成的代碼效率高。當前較好的C51語言編譯系統編譯出來的代碼,效率只比直接使用匯編語言低20%左右,如果使用優化編譯選項,最高效率可達到90%。

3.1.2C51語言與標准C語言的比較

C51語言與標准C語言有許多相同之處,但也有其自身的一些特點。不同的嵌入式C語言編譯系統之所以與標准C語言有不同的地方,主要是由於它們所針對的硬體系統不同。對於8051單片機,目前廣泛使用的是C51語言。

C51語言的基本語法與標准C語言相同,只是在標准C語言的基礎上進行了適合於8051內核單片機硬體的擴展。深入理解C51語言對標准C語言的擴展部分以及它們的不同之處,是掌握C51語言的關鍵之一。

C51語言與標准C語言的一些差別如下。

(1)庫函數的不同。標准C語言中的,不適合於嵌入式控制器系統的庫函數,被排除在C51語言之外,如字元屏幕和圖形函數,而有些庫函數必須針對8051單片機的硬體特點來做出相應的開發。例如,庫函數printf和scanf,在標准C語言中,這兩個函數通常用於屏幕列印和接收字元,而在C51語言中,主要用於串列口數據的收發。

(2)數據類型有一定區別。在C51語言中增加了幾種針對8051單片機特有的數據類型,在標准C語言的基礎上又擴展了4種類型。例如,8051單片機包含位操作空間和豐富的位操作指令,因此,C51語言與標准C語言相比增加了位類型。

(3)C51語言的變數存儲模式與標准C語言中的變數存儲模式數據不一樣。標准C語言最初是為通用計算機設計的,在通用計算機中只有一個程序和數據統一定址的內存空間,而C51語言中變數的存儲模式與8051單片機的各種存儲器區緊密相關。

(4)數據存儲類型的不同。8051單片機存儲區可分為內部數據存儲區、外部數據存儲區以及程序存儲區。內部數據存儲區可分為3個不同的C51存儲類型:data、idata和bdata。外部數據存儲區分為2個不同的C51存儲類型:xdata和pdata。程序存儲區只能讀不能寫,可能在8051單片機片內或在片外,C51語言提供的code存儲類型用來訪問程序存儲區。

㈨ keil C51調試的時候發現c語言編譯出來的匯編語言不是我所需要的,怎麼修改方便

有難度。你要總結一些這方面的經驗。
C編譯的時候。會多出一些東西來是正常的。因為編譯器不是針對某一個MCU來做的。所以,它在編譯的時候往往會參考INTEL的晶元結構來做。
你可以找一些C語言編譯優化等資料來看看。寫程序的時候,把運算的代碼盡可能的分行來寫,特別是IF等語句不要執行帶運算的判斷。少一個跳轉的情況。盡量的少使用乘除法。改用移位來實現。慢慢的你就會做到了!

㈩ C51編程時,可以使用標准C語言的所有數據類型。為什麼「編程時常用unsigned c

這體現了嵌農和碼農的價值觀區別。
嵌農會精心計算一個變數的范圍,而碼農很少這么做,因為碼農默認的數值類型一般是int32,可以滿足日常范圍需求,甚至像Python那樣的語言自帶大整數特性,根本不用考慮范圍。然而嵌農呢,尤其是你說的c51,是個Intel祖傳8位機,本來ram就很少,當然要精心考慮變數的大小了。像int32這樣的東西太奢侈了,只能精打細算,根據現實情況精選一個范圍合適的類型。鑒於大部分情況並不需要負數,所以用unsigned類型能提高0以上的數值范圍。另外需要指出的是很多c51編譯器里int類型是16位的。所以嵌農的悲傷就在這里,別人已經開始寫演算法了,你還在研究這個變數存不存得下的問題。
C51語言,由C語言繼承而來的單片機編程語言。

和C語言不同的是,C51語言運行於單片機平台,而C語言則運行於普通的桌面平台。C51語言具有C語言結構清晰的優點,便於學習,同時具有匯編語言的硬體操作能力。對於具有C語言編程基礎的讀者,能夠輕松地掌握單片機C51語言的程序設計。

閱讀全文

與c51語言編譯模式相關的資料

熱點內容
朋友賣房要解壓嗎 瀏覽:107
sar命令安裝 瀏覽:169
安卓怎麼看我自己去過哪裡 瀏覽:283
演算法分析里log沒有底數嗎 瀏覽:221
伺服器卡頓怎麼連接 瀏覽:957
手機拍照文件夾自動生成 瀏覽:787
瀏覽器如何運行在伺服器端 瀏覽:790
collinux 瀏覽:449
日本歐美韓國推理片電影大分享 瀏覽:615
怎麼下載香港app游戲 瀏覽:217
加密貨幣或迎來新的上漲趨勢 瀏覽:827
電腦桌面的文件夾怎麼發的 瀏覽:194
linuxkangle 瀏覽:150
程序員負債 瀏覽:154
怎麼把解壓的游戲放到桌面上 瀏覽:981
文件夾不存在刪除不了怎麼辦 瀏覽:835
android關機命令行 瀏覽:152
網易雲伺服器支持接入什麼功能 瀏覽:649
編程器用法hpz420 瀏覽:160
日本巨胸奶大電影 瀏覽:210