![]() |
|
| | 网站首页 | 电子知识 | 单片机知识 | 电路设计 | 微电子技术 | SCADA系统 | 资源下载 | 给我留言 | 谷歌商城 | 视频教程 | ieee | |
| 热门搜索关键字: 单片机教程 | 三极管 | 二极管 | C语言 | 汇编语言 | SCADA | 元器件 | 模拟电子 | |
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 4. 串口縞帠~徑有三種方式: (1) Dos行命令方式 即先用install對MON51進行配置,然後用MON51進入Monitor狀態,啟用各種命令對Monitor51進行調試。 (2) tScope51方式 啟動tScope51裝入TS51目錄下的MON51.IOT驅動檔,與目標板通信。 (3) dScope51 for Windows方式 在選CPU驅動文件時,選“MON51.dll”,則檢查目標板並進入MON51狀態。 3. MON51的配置 (1) MON51 for Dos的配置 運行install檔(在MON51目錄下),不同的參數可以配置不同的硬體環境。INSTALL Serialtype [xdstastart][codestart][bank][PROMCHECK]],具體說明見MON51幫助文件或使用手冊。 (2) MON51 for Windows的配置 在啟用MON51.dll時,會使得系統自動檢查目標板連接,如配置不對,則彈出“Configuration”對話方塊,設置PC串口,串列傳輸速率等,完畢單擊“apply”有效。 4. 串口連接圖: 收發交叉互連,RTS、CTS直連,DSR、DTR直連,具體引腳排列參考串口資料。 5. MON51命令及使用 詳細的MON51命令可參閱幫助。 第四節 集成開發環境(IDE)的使用 1. Ishell for Dos的使用 進入Ishell之後看到兩個視窗:一個是檔視窗,一個是Dos命令行視窗,視窗上方是下拉式的命令功能表,其中的Files控制檔視窗的顯隱。 使用Ishell,第一步就是配置系統,即要學習兩個檔的修改與創建: (1) Ishell.CFG文件 每一個project都有一個Ishell.CFG,其中存放有“Option功能表和Setup功能表下的部分資訊;Bell enabled、Monochrome enabled、Editor Selected、CRT Lines、target enviroment、name of user edit、Automatic load for configuration enabled、file window enabled、file specification for file window、translate command line controls、project name等。 對每個project都必須設置以上?s接圖: 收發交叉互連,RTS、CTS直連,DSR、DTR直連,具體引腳排列參考串口資料。 5. MON51命令及使用 詳細的MON51命令可參閱幫助。 第四節 集成開發環境(IDE)的使用 1. Ishell for Dos的使用 進入Ishell之後看到兩個視窗:一個是檔視窗,一個是Dos命令行視窗,視窗上方是下拉式的命令功能表,其中的Files控制檔視窗的顯隱。 使用Ishell,第一步就是配置系統,即要學習兩個檔的修改與創建: (1) Ishell.CFG文件 每一個project都有一個Ishell.CFG,其中存放有“Option功能表和Setup功能表下的部分資訊;Bell enabled、Monochrome enabled、Editor Selected、CRT Lines、target enviroment、name of user edit、Automatic load for configuration enabled、file window enabled、file specification for file window、translate command line controls、project name等。 對每個project都必須設置以上資訊,然後存檔“setup”的的“save”,這樣才可正式開始下面工作。 (2) IShell.col文件 對IDE顏色設置,如不改動,可以缺省為主。 (3) CDF文件 該檔位於BIN目錄下,每一檔定義一組外部函數工具包,即定義外部環境如8051.CDF,USER.CDF等,開發者可修改CDF檔,供自己使用,至於CDF檔內容可查看一下8051.CDF即可知道。注意.CDF檔是Ishell系統的核心所在,不同的CDF檔可使本IDE適用於不同的編譯、連接系統,即本IDE並不僅適於C51。 下面談一談Automake工具: C51的Automake是一個project管理器,在8051工具包中以OBJECT檔形式保留了一個project的資訊,AutoMake用這些資訊來進行project管理,一旦手工建立一個project,Automake可生成一個新的OBJECT,AutoMake利用此檔來編譯那些修改過的檔。 Automake支持C51、A51%A穈T,然後存檔“setup”的的“save”,這樣才可正式開始下面工作。 (2) IShell.col文件 對IDE顏色設置,如不改動,可以缺省為主。 (3) CDF文件 該檔位於BIN目錄下,每一檔定義一組外部函數工具包,即定義外部環境如8051.CDF,USER.CDF等,開發者可修改CDF檔,供自己使用,至於CDF檔內容可查看一下8051.CDF即可知道。注意.CDF檔是Ishell系統的核心所在,不同的CDF檔可使本IDE適用於不同的編譯、連接系統,即本IDE並不僅適於C51。 下面談一談Automake工具: C51的Automake是一個project管理器,在8051工具包中以OBJECT檔形式保留了一個project的資訊,AutoMake用這些資訊來進行project管理,一旦手工建立一個project,Automake可生成一個新的OBJECT,AutoMake利用此檔來編譯那些修改過的檔。 Automake支持C51、A51、L51/BL51、C166、A166、L166等編譯連接器。點中主功能表中的Automake即運行本工具。 Ishell for Dos使用比較繁瑣,推薦使用uVision for windows。 2. uVision for windows的使用 uVision是一個標準的windows應用程式,其編譯功能、檔處理功能、project處理功能、視窗功能以及工具引用功能(如A51、C51、PL/M41、BL51 dScope等)等都較Ishell for Dos要強得多。 uVision採用BL51作連接器,因為BL51相容L51,所以一切能在Dos下工作的project都可以到uVision中進行連接調試C uVision採用dScope for windows作調試器,該調試器支援MON51及系統類比兩種方式,功能較for DOS要強大好用,調試功能強大。 注意: (1) Option功能表下的各項要會使用,其中A51、C51、PL/M51、BL51定義各檔所使用的編譯、連接控制指令,dScope定義一個dScope初始化檔。Make則是定婚L51/BL51、C166、A166、L166等編譯連接器。點中主功能表中的Automake即運行本工具。 Ishell for Dos使用比較繁瑣,推薦使用uVision for windows。 2. uVision for windows的使用 uVision是一個標準的windows應用程式,其編譯功能、檔處理功能、project處理功能、視窗功能以及工具引用功能(如A51、C51、PL/M41、BL51 dScope等)等都較Ishell for Dos要強得多。 uVision採用BL51作連接器,因為BL51相容L51,所以一切能在Dos下工作的project都可以到uVision中進行連接調試。 uVision採用dScope for windows作調試器,該調試器支援MON51及系統類比兩種方式,功能較for DOS要強大好用,調試功能強大。 注意: (1) Option功能表下的各項要會使用,其中A51、C51、PL/M51、BL51定義各檔所使用的編譯、連接控制指令,dScope定義一個dScope初始化檔。Make則是定義一個make檔。 (2) 進入調試是在RUN菜單下運行dScope。 (3) project中包括新建、打開、修改、更新、編譯、連接等poject處理,具體使用可參考後面的例子。 第三章 Keil C51 vs 標準C 深入理解並應用C51對標準ANSIC的擴展是學習C51的關鍵之一。因為大多數擴展功能都是直接針對8051系列CPU硬體的。大致有以下8類: ●8051存儲類型及存儲區域 ●存儲模式 ●記憶體類型聲明 ●變數類型聲明 ●位元變數與位元定址 ●特殊功能寄存器(SFR) ●C51指針 ●函數屬性 具體說明如下(8031為缺省CPU)。 第一節 Keil C51擴展關鍵字 C51 V4.0版本有以下擴展關鍵字(共19個): _at_ idata sfr16 alien interrupt small bdata large _task_ Code bit pdata q一個make檔。 (2) 進入調試是在RUN菜單下運行dScope。 (3) project中包括新建、打開、修改、更新、編譯、連接等poject處理,具體使用可參考後面的例子。 第三章 Keil C51 vs 標準C 深入理解並應用C51對標準ANSIC的擴展是學習C51的關鍵之一。因為大多數擴展功能都是直接針對8051系列CPU硬體的。大致有以下8類: ●8051存儲類型及存儲區域 ●存儲模式 ●記憶體類型聲明 ●變數類型聲明 ●位元變數與位元定址 ●特殊功能寄存器(SFR) ●C51指針 ●函數屬性 具體說明如下(8031為缺省CPU)。 第一節 Keil C51擴展關鍵字 C51 V4.0版本有以下擴展關鍵字(共19個): _at_ idata sfr16 alien interrupt small bdata large _task_ Code bit pdata using reentrant xdata compact sbit data sfr 第二節 記憶體區域(Memory Areas): 1. Pragram Area: 由Code說明可有多達64kBytes的程式記憶體 2. Internal Data Memory: 內部資料記憶體可用以下關鍵字說明: data:直接定址區,為內部RAM的低128位元組 00H~7FH idata:間接定址區,包括整個內部RAM區 00H~FFH bdata:可位定址區, 20H~2FH 3. External Data Memory 外部RAM視使用情況可由以下關鍵字標識: xdata:可指定多達64KB的外部直接定址區,位址範圍0000H~0FFFFH pdata:能訪問1頁(25bBytes)的外部RAM,主要用於緊湊模式(Compact Model)。 4. Speciac Function Register Memory 8051提供128Bytes的SFR定址區,這區域可位元定址、位元組定址或字定址,用以控制計時器、計數器、串口、I/O及其它部件,可?D using reentrant xdata compact sbit data sfr 第二節 記憶體區域(Memory Areas): 1. Pragram Area: 由Code說明可有多達64kBytes的程式記憶體 2. Internal Data Memory: 內部資料記憶體可用以下關鍵字說明: data:直接定址區,為內部RAM的低128位元組 00H~7FH idata:間接定址區,包括整個內部RAM區 00H~FFH bdata:可位定址區, 20H~2FH 3. External Data Memory 外部RAM視使用情況可由以下關鍵字標識: xdata:可指定多達64KB的外部直接定址區,位址範圍0000H~0FFFFH pdata:能訪問1頁(25bBytes)的外部RAM,主要用於緊湊模式(Compact Model)。 4. Speciac Function Register Memory 8051提供128Bytes的SFR定址區,這區域可位元定址、位元組定址或字定址,用以控制計時器、計數器、串口、I/O及其它部件,可由以下幾種關鍵字說明: sfr:位元組定址 比如 sfr P0=0x80;為PO口位址為80H,“=”後H~FFH之間的常數。 sfr16:字定址,如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCD sbit:位定址,如sbit EA=0xAF;指定第0xAF位為EA,即中斷允許 還可以有如下定義方法: sbit 0V=PSW^2;(定義0V為PSW的第2位) sbit 0V=0XDO^2;(同上) 或bit 0V-=0xD2(同上)。 第三節 存儲模式 存儲模式決定了沒有明確指定存儲類型的變數,函數參數等的缺省存儲區域,共三種: 1. Small模式 所有缺省變數參數均裝入內部RAM,優點是訪問速度快,缺點是空間有限,只適用於小程式。 2. Compact模式 所有缺省變數均位於外部RAM區的一頁(256Bytes),具體哪一頁可由P2口指定,在STARTUP.A51文件中說明,也D1以下幾種關鍵字說明: sfr:位元組定址 比如 sfr P0=0x80;為PO口位址為80H,“=”後H~FFH之間的常數。 sfr16:字定址,如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCD sbit:位定址,如sbit EA=0xAF;指定第0xAF位為EA,即中斷允許 還可以有如下定義方法: sbit 0V=PSW^2;(定義0V為PSW的第2位) sbit 0V=0XDO^2;(同上) 或bit 0V-=0xD2(同上)。 第三節 存儲模式 存儲模式決定了沒有明確指定存儲類型的變數,函數參數等的缺省存儲區域,共三種: 1. Small模式 所有缺省變數參數均裝入內部RAM,優點是訪問速度快,缺點是空間有限,只適用於小程式。 2. Compact模式 所有缺省變數均位於外部RAM區的一頁(256Bytes),具體哪一頁可由P2口指定,在STARTUP.A51文件中說明,也可用pdata指定,優點是空間較Small為寬裕速度較Small慢,較large要快,是一種中間狀態。 3. large模式 所有缺省變數可放在多達64KB的外部RAM區,優點是空間大,可存變數多,缺點是速度較慢。 提示:存儲模式在C51編譯器選項中選擇。 第四節 存儲類型聲明 變數或參數的存儲類型可由存儲模式指定缺省類型,也可由關鍵字直接聲明指定。各類型分別用:code,data,idata,xdata,pdata說明,例: data uar1 char code array[ ]=“hello!”; unsigned char xdata arr[10][4][4]; 第五節 變數或資料類型 C51提供以下幾種擴展資料類型: bit 位元變數值為0或1 sbit 從位元組中定義的位元變數 0或1 sfr sfr位元組位址 0~255 sfr16 sfr字地址 0~65535 其餘資料類型如:char,enum%可用pdata指定,優點是空間較Small為寬裕速度較Small慢,較large要快,是一種中間狀態。 3. large模式 所有缺省變數可放在多達64KB的外部RAM區,優點是空間大,可存變數多,缺點是速度較慢。 提示:存儲模式在C51編譯器選項中選擇。 第四節 存儲類型聲明 變數或參數的存儲類型可由存儲模式指定缺省類型,也可由關鍵字直接聲明指定。各類型分別用:code,data,idata,xdata,pdata說明,例: data uar1 char code array[ ]=“hello!”; unsigned char xdata arr[10][4][4]; 第五節 變數或資料類型 C51提供以下幾種擴展資料類型: bit 位元變數值為0或1 sbit 從位元組中定義的位元變數 0或1 sfr sfr位元組位址 0~255 sfr16 sfr字地址 0~65535 其餘資料類型如:char,enum,short,int,long,float等與ANSI C相同。 第六節 位元變數與聲明 1. bit型變數 bit型變數可用變數類型,函數聲明、函數返回值等,存貯於內部RAM20H~2FH。 注意: (1) 用#pragma disable說明函數和用“usign”指定的函數,不能返回bit值。 (2) 一個bit變數不能聲明為指標,如bit *ptr;是錯誤的 (3) 不能有bit陣列如:bit arr[5];錯誤。 2. 可位定址區說明20H-2FH 可作如下定義: int bdata i; char bdata arr[3], 然後: sbit bito=in0;sbit bit15=I^15; sbit arr07=arr[0]^7;sbit arr15=arr[i]^7; 第七節 Keil C51指針 C51支援一般指針(Generic Pointer)和記憶體指針(Memory_Specific Pointer). 1. 一般指針 一般指標的聲明和使用均與標準C相同,不過同時還可以說明指標的存儲類型,例如: long * state;為?Cshort,int,long,float等與ANSI C相同。 第六節 位元變數與聲明 1. bit型變數 bit型變數可用變數類型,函數聲明、函數返回值等,存貯於內部RAM20H~2FH。 注意: (1) 用#pragma disable說明函數和用“usign”指定的函數,不能返回bit值。 (2) 一個bit變數不能聲明為指標,如bit *ptr;是錯誤的 (3) 不能有bit陣列如:bit arr[5];錯誤。 2. 可位定址區說明20H-2FH 可作如下定義: int bdata i; char bdata arr[3], 然後: sbit bito=in0;sbit bit15=I^15; sbit arr07=arr[0]^7;sbit arr15=arr[i]^7; 第七節 Keil C51指針 C51支援一般指針(Generic Pointer)和記憶體指針(Memory_Specific Pointer). 1. 一般指針 一般指標的聲明和使用均與標準C相同,不過同時還可以說明指標的存儲類型,例如: long * state;為一個指向long型整數的指標,而state本身則依存儲模式存放。 char * xdata ptr;ptr為一個指向char資料的指標,而ptr本身放于外部RAM區,以上的long,char等指標指向的資料可存放於任何記憶體中。 一般指標本身用3個位元組存放,分別為記憶體類型,高位偏移,低位元偏移量。 2. 記憶體指針 基於記憶體的指標說明時即指定了存貯類型,例如: char data * str;str指向data區中char型數據 int xdata * pow; pow指向外部RAM的int型整數。 這種指標存放時,只需一個位元組或2個位元組就夠了,因為只需存放偏移量。 3. 指針轉換 即指針在上兩種類型之間轉化: ●當基於記憶體的指標作為一個實參傳遞給需要一般指標的函數時,指標自動%C@個指向long型整數的指標,而state本身則依存儲模式存放。 char * xdata ptr;ptr為一個指向char資料的指標,而ptr本身放于外部RAM區,以上的long,char等指標指向的資料可存放於任何記憶體中。 一般指標本身用3個位元組存放,分別為記憶體類型,高位偏移,低位元偏移量。 2. 記憶體指針 基於記憶體的指標說明時即指定了存貯類型,例如: char data * str;str指向data區中char型數據 int xdata * pow; pow指向外部RAM的int型整數。 這種指標存放時,只需一個位元組或2個位元組就夠了,因為只需存放偏移量。 3. 指針轉換 即指針在上兩種類型之間轉化: ●當基於記憶體的指標作為一個實參傳遞給需要一般指標的函數時,指標自動轉化。 ●如果不說明外部函數原形,基於記憶體的指標自動轉化為一般指標,導致錯誤,因而請用“#include”說明所有函數原形。 ●可以強行改變指標類型。 第八節 Keil C51函數 C51函數聲明對ANSI C作了擴展,具體包括: 1. 中斷函數聲明: 中斷聲明方法如下: void serial_ISR () interrupt 4 [using 1] { /* ISR */ } 為提高代碼的容錯能力,在沒用到的中斷入口處生成iret語句,定義沒用到的中斷。 /* define not used interrupt, so generate "IRET" in their entrance */ void extern0_ISR() interrupt 0{} /* not used */ void timer0_ISR () interrupt 1{} /* not used */ void extern1_ISR() interrupt 2{} /* not used */ void timer1_ISR () interrupt 3{} /* not used */ void serial_ISR () interrupt 4{} /* not used */ 2. 通用存儲工作區 3. 選通用存儲工作區由using x聲斧鄐C ●如果不說明外部函數原形,基於記憶體的指標自動轉化為一般指標,導致錯誤,因而請用“#include”說明所有函數原形。 ●可以強行改變指標類型。 第八節 Keil C51函數 C51函數聲明對ANSI C作了擴展,具體包括: 1. 中斷函數聲明: 中斷聲明方法如下: void serial_ISR () interrupt 4 [using 1] { /* ISR */ } 為提高代碼的容錯能力,在沒用到的中斷入口處生成iret語句,定義沒用到的中斷。 /* define not used interrupt, so generate "IRET" in their entrance */ void extern0_ISR() interrupt 0{} /* not used */ void timer0_ISR () interrupt 1{} /* not used */ void extern1_ISR() interrupt 2{} /* not used */ void timer1_ISR () interrupt 3{} /* not used */ void serial_ISR () interrupt 4{} /* not used */ 2. 通用存儲工作區 3. 選通用存儲工作區由using x聲明,見上例。 4. 指定存儲模式 由small compact 及large說明,例如: void fun1(void) small { } 提示:small說明的函數內部變數全部使用內部RAM。關鍵的經常性的耗時的地方可以這樣聲明,以提高運行速度。 5. #pragma disable 在函數前聲明,只對一個函數有效。該函數調用過程中將不可被中斷。 6. 遞迴或可重入函數指定 在主程序和中斷中都可調用的函數,容易產生問題。因為51和PC不同,PC使用堆疊傳遞參數,且靜態變數以外的內部變數都在堆疊中;而51一般使用寄存器傳遞參數,內部變數一般在RAM中,函數重入時會破壞上次調用的資料。可以用以下兩種方法解決函數重入: a、在相應的函數前使用前述“#pragma disable”聲明,即只允許主程A,見上例。 4. 指定存儲模式 由small compact 及large說明,例如: void fun1(void) small { } 提示:small說明的函數內部變數全部使用內部RAM。關鍵的經常性的耗時的地方可以這樣聲明,以提高運行速度。 5. #pragma disable 在函數前聲明,只對一個函數有效。該函數調用過程中將不可被中斷。 6. 遞迴或可重入函數指定 在主程序和中斷中都可調用的函數,容易產生問題。因為51和PC不同,PC使用堆疊傳遞參數,且靜態變數以外的內部變數都在堆疊中;而51一般使用寄存器傳遞參數,內部變數一般在RAM中,函數重入時會破壞上次調用的資料。可以用以下兩種方法解決函數重入: a、在相應的函數前使用前述“#pragma disable”聲明,即只允許主程序或中斷之一調用該函數; b、將該函數說明為可重入的。如下: void func(param...) reentrant; KeilC51編譯後將生成一個可重入變數堆疊,然後就可以類比通過堆疊傳遞變數的方法。 由於一般可重入函數由主程序和中斷調用,所以通常中斷使用與主程序不同的R寄存器組。 另外,對可重入函數,在相應的函數前面加上開關“#pragma noaregs”,以禁止編譯器使用絕對寄存器定址,可生成不依賴於寄存器組的代碼。 7. 指定PL/M-51函數 由alien指定。 第四章 Keil C51高級編程 本章討論以下內容: ●絕對位址訪問 ●C與彙編的介面 ●C51套裝軟體中的通用檔 ●段名轉換與程式優化 第一節 絕對位址訪問 C51提供了三種釦峇刈_之一調用該函數; b、將該函數說明為可重入的。如下: void func(param...) reentrant; KeilC51編譯後將生成一個可重入變數堆疊,然後就可以類比通過堆疊傳遞變數的方法。 由於一般可重入函數由主程序和中斷調用,所以通常中斷使用與主程序不同的R寄存器組。 另外,對可重入函數,在相應的函數前面加上開關“#pragma noaregs”,以禁止編譯器使用絕對寄存器定址,可生成不依賴於寄存器組的代碼。 7. 指定PL/M-51函數 由alien指定。 第四章 Keil C51高級編程 本章討論以下內容: ●絕對位址訪問 ●C與彙編的介面 ●C51套裝軟體中的通用檔 ●段名轉換與程式優化 第一節 絕對位址訪問 C51提供了三種訪問絕對位址的方法: 1. 絕對宏: 在程式中,用“#include”即可使用其中定義的宏來訪問絕對位址,包括: CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 具體使用可看一看absacc.h便知 例如: rval=CBYTE[0x0002];指向程式記憶體的0002h位址 rval=XWORD [0x0002];指向外RAM的0004h地址 2. _at_關鍵字 直接在資料定義後加上_at_ const即可,但是注意: (1)絕對變數不能被初使化; (2)bit型函數及變數不能用_at_指定。 例如: idata struct link list _at_ 0x40;指定list結構從40h開始。 xdata char text[25b] _at_0xE000;指定text陣列從0E000H開始 提示:如果外部絕對變數是I/O埠等可自行變化資料,需要使用volatile關鍵字進行描述,請參考absacc.h。 3. 連接定位控制 此法是利用連接控制指令code xdata pdata \daX問絕對位址的方法: 1. 絕對宏: 在程式中,用“#include”即可使用其中定義的宏來訪問絕對位址,包括: CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 具體使用可看一看absacc.h便知 例如: rval=CBYTE[0x0002];指向程式記憶體的0002h位址 rval=XWORD [0x0002];指向外RAM的0004h地址 2. _at_關鍵字 直接在資料定義後加上_at_ const即可,但是注意: (1)絕對變數不能被初使化; (2)bit型函數及變數不能用_at_指定。 例如: idata struct link list _at_ 0x40;指定list結構從40h開始。 xdata char text[25b] _at_0xE000;指定text陣列從0E000H開始 提示:如果外部絕對變數是I/O埠等可自行變化資料,需要使用volatile關鍵字進行描述,請參考absacc.h。 3. 連接定位控制 此法是利用連接控制指令code xdata pdata \data bdata對“段”位址進行,如要指定某具體變數位址,則很有局限性,不作詳細討論。 第二節 Keil C51與彙編的介面 1. 模組內介面 方法是用#pragma語句具體結構是: #pragma asm 彙編行 #pragma endasm 這種方法實質是通過asm與ndasm告訴C51編譯器中間行不用編譯為彙編行,因而在編譯控制指令中有SRC以控制將這些不用編譯的行存入其中。 2. 模組間介面 C模組與彙編模組的介面較簡單,分別用C51與A51對原始檔案進行編譯,然後用L51將obj檔連接即可,關鍵問題在於C函數與彙編函數之間的參數傳遞問題,C51中有兩種參數傳遞方法。 (1) 通過寄存器傳遞函數參數 最多只能有3個參數通過寄存器傳遞,規律如下表: 參數數目CharIntlong,float 一般指%Bta bdata對“段”位址進行,如要指定某具體變數位址,則很有局限性,不作詳細討論。 第二節 Keil C51與彙編的介面 1. 模組內介面 方法是用#pragma語句具體結構是: #pragma asm 彙編行 #pragma endasm 這種方法實質是通過asm與ndasm告訴C51編譯器中間行不用編譯為彙編行,因而在編譯控制指令中有SRC以控制將這些不用編譯的行存入其中。 2. 模組間介面 C模組與彙編模組的介面較簡單,分別用C51與A51對原始檔案進行編譯,然後用L51將obj檔連接即可,關鍵問題在於C函數與彙編函數之間的參數傳遞問題,C51中有兩種參數傳遞方法。 (1) 通過寄存器傳遞函數參數 最多只能有3個參數通過寄存器傳遞,規律如下表: 參數數目CharIntlong,float 一般指標 1R7R6 & R7R4~R7R1~R3 2R5R4 & R5R4~R7R1~R3 3R3R2 & R3R1~R3 (2) 通過固定存儲區傳遞(fixed memory) 這種方法將bit型參數傳給一個存儲段中: ?function_name?BIT 將其他類型參數均傳給下麵的段:?function_name?BYTE,且按照預選順序存放。 至於這個固定存儲區本身在何處,則由存儲模式默認。 (3) 函數的返回值 函數返回值一律放於寄存器中,有如下規律: Return typeRegistev說明 Bit標誌位元由具體標誌位元返回 char/unsigned char 1_byte指針 R7單字節由R7返回 int/unsigned int 2_byte指標 R6 & R7雙位元組由R6和R7返回,MSB在R6 long&unsigned longR4~R7MSB在R4, LSB在R7 FloatR4~R732Bit IEEE格式 一般指標R1~R3存儲類型在R3 高位R2 低R1 (4) SRC控制 該控制指令將C檔編譯生成彙編檔(.SRC),該彙編文件%C? 1R7R6 & R7R4~R7R1~R3 2R5R4 & R5R4~R7R1~R3 3R3R2 & R3R1~R3 (2) 通過固定存儲區傳遞(fixed memory) 這種方法將bit型參數傳給一個存儲段中: ?function_name?BIT 將其他類型參數均傳給下麵的段:?function_name?BYTE,且按照預選順序存放。 至於這個固定存儲區本身在何處,則由存儲模式默認。 (3) 函數的返回值 函數返回值一律放於寄存器中,有如下規律: Return typeRegistev說明 Bit標誌位元由具體標誌位元返回 char/unsigned char 1_byte指針 R7單字節由R7返回 int/unsigned int 2_byte指標 R6 & R7雙位元組由R6和R7返回,MSB在R6 long&unsigned longR4~R7MSB在R4, LSB在R7 FloatR4~R732Bit IEEE格式 一般指標R1~R3存儲類型在R3 高位R2 低R1 (4) SRC控制 該控制指令將C檔編譯生成彙編檔(.SRC),該彙編文件可改名後,生成彙編.ASM檔,再用A51進行編譯。 第三節 Keil C51套裝軟體中的通用檔 在C51\LiB目錄下有幾個C原始檔案,這幾個C原始檔案有非常重要的作用,對它們稍事修改,就可以用在自己的專用系統中。 1. 動態記憶體分配 init_mem.C:此檔是初始化動態記憶體區的程式源代碼。它可以指定動態記憶體的位置及大小,只有使用了init_mem( )才可以調回其他函數,諸如malloc calloc,realloc等。 calloc.c:此檔是給陣列分配記憶體的源代碼,它可以指定單位資料類型及該單元數目。 malloc.c:此檔是malloc的源代碼,分配一段固定大小的記憶體。 realloc.c:此文件是realloc.c源代碼,其功能是調整當前分配動態記憶體的大小。 2. C51啟動檔STARTUP.A51 啟動檔STARTUP.A51中包含目標A5i改名後,生成彙編.ASM檔,再用A51進行編譯。 第三節 Keil C51套裝軟體中的通用檔 在C51\LiB目錄下有幾個C原始檔案,這幾個C原始檔案有非常重要的作用,對它們稍事修改,就可以用在自己的專用系統中。 1. 動態記憶體分配 init_mem.C:此檔是初始化動態記憶體區的程式源代碼。它可以指定動態記憶體的位置及大小,只有使用了init_mem( )才可以調回其他函數,諸如malloc calloc,realloc等。 calloc.c:此檔是給陣列分配記憶體的源代碼,它可以指定單位資料類型及該單元數目。 malloc.c:此檔是malloc的源代碼,分配一段固定大小的記憶體。 realloc.c:此文件是realloc.c源代碼,其功能是調整當前分配動態記憶體的大小。 2. C51啟動檔STARTUP.A51 啟動檔STARTUP.A51中包含目標板啟動代碼,可在每個project中加入這個檔,只要復位,則該檔立即執行,其功能包括: ●定義內部RAM大小、外部RAM大小、可重入堆疊位置 ●清除內部、外部或者以此頁為單元的外部記憶體 ●按存儲模式初使化重入堆疊及堆疊指標 ●初始化8051硬體堆疊指標 ●向main( )函數交權 開發人員可修改以下資料從而對系統初始化 常數名 意義 IDATALEN 待清內部RAM長度 XDATA START 指定待清外部RAM起始位址 XDATALEN 待清外部RAM長度 IBPSTACK 是否小模式重入堆疊指標需初始化標誌,1為需要。缺省為0 IBPSTACKTOP 指定小模式重入堆疊頂部位址 XBPSTACK 是否大模式重入堆疊指標需初始化標誌,缺省為0 XBPSTACKTOP 指定云O啟動代碼,可在每個project中加入這個檔,只要復位,則該檔立即執行,其功能包括: ●定義內部RAM大小、外部RAM大小、可重入堆疊位置 ●清除內部、外部或者以此頁為單元的外部記憶體 ●按存儲模式初使化重入堆疊及堆疊指標 ●初始化8051硬體堆疊指標 ●向main( )函數交權 開發人員可修改以下資料從而對系統初始化 常數名 意義 IDATALEN 待清內部RAM長度 XDATA START 指定待清外部RAM起始位址 XDATALEN 待清外部RAM長度 IBPSTACK 是否小模式重入堆疊指標需初始化標誌,1為需要。缺省為0 IBPSTACKTOP 指定小模式重入堆疊頂部位址 XBPSTACK 是否大模式重入堆疊指標需初始化標誌,缺省為0 XBPSTACKTOP 指定大模式重入堆疊頂部位址 PBPSTACK 是否Compact重入堆疊指標,需初始化標誌,缺省為0 PBPSTACKTOP 指定Compact模式重入堆疊頂部位址 PPAGEENABLE P2初始化允許開關 PPAGE 指定P2值 PDATASTART 待清外部RAM頁首址 PDATALEN 待清外部RAM頁長度 提示:如果要初始化P2作為緊湊模式高端位址,必須:PPAGEENAGLE=1,PPAGE為P2值,例如指定某頁1000H-10FFH,則PPAGE=10H,而且連接時必須如下: L51 PDATA(1080H),其中1080H是1000H-10FFH中的任一個值。 以下是STARTUP.A51代碼片斷,紅色是經常可能需要修改的地方: ;------------------------------------------------------------------------------ ; This file is part of the C51 Compiler package ; Copyright KEIL ELEKTRONIK GmbH 1990 ;------------------------------------------------------------------------------ ; STARTUP.A51: This code is executed after processor reset. ; ; To translate this fj模式重入堆疊頂部位址 PBPSTACK 是否Compact重入堆疊指標,需初始化標誌,缺省為0 PBPSTACKTOP 指定Compact模式重入堆疊頂部位址 PPAGEENABLE P2初始化允許開關 PPAGE 指定P2值 PDATASTART 待清外部RAM頁首址 PDATALEN 待清外部RAM頁長度 提示:如果要初始化P2作為緊湊模式高端位址,必須:PPAGEENAGLE=1,PPAGE為P2值,例如指定某頁1000H-10FFH,則PPAGE=10H,而且連接時必須如下: L51 PDATA(1080H),其中1080H是1000H-10FFH中的任一個值。 以下是STARTUP.A51代碼片斷,紅色是經常可能需要修改的地方: ;------------------------------------------------------------------------------ ; This file is part of the C51 Compiler package ; Copyright KEIL ELEKTRONIK GmbH 1990 ;------------------------------------------------------------------------------ ; STARTUP.A51: This code is executed after processor reset. ; ; To translate this file use A51 with the following invocation: ; ; A51 STARTUP.A51 ; ; To link the modified STARTUP.OBJ file to your application use the following ; L51 invocation: ; ; L51 , STARTUP.OBJ ; ;------------------------------------------------------------------------------ ; ; User-defined Power-On Initialization of Memory ; ; With the following EQU statements the initialization of memory ; at processor reset can be defined: ; ; the absolute start-address of IDATA memory is always 0 IDATALEN EQU 80H the length of IDATA memory in bytes. ; XDATASTART EQU 0H the absolute start-address of XDATA memory XDATALEN EQU 0H the length of XDATA memory in bytes. ; PDATASTART EQU 0H the absolute start-address of PDATA memory PDATALEN EQU 0H the length of PDATA memory in bytes. ; ; Notes: The IDATA space overlaps physically the DATA and BIT areas of the ; 8051 CPU. At minimum the memory space occupied from the C51 ; run-time routines must be set to zero. ;------------------------------------------------------------------------------ ; ; Reentrant Stack Initilization ; %ile use A51 with the following invocation: ; ; A51 STARTUP.A51 ; ; To link the modified STARTUP.OBJ file to your application use the following ; L51 invocation: ; ; L51 , STARTUP.OBJ ; ;------------------------------------------------------------------------------ ; ; User-defined Power-On Initialization of Memory ; ; With the following EQU statements the initialization of memory ; at processor reset can be defined: ; ; the absolute start-address of IDATA memory is always 0 IDATALEN EQU 80H the length of IDATA memory in bytes. ; XDATASTART EQU 0H the absolute start-address of XDATA memory XDATALEN EQU 0H the length of XDATA memory in bytes. ; PDATASTART EQU 0H the absolute start-address of PDATA memory PDATALEN EQU 0H the length of PDATA memory in bytes. ; ; Notes: The IDATA space overlaps physically the DATA and BIT areas of the ; 8051 CPU. At minimum the memory space occupied from the C51 ; run-time routines must be set to zero. ;------------------------------------------------------------------------------ ; ; Reentrant Stack Initilization ; ; The following EQU statements define the stack pointer for reentrant ; functions and initialized it: ; ; Stack Space for reentrant functions in the SMALL model. IBPSTACK EQU 0 set to 1 if small reentrant is used. IBPSTACKTOP EQU 0FFH+1 set top of stack to highest location+1. ; ; Stack Space for reentrant functions in the LARGE model. XBPSTACK EQU 0 set to 1 if large reentrant is used. XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. ; ; Stack Space for reentrant functions in the COMPACT model. PBPSTACK EQU 0 set to 1 if compact reentrant is used. PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. ; ;------------------------------------------------------------------------------ ; ; Page Definition for Using the Compact Model with 64 KByte xdata RAM ; ; The following EQU statements define the xdata page used for pdata ; variables. The EQU PPAGE must conform with the PPAGE control used ; in the linker invocation. ; PPAGEENABLE EQU 0 set to 1 if pdata object are used. PPAGE EQU 0 define PPAGE number. ; ;--------------------------------------------------0D ; The following EQU statements define the stack pointer for reentrant ; functions and initialized it: ; ; Stack Space for reentrant functions in the SMALL model. IBPSTACK EQU 0 set to 1 if small reentrant is used. IBPSTACKTOP EQU 0FFH+1 set top of stack to highest location+1. ; ; Stack Space for reentrant functions in the LARGE model. XBPSTACK EQU 0 set to 1 if large reentrant is used. XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. ; ; Stack Space for reentrant functions in the COMPACT model. PBPSTACK EQU 0 set to 1 if compact reentrant is used. PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1. ; ;------------------------------------------------------------------------------ ; ; Page Definition for Using the Compact Model with 64 KByte xdata RAM ; ; The following EQU statements define the xdata page used for pdata ; variables. The EQU PPAGE must conform with the PPAGE control used ; in the linker invocation. ; PPAGEENABLE EQU 0 set to 1 if pdata object are used. PPAGE EQU 0 define PPAGE number. ; ;------------------------------------------------------------------------------ 3. 標準輸入輸出檔 putchar.c putchar.c是一個低級字元輸出子程,開發人員可修改後應用到自己的硬體系統上,例如向CLD或LEN輸出字元。 缺省:putchar.c是向串口輸出一個字元XON|XOFF是流控標誌,換行符“\*n”自動轉化為回車/換行“\r\n”。 getkey.c getkey函數是一個低級字元輸入子程,該程式可用到自己硬體系統,如矩陣鍵盤輸入中,缺省時通過串口輸入字元。 4. 其他文件 還包括對Watch-Dog有獨特功能的INIT.A51函數以及對8×C751適用的函數,可參考源代碼。 第四節 段名協定與程式優化 1. 段名協定(Segment Naming Conventions) C51編譯器生成的目標檔存放于許多段中,這些段是代碼空間或資料空間的一些單元,一個段可以是可重定位的,也可以是%---------------------------- 3. 標準輸入輸出檔 putchar.c putchar.c是一個低級字元輸出子程,開發人員可修改後應用到自己的硬體系統上,例如向CLD或LEN輸出字元。 缺省:putchar.c是向串口輸出一個字元XON|XOFF是流控標誌,換行符“\*n”自動轉化為回車/換行“\r\n”。 getkey.c getkey函數是一個低級字元輸入子程,該程式可用到自己硬體系統,如矩陣鍵盤輸入中,缺省時通過串口輸入字元。 4. 其他文件 還包括對Watch-Dog有獨特功能的INIT.A51函數以及對8×C751適用的函數,可參考源代碼。 第四節 段名協定與程式優化 1. 段名協定(Segment Naming Conventions) C51編譯器生成的目標檔存放于許多段中,這些段是代碼空間或資料空間的一些單元,一個段可以是可重定位的,也可以是絕對段,每一個可重定位的段都有一個類型和名字,C51段名有以下規定: 每個段名包括首碼與模組名兩部分,首碼表示存儲類型,模組名則是被編譯的模組的名字,例如: ?CO?main1 :表示main1模組中的代碼段中的常數部分 ?PR?function1?module 表module模組中函數function1的可執行段,具體規定參閱手冊。 2. 程式優化 C51編譯器是一個具有優化功能的編譯器,它共提供六級優化功能。確保生成目標代碼的最高效率(代碼最少,運行速度最快)。具體六級優化的內容可參考幫助。 在C51中提供以下編譯控制指令控制代碼優化: OPTIMIZE(SJXE):儘量採用副程式,使程式碼減少。 NOAREGS:不使用絕對寄存器訪問,程式碼與寄存器段獨立。 NOREGPARMS:參數傳絕對段,每一個可重定位的段都有一個類型和名字,C51段名有以下規定: 每個段名包括首碼與模組名兩部分,首碼表示存儲類型,模組名則是被編譯的模組的名字,例如: ?CO?main1 :表示main1模組中的代碼段中的常數部分 ?PR?function1?module 表module模組中函數function1的可執行段,具體規定參閱手冊。 2. 程式優化 C51編譯器是一個具有優化功能的編譯器,它共提供六級優化功能。確保生成目標代碼的最高效率(代碼最少,運行速度最快)。具體六級優化的內容可參考幫助。 在C51中提供以下編譯控制指令控制代碼優化: OPTIMIZE(SJXE):儘量採用副程式,使程式碼減少。 NOAREGS:不使用絕對寄存器訪問,程式碼與寄存器段獨立。 NOREGPARMS:參數傳遞總是在局部資料段實現,程式碼與低版本C51相容。 OPTIMIZE(SIZE)AK OPTIMIZE(speed)提供6級優化功能,缺省為: OPTIMIZE(6,SPEED)。 第五章 Keil C51庫函數參考 C51強大功能及其高效率的重要體現之一在於其豐富的可直接調用的庫函數,多使用庫函數使程式碼簡單,結構清晰,易於調試和維護,下面介紹C51的庫函數系統。 第一節 本征庫函數(intrinsic routines)和非本征證庫函數 C51提供的本征函數是指編譯時直接將固定的代碼插入當前行,而不是用ACALL和LCALL語句來實現,這樣就大大提供了函數訪問的效率,而非本征函數則必須由ACALL及LCALL調用。 C51的本征庫函數只有9個,數目雖少,但都非常有用,列如下: _crol_,_cror_:將char型變數迴圈向左(右)移動指BB撙`是在局部資料段實現,程式碼與低版本C51相容。 OPTIMIZE(SIZE)AK OPTIMIZE(speed)提供6級優化功能,缺省為: OPTIMIZE(6,SPEED)。 第五章 Keil C51庫函數參考 C51強大功能及其高效率的重要體現之一在於其豐富的可直接調用的庫函數,多使用庫函數使程式碼簡單,結構清晰,易於調試和維護,下面介紹C51的庫函數系統。 第一節 本征庫函數(intrinsic routines)和非本征證庫函數 C51提供的本征函數是指編譯時直接將固定的代碼插入當前行,而不是用ACALL和LCALL語句來實現,這樣就大大提供了函數訪問的效率,而非本征函數則必須由ACALL及LCALL調用。 C51的本征庫函數只有9個,數目雖少,但都非常有用,列如下: _crol_,_cror_:將char型變數迴圈向左(右)移動指定位數後返回 _iror_,_irol_:將int型變數迴圈向左(右)移動指定位數後返回 _lrol_,_lror_:將long型變數迴圈向左(右)移動指定位數後返回 _nop_: 相當於插入NOP _testbit_: 相當於JBC bitvar測試該位元變數並跳轉同時清除。 _chkfloat_: 測試並返回源點數狀態。 使用時,必須包含#inclucle 一行。 如不說明,下面談到的庫函數均指非本征庫函數。 第二節 幾類重要庫函數 1. 專用寄存器include檔 例如8031、8051均為REG51.h其中包括了所有8051的SFR及其位元定義,一般系統都必須包括本檔。 2. 絕對位址include文件absacc.h 該檔中實際只定義了幾個巨集,以確定各存儲空間的絕對位址。 3. 動態記憶體分配函數,位於stdlib.h中 4. 緩衝區處理函數位於“strin定位數後返回 _iror_,_irol_:將int型變數迴圈向左(右)移動指定位數後返回 _lrol_,_lror_:將long型變數迴圈向左(右)移動指定位數後返回 _nop_: 相當於插入NOP _testbit_: 相當於JBC bitvar測試該位元變數並跳轉同時清除。 _chkfloat_: 測試並返回源點數狀態。 使用時,必須包含#inclucle 一行。 如不說明,下面談到的庫函數均指非本征庫函數。 第二節 幾類重要庫函數 1. 專用寄存器include檔 例如8031、8051均為REG51.h其中包括了所有8051的SFR及其位元定義,一般系統都必須包括本檔。 2. 絕對位址include文件absacc.h 該檔中實際只定義了幾個巨集,以確定各存儲空間的絕對位址。 3. 動態記憶體分配函數,位於stdlib.h中 4. 緩衝區處理函數位於“string.h”中 其中包括拷貝比較移動等函數如: memccpy memchr memcmp memcpy memmove memset 這樣很方便地對緩衝區進行處理。 5. 輸入輸出流函數,位於“stdio.h”中 流函數通8051的串口或用戶定義的I/O口讀寫資料,缺省為8051串口,如要修改,比如改為LCD顯示,可修改lib目錄中的getkey.c及putchar.c原始檔案,然後在庫中替換它們即可。 第三節 Keil C51庫函數原型列表 1. CTYPE.H bit isalnum(char c); bit isalpha(char c); bit iscntrl(char c); bit isdigit(char c); bit isgraph(char c); bit islower(char c); bit isprint(char c); bit ispunct(char c); bit isspace(char c); bit isupper(char c); bit isxdigit(char c); bit toascii(char c); bit toint(char c); char tolower(char c); char __tolower(char c); char toupper(char c); char __toupper(char c)︹.h”中 其中包括拷貝比較移動等函數如: memccpy memchr |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站地图 | 名站导航 | 管理登录 | |
| 本站资源部分来自互联网,如侵犯您的权利,我们将予以删除 鲁ICP备08006092号 |
| 中国IEEE 中国电气电子工程师网 版权所有 |