【正文】
I/O及其它部件,可由以下幾種關(guān)鍵字說明:sfr:字節(jié)尋址 比如 sfr P0=0x80。指定第0xAF位為EA,即中斷允許還可以有如下定義方法:sbit 0V=PSW^2;(定義0V為PSW的第2位)sbit 0V=0XDO^2;(同上)或bit 0V=0xD2(同上)。提示:存儲(chǔ)模式在C51編譯器選項(xiàng)中選擇。6. 第六節(jié) 位變量與聲明1. 1. bit型變量bit型變量可用變量類型,函數(shù)聲明、函數(shù)返回值等,存貯于內(nèi)部RAM20H~2FH。為一個(gè)指向long型整數(shù)的指針,而state本身則依存儲(chǔ)模式存放。str指向data區(qū)中char型數(shù)據(jù)int xdata * pow。l 如果不說明外部函數(shù)原形,基于存儲(chǔ)器的指針自動(dòng)轉(zhuǎn)化為一般指針,導(dǎo)致錯(cuò)誤,因而請用“#include”說明所有函數(shù)原形。4. 4. 指定存儲(chǔ)模式由small pact 及l(fā)arge說明,例如:void fun1(void) small { }提示:small說明的函數(shù)內(nèi)部變量全部使用內(nèi)部RAM。6. 6. 遞歸或可重入函數(shù)指定在主程序和中斷中都可調(diào)用的函數(shù),容易產(chǎn)生問題。KeilC51編譯后將生成一個(gè)可重入變量堆棧,然后就可以模擬通過堆棧傳遞變量的方法。4. 第四章 Keil C51高級(jí)編程本章討論以下內(nèi)容:l 絕對地址訪問l C與匯編的接口l C51軟件包中的通用文件l 段名轉(zhuǎn)換與程序優(yōu)化1. 第一節(jié) 絕對地址訪問C51提供了三種訪問絕對地址的方法:1. 1. 絕對宏:在程序中,用“#include”即可使用其中定義的宏來訪問絕對地址,包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD例如:rval=CBYTE[0x0002]。指定list結(jié)構(gòu)從40h開始。2. 2. 模塊間接口C模塊與匯編模塊的接口較簡單,分別用C51與A51對源文件進(jìn)行編譯,然后用L51將obj文件連接即可,關(guān)鍵問題在于C函數(shù)與匯編函數(shù)之間的參數(shù)傳遞問題,C51中有兩種參數(shù)傳遞方法。 R3 R4~R7R4~R7 R1~R3R1~R3R1~R3(2) 通過固定存儲(chǔ)區(qū)傳遞(fixed memory)這種方法將bit型參數(shù)傳給一個(gè)存儲(chǔ)段中: ?function_name?BIT將其它類型參數(shù)均傳給下面的段:?function_name?BYTE,且按照預(yù)選順序存放。unsigned long R4~R7 MSB在R4, LSB在R7float R4~R7 32Bit IEEE格式一般指針 R1~R3 存儲(chǔ)類型在R3 高位R2 低R1(4) SRC控制該控制指令將C文件編譯生成匯編文件(.SRC),該匯編文件可改名后,再用A51進(jìn)行編譯。:此文件是給數(shù)組分配內(nèi)存的源代碼,它可以指定單位數(shù)據(jù)類型及該單元數(shù)目。缺省為0IBPSTACKTOP 指定小模式重入堆棧頂部地址XBPSTACK 是否大模式重入堆棧指針需初始化標(biāo)志,缺省為0XBPSTACKTOP 指定大模式重入堆棧頂部地址PBPSTACK 是否Compact重入堆棧指針,需初始化標(biāo)志,缺省為0PBPSTACKTOP 指定Compact模式重入堆棧頂部地址PPAGEENABLE P2初始化允許開關(guān)PPAGE 指定P2值PDATASTART 待清外部RAM頁首址PDATALEN 待清外部RAM頁長度提示:如果要初始化P2作為緊湊模式高端地址,必須:PPAGEENAGLE=1,PPAGE為P2值,例如指定某頁1000H-10FFH,則PPAGE=10H,而且連接時(shí)必須如下:L51input modules PDATA(1080H),其中1080H是1000H-10FFH中的任一個(gè)值。 Copyright KEIL ELEKTRONIK GmbH 1990。 To translate this file use A51 with the following invocation:。 To link the modified file to your application use the following?! ?the absolute startaddress of XDATA memoryXDATALEN EQU 0H 。 the length of PDATA memory in bytes.。 runtime routines must be set to zero.。 Stack Space for reentrant functions in the SMALL model.IBPSTACK EQU 0 。 Stack Space for reentrant functions in the LARGE model. XBPSTACK EQU 0 。 Stack Space for reentrant functions in the COMPACT model. PBPSTACK EQU 0 。 The following EQU statements define the xdata page used for pdata。 set to 1 if pdata object are used.PPAGE EQU 0 。缺?。簗XOFF是流控標(biāo)志,換行符“\*n”自動(dòng)轉(zhuǎn)化為回車/換行“\r\n”。2. 2. 程序優(yōu)化C51編譯器是一個(gè)具有優(yōu)化功能的編譯器,它共提供六級(jí)優(yōu)化功能。NOAREGS:不使用絕對寄存器訪問,程序代碼與寄存器段獨(dú)立。1. 第一節(jié) 本征庫函數(shù)(intrinsic routines)和非本征證庫函數(shù)C51提供的本征函數(shù)是指編譯時(shí)直接將固定的代碼插入當(dāng)前行,而不是用ACALL和LCALL語句來實(shí)現(xiàn),這樣就大大提供了函數(shù)訪問的效率,而非本征函數(shù)則必須由ACALL及LCALL調(diào)用。如不說明,下面談到的庫函數(shù)均指非本征庫函數(shù)Keil5. 5. 輸入輸出流函數(shù),位于“”中流函數(shù)通8051的串口或用戶定義的I/O口讀寫數(shù)據(jù),缺省為8051串口,如要修改,比如改為LCD顯示,然后在庫中替換它們即可。int scanf(const char * fmtstr.[,argument]…);int sprintf(char * buffer,const char *fmtstr[。void vsprintf(char *buffer,const char * fmtstr,char * argptr);4. 4. float atof(void * string)。void free(void xdata *p);void init_mempool(void *data *p,unsigned int size)。void srand (int seed);5. 5. void *memccpy (void *dest,void *src,char c,int len)。void *memmove (void *dest,void *src,int len)。char strcmp (char *string1,char *string2)。char *strncat (char 8dest,char *src,int len)。int strpos (const char *string,char c)。int strspn(char *string,char *set);6. 第六章 Keil C51例子:Hello位于\C51\excmples\Hello\目錄,其功能是向串口輸出“Hello,world”整個(gè)程序如下:#pragma DB OE CDindule includevoid main(void){ SCOn=0x50?!rintf(“Hello,world \n”)。這時(shí)該project已是打開狀態(tài),或用open project打開已存在的project。(7) project選Build project,看是否有語法錯(cuò)誤,若無則生成HEX文件,若有則修改源文件后重復(fù)以上部分步驟。(2) 用cd改換project目錄至h。2. 第二節(jié) Ishell for Dos使用步驟(1) 進(jìn)入Ishell 用Setup editer選擇編輯器。(5) option_dscope Debugger選中hello\:“l(fā)oad…\…\BIN\map 0, 0xffff”否則修改。(2) file_save或工具欄將文件存盤?!ri=1。char *strrpbrk (char *string,char *set)。char strncpy (char *dest,char *src,int len)。int strcspn(char *src,char * set)。char *strcat (char *dest,char *src)。char memcmp(void *buf1,void *buf2,int len)。int rand(void)。long atol(void * string)。char ungetchar(char c)。char putchar(char c)。2. 2. 該文件中實(shí)際只定義了幾個(gè)宏,以確定各存儲(chǔ)空間的絕對地址。_chkfloat_: 測試并返回源點(diǎn)數(shù)狀態(tài)。OPTIMIZE(SIZE)AK OPTIMIZE(speed)提供6級(jí)優(yōu)化功能,缺省為: OPTIMIZE(6,SPEED)。具體六級(jí)優(yōu)化的內(nèi)容可參考幫助。4. 4. 其它文件C751適用的函數(shù),可參考源代碼。 in the linker invocation.。 Page Definition for Using the Compact Model with 64 KByte xdata RAM。 set top of stack to highest location+1.。 set top of stack to highest location+1.。 set top of stack to highest location+1.。 functions and initialized it:。 Notes: The IDATA space overlaps physically the DATA and BIT areas of the。PDATASTART EQU 0H 。 the length of IDATA memory in bytes.。 at processor reset can be defined:。 A51 。 : This code is executed after processor reset.。:,其功能是調(diào)整當(dāng)前分配動(dòng)態(tài)內(nèi)存的大小。1. 1. 動(dòng)態(tài)內(nèi)存分配:此文件是初始化動(dòng)態(tài)內(nèi)存區(qū)的程序源代碼。(3) 函數(shù)的返回值函數(shù)返回值一律放于寄存器中,有如下規(guī)律:return type Registev 說明bit 標(biāo)志位 由具體標(biāo)志位返回char/unsigned char 1_byte指針 R7 單字節(jié)由R7返回int/unsigned int 2_byte指針 R6 amp。 R7R4 amp。3. 3. 連接定位控制此法是利用連接控制指令code xdata pdata \data bdata對“段”地址進(jìn)行,如要指定某具體變量地址,則很有局限性,不作詳細(xì)討論。指向外RAM的0004h地址2. 2. _at_關(guān)鍵字直接在數(shù)據(jù)定義后加上_at_ const即可,但是注意:(1)絕對變量不能被初使化;(2)bit型函數(shù)及變量不能用_at_指定。另外,對可重入函數(shù),在相應(yīng)的函數(shù)前面加上開關(guān)“pragma noaregs”,以禁止編譯器使用絕對寄存器尋址,可生成不依賴于寄存器組的代碼??梢杂靡韵聝煞N方法解決函數(shù)重入:a、在相應(yīng)的函數(shù)前使用前述“pragma disable”聲明,即只允許主程序或中斷之一調(diào)用該函數(shù);b、將該函數(shù)說明為可重入的。5. 5. pragma disable在函數(shù)前聲明,只對一個(gè)函數(shù)有效。8. 第八節(jié) Keil C51函數(shù)C51函數(shù)聲明對ANSI C作了擴(kuò)展,具體包括:1. 1. 中斷函數(shù)聲明:中斷聲明方法如下:void serial_ISR () interrupt 4 [using 1]{/* ISR */}為提高代碼的容錯(cuò)能力,在沒用到的中斷入口處生成iret語句,定義沒用到的中斷。這種指針存放時(shí),只需一個(gè)字節(jié)或2個(gè)字節(jié)就夠了,因?yàn)橹恍璐娣牌屏?。一般指針本身?個(gè)字節(jié)存放,分別為存儲(chǔ)器類型,高位偏移,低位偏移量。(2) 一個(gè)bit變量不能聲明為指針,如bit *ptr;是錯(cuò)誤的(3) 不能有bit數(shù)組如:bit arr[5];錯(cuò)誤。各類型分別用:code,data,idata,xdata,pdata說明,例:data uar1char code array[ ]=“hello!”。2. 2. Compact模式所有缺省變量均位于外部RAM區(qū)的一頁(256Bytes),具體哪一頁可由P2口指定,也可用pdata指定,優(yōu)點(diǎn)是空間較