A. 什麼是keil c51
Keil
C51是美國Keil
Software公司出品的51系列兼容單片機C語言軟體開發系統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的模擬調試器等在內的完整開發方案,通過一個集成開發環境(uVision)將這些部分組合在一起。運行Keil軟體需要WIN98、NT、WIN2000、WINXP等操作系統。如果你使用C語言編程,那麼Keil幾乎就是你的不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環境、強大的軟體模擬調試工具也會令你事半功倍。
B. keil c51軟體的作用是什麼
編譯程序,是單片機C語言的主要編譯工具
C. Keil C51語言具有哪些特點
Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟體開發系統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。用過匯編語言後再使用C來開發,體會更加深刻。 Keil C51軟體提供豐富的庫函數和功能強大的集成開發調試工具,全Windows界面。另外重要的一點,只要看一下編譯後生成的匯編代碼,就能體會到Keil C51生成的目標代碼效率非常之高,多數語句生成的匯編代碼很緊湊,容易理解。在開發大型軟體時更能體現高級語言的優勢。下面詳細介紹Keil C51開發系統各部分功能和使用。 2. Keil C51單片機軟體開發系統的整體結構 C51工具包的整體結構,如圖(1)所示,其中uVision與Ishell分別是C51 for Windows和for Dos的集成開發環境(IDE),可以完成編輯、編譯、連接、調試、模擬等整個開發流程。開發人員可用IDE本身或其它編輯器編輯C或匯編源文件。然後分別由C51及A51編譯器編譯生成目標文件(.OBJ)。目標文件可由LIB51創建生成庫文件,也可以與庫文件一起經L51連接定位生成絕對目標文件(.ABS)。ABS文件由OH51轉換成標準的Hex文件,以供調試器dScope51或tScope51使用進行源代碼級調試,也可由模擬器使用直接對目標板進行調試,也可以直接寫入程序存貯器如EPROM中。
D. keil軟體的作用是什麼 誰能分享
軟體介紹:
keil c51是一款應用於plc編程的軟體開發工具,它擁有強大的模擬器、調試器、宏匯編器、單板計算機以及符合生產標準的Keil C編譯器,在嵌入式軟體開發的基礎上有深層次的研發進展,幫助您在嵌入式開發上准確模擬硬體配置,以詳盡的測試報告對定量的數據進行簡單合理的分析。
所需工具:點擊下載 keil c51
安裝教程
1、在本站下載好安裝包,雙擊運行「c51v956.exe」程序,彈出軟體安裝向導,點擊「Next」開始安裝;
2、勾選「I agree to all the terms」同意許可證協議,協議內容自行決定是否瀏覽,點擊「Next」繼續安裝;
3、自定義軟體安裝目錄,默認路徑為「C:Keil_v5」,安裝路徑選擇時不要帶有英文符號的路徑,點擊「Next」進行安裝
4、填寫個人基本信息,完成後點擊「Next」跳過;
5、等待安裝進度完成,點擊「finish」完成安裝;
功能介紹
1、BL51鏈接器/定位器:組合由C51和A51產生的可重定位的目標模塊,生成絕對目標模塊。
2、A51宏匯編器:從89C51匯編源代碼產生可重定位的目標模塊。
3、OH51目標文件至HEX格式的轉換器,從絕對目標模塊生成Intel Hex文件。
4、μVision4 for Windows:是一個集成開發環境,它將項目管理、程序調試、源代碼編輯等組合在一個功能強大的環境中
5、RTX-51實時操作系統:簡化了復雜的實時應用軟體項目的設計。
6、C51國際際准化C交叉編譯器:從C源代碼產生就可以重定位的目標模塊。
7、LIB51庫管理器:從目標模塊生成連接器可以使用的庫文件。
軟體特色
1、Software packs – MDK軟體包
這部分較MDK v4版本做出了很大的更新。Software packs分為Device、CMSIS、MDK Professional Midleware三個小部分,包含了各類可用的設備驅動。。
MDK v5可以在Software packs窗口選擇需要安裝或者更新的軟體組件。
2、MDK Core – MDK核心
MDK Core包含微控制器開發所有的所有組件,包括IDE(uVision5)、編輯器、ARM C/C++編輯器、uVision調試跟蹤器和Pack Installer。
3、uVision5 IDE集成開發界面
uVision5 IDE 集成開發環境與uVision4相差不大,在編譯工具欄右側多了兩個綠色按鈕,Manage Run-time Environment和Pack Installer按鈕。
MDK Core是一個獨立的安裝包,大概300M左右大小,可以到ARM國內代理商米爾科技官網下載正式版本。下載安裝以後就可以一直使用,如果Keil有晶元支持、CMSIS或者中間庫的升級,直接通過Software packs本地升級即可。
E. gcc編譯器和嵌入式keil的C51編譯器有什麼不
前者是通用的C語言編譯器,後者相當於是個定製版。C51中定義了一些原先C語言中沒有的類型以及寄存器定義、同時鑒於單片機通常只有幾KB的內存空間進行了代碼生成量優化,專門用於單片機的開發,這些都是在GCC這樣標準的ANSI C編譯器中所沒有的。
F. keil c51的簡介
支持8051微控制器體系結構的Keil開發工具,適合每個階段的開發人員,不管是專業的應用工程師,還是剛學習嵌入式軟體開發的學生。 Keil C51目前由ARM國內授權代理商提供技術支持和銷售等相關服務。 產業標準的Keil C編譯器、宏匯編器、調試器、實時內核、單板計算機和模擬器,支持所有的251系列微控制器,幫助你如期完成項目進度。
以下圖表顯示Keil的開發工具以及它們相互之間的介面。
KEIL C51開發工具旨在解決嵌入式軟體開發商面臨的復雜問題。
當你開始一個新項目,只需簡單的從設備資料庫選擇使用的設備,uVision IDE將設置好所有的編譯器、匯編器、鏈接器和存儲器選項。
包含大量的常式,幫助你著手使用最流行的嵌入式8051設備。
Keil μVision調試器准確地模擬8051設備的片上外圍設備(IC、CAN、UART、SPI、中斷、I/O埠、A/D轉換器、D/A轉換器和PWM模塊)。模擬幫助你了解硬體配置,避免在安裝問題上浪費時間。 此外,使用模擬器你可以在沒有目標設備的情況下編寫和測試應用程序。
當你准備在目標硬體上測試軟體應用時,可以使用MON51、MON390、NONADI、或者FlashMON51目標監視器、ISD51 In-System調試器、ULINK USB-JTAG適配器在目標系統上下載並測試程序代碼。
G. keil c51的所有頭文件,其作用。
我來回答你的問題吧,前幾天對這個方面有一定的深入了解,也寫下了大量的筆記
雖然C編程的時候,對於不同的晶元,有不同的頭文件,但是,萬變不離其宗。
只要學會了寫自己的頭文件,就可以應付各類型號單片機了,就算你用的是AT89C2052,還是AT89C51,STC12C等等,都可以用一個頭文件reg51.h 不過要做相應的修。
以下是我對reg51.h個人的見解:(對於你很有用的) 後面帶上了在編寫C51時帶用的頭文件,及其內部函數和宏定義的詳細解說。
想了解如下方面的知識來來郵[email protected]
一, C51內存結構深度剖析
二, reg51.頭文件剖析
三, 淺淡變數類型及其作用域
四, C51常用頭文件
五, 淺談中斷
六, C51編譯器的限制
七, 小淡C51指針
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
reg51.頭文件剖析
我們平時寫單片機應用程序的時候,所使用的頭文件大多都是用的的reg51.h或是用reg52.h。會寫C51的人都會用,但對其頭文件內部的定義有所了解的人確並不多。
下面對其內部做詳細解釋,方便讀者作進一步的了解,並能運用各類型號的單片機。因為增強型號的單片機的增強功能都是通過特殊功能寄存器控制。
打開 reg52.h 頭文件,會發現是由大量的 sfr ,sbit的聲明組成,甚至於還有sfr16.其實這樣的聲明都是與單片機內部功能寄存器(特殊功能寄存器)聯系起來的,下面對其做出詳細解釋
sfr: 聲明變數
SFR 聲明一個變數,它的聲明與其它的C變數聲明基本相同,唯一的區別,SFR在聲明的同時為其指定特殊功能寄存器作為存儲地址,而不同於C變數聲明的整型,字元型等等由編譯器自動分配存儲空間。
如reg52.h頭文件,第一條聲明就是sfr P0 = 0x80;
此處聲明一個變數P0,並指定其存儲地址為特殊功能寄存器0x80;,在加入reg52.h頭文件後。編寫應用程序時P0就可以直接使用而無需定義,對P0的操作就是,對內部特殊功能寄存器(0x80對應用MCU的P0口)的操作,可進行讀寫操作。
如果將第一條聲明改為sfr K0 = 0x80; 那麼,如果要把單片機的P0口全部拉低,則不能寫P0=0x00;而應保存後再在應用程序中寫成K0=0x00;否則編譯器會提示「P0為未定義標識符」
使用方法:
sfr [variable] = [address] //為變數分配一個特殊功能寄存器。
1 等號右邊,只能是十進制,十六進制整型的數據常量,,不允許帶操作符的表達式
經典的8051內核支持的SFR地址從0x80H~0xFF 飛利浦80C51MX系列0x180H~0x1FF
2 SFR不能聲明於任何函數內部,包括main函數。只能聲明於函數外。
3 用SFR聲明一個變數後,不能用取地址運算符&獲取其地址, 編譯無法通過,編譯器會提示非法操作。
4 有一點須特別注意,51內核0x80~0xff,為特殊功能寄存器地址區間,但並不是所有的地址都有定義,如果說你所用的MCU晶元上對於某個地址沒有定義,那麼用sfr在定義變數的時候,不要把變數的地址分配到未定義的特殊功能寄存器上,雖然編譯時能通過,用KEIL模擬時貌似是沒有問題,但下載到晶元里運行時,是會出問題的。比如說,向一個未定義的特殊功能寄存器執行讀操作,讀出來的就是一個未知的數。(讀者可自行測試,先把串口通信調通,然後做一個簡單的人機交互。讀出一個數後,再發給計算機,用串口調試助手或是串口監控查看。這用方法在模擬的時候很有用。)所以具體那些特殊功能寄存器能夠用,就要查看你使用的晶元手冊。
5 若遇到增強性的單片機,只要知道其擴展的特殊功能寄存器的地址,用SFR定
就可以很方便進行編程。
sbit: 聲明變數
sbit 同樣是聲明一個變數,和SFR 使用方法類似,但是SBIT是用來聲明一個位變數,因為,在51系列的應用中,非常有必要對SFR的單個位進行存取,而通過bit 數據類型,使其具備位定址功能。
如,在reg52.h中有如下聲明
sfr IE = 0xA8;
sbit EA = IE^7;
sbit ET2 = IE^5; //8052 only
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
所以,對EA的操作即是對IE最高位的操作。
但如果想讓 SP DPL DPH PCON TMOC TL0 TL1 TH0 TH1 SBUF這些特殊功能寄存器具備位定址,採用上述如IE類似的定義,是不行的,雖然修改後,在編譯的時候不會出現錯誤,但只要用到你定義的位變數名時就會出錯。原因是,只有特殊功能寄存器的地址是8的倍數(十六進制以0或8結尾)才能進行位定址。
打開reg52.h頭文件可以看到,所有用sbit聲明了的特殊功能寄存器的地址均是以0或8結尾
如硬要達到上述要求,可用帶參的宏定義來完成。此處不做詳細說明(意義並不大)。
下面對sbit的使用做詳細介紹:
隨著8051的應用,非常有必要對特殊功能寄存器的單個bit位進行存取,C51編譯器通過sbit 數據類型,提供了對特殊功能寄存器的位操作。
以下是sbit的三種應用形式:
一, sbit name = sfr-name^bit-position;
sfr PSW =0xD0;
sfr IE =0xA8;
sbit OV= PSW^2;
sbit CY=PSW^7;
sbit EA= IE^7;
二, sbit name= sft-address^bit-position;
sbit OV =0xD0^2;
sbit CY =0xD0^7;
sbit EA =0xA8^7;
三, sbit name= sbit-address;
sbit OV =0xD2;
sbit CY =0xD7;
sbit EA =0xAF;
現對上述三種形式的聲明做必要的說明
第一種形式sbit name = sfr-name^bit-position;如sbit OV= PSW^2; 當中的這個特殊功能寄存器必須在此之前已經用sfr 定義,否則編譯會出錯。
bit-position范圍從0~7;
第二種形式 sbit name= sft-address^bit-position如sbit OV =0xD0^2; 與第一種形式不同之外在於,此處直接使用PSW的地址.第一種形式須先定義PSW
第三種形式. sbit name= sbit-address 如sbit OV =0xD2 是直接用的OV的地址
OV的地址計算方式,是OV所在的寄存器地址加上OV的bit-position
注意:
不是所有的SFR都可位定址。只有特殊功能寄存器的地址是8的倍數(十六進制以0或8結尾)才能進行位定址,並且sbit聲明的變數名,雖可以是任意取,但是最好不要以下劃線開頭,因為以下劃線開頭的都保留給了C51的頭文件做保留字。
sfr16: 聲明變數
許多8051的派生型單片機,用兩個連續地址的特殊功能寄存器,來存儲一個16bit的值。例如,8052就用了0xCC和0xCD來保存定時/計數寄存器2的高位元組和低位元組。編譯器提供sfr16這種數據類型,來保存兩個位元組的數據。虛擬出一個16bit的寄存器。
如下:
sfr16 T2 = 0xCC
存儲方面為小端存儲方式,低位元組在前,高位元組在後。定義時,只寫低位元組地址,如上,則定義T2為一個16位的特殊功能寄存器。 T2L= 0CCh, T2H= 0CDh
使用方法:
sfr [variable] = [low_address]
1 等號右邊,只寫兩個特殊功能寄存器的低地址,且只能是十進制,十六進制的整型數據常量,不允許帶操作符的表達式
2 SFR不能聲明於任何函數內部,包括main函數。只能聲明於函數外。
3 用SFR聲明一個變數後,不能用取地址運算符&獲取其地址, 編譯無法通過,編譯器會提示非法操作。
4 當你向一個sfr16寫入數據的時候,KEIL CX51 編譯器生成的代碼,是先寫高位元組,後寫低位元組,(可通過返匯編窗口查看)在有些情況下,這並非我們所想要的操作順序。使用時,須注意。
5 當你所要寫入sfr16的數據,當是高位元組先寫還是低位元組先寫非常重要的時候,就只能用sfr 這個關鍵字來定義,並且任意時刻只保存一個位元組,這樣操作才能保證寫入正確。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
C51常用頭文件
在KEIL 中,對於單片機所使用的頭文件,除了reg51 reg52以外,還有一些從各晶元制商的官網下載與reg51,reg52功能類似的頭文件,需了解透外,還要對各類型單片機均可通用且相當有用的的頭文件,做相應的了解。因為,內部所包含的函數與宏定義,可以及大的方便我們編寫應用程序。
1字元函數 ctype.h
1 extern bit isalpha(char);
功能:檢查參數字元是否為英文字母,是則返回1
2 extern bit isalnum(char)
功能:檢查字元是否為英文字母或數字字元,是則返回1
3 extern bit iscntrl(char)
功能:檢查參數值是否在0x00~0x1f 之間或等於0x7f,是則返回1
4 extern bit isdigit(char)
功能: 檢查參數是否為數字字元,是則返回1
5 extern bit isgraph(char)
功能: 檢查參數值是否為可列印字元,是則返回1,可列印字元為0x21~0x7e
6 extern bit isprint(char)
功能:除了與isgraph相同之外,還接受空格符0x20
7 extern bit ispunct(char)
功能:不做介紹。
8 extern bit islower(char)
功能:檢查參數字元的值是否為小寫英文字母,是則返回1
9 extern bit isupper(char)
功能:檢查參數字元的值是否為大寫英文字母,是則返回1
10 extern bit isspace(char)
功能:檢查字元是否為下列之一,空格,製表符,回車,換行,垂直製表符和送紙。如果為真則返回1
11 extern bit isxdigit(char)
功能:檢查參數字元是否為16進制數字字元,是則返回1
12 extern char toint(char)
功能:將ASCII字元0~9 a~f(大小寫無關)轉換成對應的16進制數字,
返回值00H~0FH
13 extern char tolower(char)
功能:將大寫字元轉換成小寫形式,如字元變數不在A~Z之間,則不作轉換而直接返回該字元
14 extern char toupper(char)
功能:將小寫字元轉換成大寫形式,如字元變數不在a~z之間,則不作轉換而直接返回該字元
15 define toascii(c) ((c)&0x7f)
功能:該宏將任何整形數值縮小到有效的ASCII范圍之內,它將變數和0x7f相與從而去掉第7位以上的所有數位
16 #define tolower(c) (c-『A』+』a』)
功能:該宏將字元與常數0x20 逐位相或
17 #define toupper(c) ((c)-『a』+』A』)
功能:該宏將字元與常數0xdf 逐位相與
2數學函數 math.h
extern int abs (int val);
extern char cabs (char val);
extern long labs (long val);
extern float fabs (float val);
功能:返回絕對值。上面四個函數,除了形參和返回值不一樣之外,
其它功能完全相同。
extern float exp (float val);
extern float log (float val);
extern float log10 (float val);
功能: exp 返回eval
log 返回 val 的自然對數
log10 返回 以10為底,val的對數
extern float sqrt (float val);
功能: 返回val的正平方根
extern int rand();
extern void srand(int n);
功能: rand返回一個0到32767之間的偽隨機數,srand用來將隨機數發生器初始化成一個已知的(期望)值。
Keil uVision3中的math.h庫中,不包含此函數。
extern float sin (float val);
extern float cos (float val);
extern float tan (float val);
功能: 返回val的正弦,餘弦,正切值。val為弧度 fabs(var) <=65535
extern float asin (float val);
extern float acos (float val);
extern float atan (float val);
extern float atan2 (float y, float x);
功能: asin 返回val的反正弦值。acos 返回val的反餘弦值。
atan 返回val的反正切值。
asin atan acos的值域均為 -π/2~+π/2
atan2返回x/y,的反正切值,其值域為-π~+π
extern float sinh (float val);
extern float cosh (float val);
extern float tanh (float val);
功能:cosh返回var的雙曲餘弦值,sinh返回var的雙曲正弦值,
tanh返回var的雙曲正切值。
extern float ceil (float val);
功能: 向上取整,返回一個大於val的最小整數。
extern float floor (float val);
功能: 向下取整,返回一個小於val的最大整數。
extern float pow (float x, float y);
功能: 計算計算xy的值。當(x=0,y<=0)或(x<0.y不是整數)時會發生錯誤。
extern void fpsave(struct FPBUF *p)
extern void fprestore(struct FPBUF *p)
功能:fpsave 保存浮點了程序的狀態,fprestore恢復浮點子程序的原始狀態,當中斷程序中需要執行浮點運算時,這兩個函數是很有用的。
註: Keil uVision3中的math.h庫中,不包含此函數。
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
4 內部函數 intrins.h
extern unsigned char _cror_ (unsigned char var, unsigned char n);
extern unsigned int _iror_ (unsigned int var, unsigned char n);
extern unsigned long _lror_ (unsigned long var, unsigned char n);
功能:將變數var 循環右移 n 位。
上三個函數的區別在於,參數及返回值的類型不同
extern unsigned char _crol_ (unsigned char var, unsigned char n);
extern unsigned int _irol_ (unsigned int var, unsigned char n);
extern unsigned long _lrol_ (unsigned long var, unsigned char n);
功能:將變數var 循環左移 n 位。
上三個函數的區別在於,參數及返回值的類型不同
例如:
#include<intrins.h>
void main()
{
unsigned int y;
y=0x0ff0;
y=_irol_(y,4); //y=0xff00
y=_iror_(y,4); //y=0x0ff0
}
void _nop_(void);
功能:_nop_產生一個8051單片機的NOP指令,C51編譯器在程序調用_nop_ 函數的地方,直接產生一條NOP指令。
H. 「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頭文件,
I. 為什麼KEIL編譯按鈕是灰色的
要把c文件添加到目錄下。
然後分別由C51及C51編譯器編譯生成目標文件(.obj)。目標文件可由LIB51 創建生成庫文件,也可以與庫文件一起經L51 連接定位生成絕對目標文件(.abs)。
abs文件由OH51 轉換成標準的hex 文件,以供調試器dScope51 或tScope51 使用進行源代碼級調試,也可由模擬器使用直接對目標板進行調試,也可以直接寫入程序存貯器如EPROM中。
(9)keilc51編譯器的作用擴展閱讀:
Keil C51標准C編譯器為8051微控制器的軟體開發提供了C語言環境,同時保留了匯編代碼高效,快速的特點。C51編譯器的功能不斷增強,使你可以更加貼近CPU本身,及其它的衍生產品。
C51已被完全集成到μVision2的集成開發環境中,這個集成開發環境包含:編譯器,匯編器,實時操作系統,項目管理器,調試器。μVision2 IDE可為它們提供單一而靈活的開發環境。
J. keiluvision2軟體編程
KeiluVision2是德國KeilSoftware公司出品的51系列兼容單片機C語言軟體開發系統,使用接近於傳統c語言的語法來開發,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用,而且大大的提高了工作效率和項目開發周期,他還能嵌入匯編,您可以在關鍵的位置嵌入,使程序達到接近於匯編的工作效率。KEILC51標准C編譯器為8051微控制器的軟體開發提供了C語言環境,同時保留了匯編代碼高效,快速的特點。C51編譯器的功能不斷增強,使你可以更加貼近CPU本身,及其它的衍生產品。C51已被完全集成到uVision2的集成開發環境中,這個集成開發環境包含:編譯器,匯編器,實時操作系統,項目管理器,調試器。uVision2IDE可為它們提供單一而靈活的開發環境。