轉自:http://www.dwenzhao.cn/profession/mcu/mcu51clib.html
Keil C51有豐富的可直接調用的庫函數,靈活使用庫函數可使程序代碼簡單、結構清晰,並且易於調試和維護。每個庫函數都在相應的頭文件中給出了函數原型聲明,用戶如果需要使用庫函數,必須在源程序的開始處用預處理命令“#include”將有關的頭文件包含進來。
1. 本征庫函數:
本征庫函數是指編譯時直接將固定的代碼插入到當前行,而不是用匯編語言中的“ACALL”和“LCALL”指令來實現調用,從而大大提高了函數的訪問效率。Keil C51的本征庫函數有9個,數量少但非常有用。使用本征庫函數時,C51源程序中必須包含預處理命令“#include <intrins.h>”。
| 函數名及定義 |
功能說明 |
| unsigned char _crol_(unsigned char val,unsigned char n) |
將字符型數據val循環左移n位,相當於RL命令 |
| unsigned int _irol_(unsigned int val,unsigned char n) |
將整型數據val循環左移n位,相當於RL命令 |
| unsigned long _lrol_(unsigned long val,unsigned char n) |
將長整型數據val循環左移n位,相當於RL命令 |
| unsigned char _cror_(unsigned char val,unsigned char n) |
將字符型數據val循環右移n位,相當於RR命令 |
| unsigned int _iror_(unsigned int val,unsigned char n) |
將整型數據val循環右移n位,相當於RR命令 |
| unsigned long _lror_(unsigned long val,unsigned char n) |
將長整型數據val循環右移n位,相當於RR命令 |
| bit _testbit_(bit x) |
相當於JBC bit指令 |
| unsigned char _chkfloat_(float ual) |
測試並返回浮點數狀態 |
| void _nop_(void) |
產生一個NOP指令 |
2. 字符判斷轉換庫函數:
字符判斷轉換庫函數的原型聲明在頭文件CTYPE.H中定義。
| 函數名及定義 |
功能說明 |
| bit isalpha(char c) |
檢查參數字符是否為英文字母,是則返回1,否則返回0 |
| bit isalnum(char c) |
檢查參數字符是否為英文字母或數字字符,是則返回1,否則返回0 |
| bit iscntrl(char c) |
檢查參數字符是否為控制字符(值在0x00~0x1f之間或等於0x7f)是則返回1,否則返回0 |
| bit isdigit(char c) |
檢查參數字符是否為十進制數字0~9,是則返回1,否則返回0 |
| bit isgraph(char c) |
檢查參數字符是否為可打印字符(不包括空格),值域0x21~0x7e,是則返回1,否則返回0 |
| bit isprint(char c) |
檢查參數字符是否為可打印字符(包括空格),值域0x21~0x7e,是則返回1,否則返回0 |
| bit ispunct(char c) |
檢查參數字符是否為標點、空格或格式字符,是則返回1,否則返回0 |
| bit islower(char c) |
檢查參數字符是否為小寫英文字母,是則返回1,否則返回0 |
| bit isupper(char c) |
檢查參數字符是否為大寫英文字母,是則返回1,否則返回0 |
| bit isspace(char c) |
檢查參數字符是否為空格、制表符、回車、換行、垂直制表符和送紙(值為0x09~0x0d,或為0x20),是則返回1,否則返回0 |
| bit isxdigit(char c) |
檢查參數字符是否為十六進制數字字符,是則返回1,否則返回0 |
| char toint(char c) |
將ASCII字符的0~9、a~f(大小寫無關)轉換為十六進制數字 |
| char tolower(char c) |
將大寫字符轉換成小寫形式,如果字符參數不在A~Z之間,則該函數不起作用 |
| char _tolower(char c) |
將字符參數c與常數0x20逐位相或,從而將大寫字符轉換成小寫字符 |
| char toupper(char c) |
將小寫字符轉換成大寫形式,如果字符參數不在a~z之間,則該函數不起作用 |
| char _toupper(char c) |
將字符參數c與常數0xdf逐位相與,從而將小寫字符轉換成大寫字符 |
| char toascii(char c) |
將任何字符參數值縮小到有效的ASCII范圍內,即將c與0x7f相與,去掉第7位以上的位 |
3. 輸入輸出庫函數:
輸入輸出庫函數的原型聲明在頭文件STDIO.H中定義,通過8051的串行口工作。如果希望支持其他I/O接口,只需要改動_getkey()和putchar()函數。庫中所有其他的I/O支持函數都依賴於這兩個函數模塊。在使用8051系列單片機的串行口之前,應先對其進行初始化。例如,以2400波特率(12MHz時鍾頻率)初始化串行口的語句如下:
SCON=0x52; //SCON置初值
TMOD=0x20; //TMOD置初值
TH1=0xF3; //T1置初值
TR1=1; //啟動T1
| 函數名及定義 |
功能說明 |
| char _getkey(void) |
等待從8051串口讀入一個字符並返回讀入的字符,這個函數是改變整個輸入端口機制時應做修改的唯一一個函數 |
| char getchar(void) |
使用_getkey從串口讀入字符,並將讀入的字符馬上傳給putchar函數輸出,其他與_getkey函數相同 |
| char *gets(char *s,int n) |
該函數通過getchar從串口讀入一個長度為n的字符串並存入由s指向的數組。輸入時一旦檢測到換行符就結束字符輸入。輸入成功時返回傳入的參數指針,失敗時返回NULL |
| char ungetchar(char c) |
將輸入字符回送到輸入緩沖區,因此下次gets或getchar可用該字符。成功時返回char型值,失敗時返回EOF,不能處理多個字符 |
| char putchar(char c) |
通過8051串行口輸出字符,與函數_getkey一樣,這是改變整個輸出機制所需要修改的唯一一個函數 |
| int printf(const char *fmstr[,argument]...) |
以第一個參數指向字符串制定的格式通過8051串行口輸出數值和字符串,返回值為實際輸出的字符數 |
| int sprintf(char *s,const char *fmstr[,argument]...) |
與printf功能相似,但數據是通過一個指針s送入內存緩沖區,並以ASCII碼的形式存儲 |
| int puts(const char *s) |
利用putchar函數將字符串和換行符寫入串行口,錯誤時返回EOF,否則返回0 |
| int scanf(const char *fmstr[,argument]...) |
在格式控制串的控制下,利用getchar函數從串行口讀入數據,每遇到一個符合格式控制串fmstr規定的值,就將它按順序存入由參數指針argument指向的存儲單元。其中每個參數都是指針,函數返回所發現並轉換的輸入項數,錯誤則返回EOF |
| int sscanf(char *s,const char *fmstr[,argument]...) |
與scanf的輸入方式相似,但字符串的輸入不是通過串行口,而是通過指針s指向的數據緩沖區 |
| void vprintf(const char *s,char *fmstr,char *argptr) |
將格式化字符串和數據值輸出到由指針s指向的內存緩沖區內。類似於sprintf,但接受一個指向變量表的指針,而不是變量表。返回值為實際寫入到輸出字符串中的字符數 |
4. 字符串處理庫函數:
字符串處理庫函數的原型聲明包含在頭文件STRING.H中,字符串函數通常接收指針串作為輸入值。一個字符串包括兩個或多個字符,字符串的結尾以空字符表示。在函數memcmp、memcpy、memchr、memccpy、memset和memmove中,字符串的長度由調用者明確規定,這些函數可工作在任何模式。
| 函數名及定義 |
功能說明 |
| void *memchr(void *s1, char val, int len) |
順序搜索字符串s1的前len個字符,以找出字符val,成功時返回s1中指向val的指針,失敗時返回NULL |
| char memcmp(void *s1, void *s2, int len) |
逐個字符比較串s1和s2的前len個字符,成功時返回0,如果串s1大於或小於s2,則相應地返回一個正數或一個負數 |
| void *memcpy(void *dest, void *src , int len) |
從src所指向的內存中復制len個字符到dest中,返回指向dest中最后一個字符的指針。如果src與dest發生交迭,則結果是不可測的 |
| void *memccpy(void *dest, void *src, char val, int len) |
復制src中len個元素到dest中。如果實際復制了len個字符則返回NULL。復制過程在復制完字符val后停止,此時返回指向dest中下一個元素的指針 |
| void *memmove(void *dest, void *src, int len) |
它的工作方式於memcpy相同,但復制的區域可以交迭 |
| void memset(void *s, char val, int len) |
用val來填充指針s中的len個單元 |
| void *strcat(char *s1, char *s2) |
將串s2復制到s1的尾部。strcat假定s1所定義的地址區域足以接受兩個串。返回指向s1中的第一個字符的指針 |
| char *strncat( char *s1, char *s2, int n) |
復制串s2中n個字符到s1的尾部,如果s2比n短,則只復制s2(包括串結束符) |
| char strcmp(char *s1, char *s2) |
比較串s1和s2,如果相等則返回0;如果s1<s2,則返回一個負數;如果s1>s2,則返回一個正數 |
| char strncmp(char *s1, char *s2, int n) |
比較串s1和s2中的前n個字符。返回值同上 |
| char *strcpy(char *s1, char *s2) |
將串s2(包括結束符)復制到s1中,返回指向s1中第一個字符的指針 |
| char *strncpy(char *s1, char *s2, int n) |
與strcpy相似,但它只復制n個字符。如果s2的長度小於n,則s1串以0補齊到長度n |
| int strlen(char *s1) |
返回串s1中的字符個數,不包括結尾的空字符 |
| char *strstr(const char *s1, char *s2) |
搜索字符串s2中第一次出現在s1中的位置,並返回一個指向第一次出現位置開始處的指針。如果字符串s1中不包括字符串s2,則返回一個空指針 |
| char *strchr(char *s1, char c) |
搜索s1串中第一個出現的字符c,如果成功則返回指向該字符的指針,否則返回NULL。被搜索的字符可以是串結束符,此時返回值是指向串結束符的指針 |
| int strpos(char *s1, char c) |
與strchr類似,但返回的是字符c在串s1中第一次出現的位置值,沒有找到則返回-1。s1串首字符的位置是0 |
| char *strrchr(char *s1, char c) |
搜索s1串中最后一個出現的字符c,如果成功則返回指向該字符的指針,否則返回NULL。被搜索的字符可以是串結束符 |
| int strrpos(char *s1, char c) |
與strrchr相似,但返回值是字符c在s1串中最后一次出現的位置值,沒有找到則返回-1 |
| int strspn(char *s1, char *set) |
搜索s1串中第一個不包括在set串中的字符,返回值是s1中包括在set里的字符個數。如果s1中的所有字符都包括在set里面,則返回s1的長度(不包括結束符)。如果set是空串,則返回0 |
| int strcspn(char *s1, char *set) |
與strspn相似,但它搜索的是s1串中的第一個包含在set里的字符。 |
| char *strpbrk(char *s1, char *set) |
與strspn相似,但返回指向搜索到的字符的指針,而不是個數;如果未找到,則返回NULL |
| char *strrpbrk(char *s1, char *set) |
與strpbrk相似,但它返回s1中指向找到的set字符集中最后一個字符的指針 |
5. 類型轉換及內存分配庫函數:
類型轉換及內存分配庫函數的原型聲明包含在頭文件STDLIB.H中,利用該庫函數可以完成數據類型轉換以及存儲器分配操作。
| 函數名及定義 |
功能說明 |
| float atof(char *s1) |
將字符串s1轉換成浮點數值並返回,輸入串中必須包含與浮點值規定相符的數。該函數在遇到第一個不能構成數字的字符時,停止對輸入字符串的讀操作 |
| long atoll(char *s1) |
將字符串s1轉換成一個長整型數值並返回,輸入串中必須包含與長整型數格式相符的字符串。該函數在遇到第一個不能構成數字的字符時,停止對輸入字符串的讀操作 |
| int atoi(char *s1) |
將字符串s1轉換成整型數並返回,輸入串中必須包含與整型數格式相符的字符串。該函數在遇到第一個不能構成數字的字符時,停止對輸入字符串讀操作 |
| void *calloc(unsigned int n, unsigned int size) |
為n個元素的數組分配內存空間,數組中每個元素的大小為size,所分配的內存區域用0初始化。返回值為已分配的內存單元起始地址,如不成功則返回0 |
| void free(void xdata *p) |
釋放指針p所指向的存儲器區域。如果p為NULL,則該函數無效,p必須是以前用calloc、malloc或realloc函數分配的存儲器區域。調用free函數后,被釋放的存儲器區域就可以參加以后的分配了 |
| void init_mempool(void xdata *p, unsigned int size) |
對可被函數calloc、free、malloc或realloc管理的存儲器區域進行初始化,指針p表示存儲區的首地址,size表示存儲區的大小 |
| void *malloc(unsigned int size) |
在內存中分配一個size字節大小的存儲器空間,返回值為一個size大小對象所分配的內存指針。如果返回NULL,則無足夠的內存空間可用 |
| void *realloc(void xdata *p, unsigned int size) |
用於調整先前分配的存儲器區域大小。參數p指示該存儲區域的起始地址,參數size表示新分配存儲器區域的大小。原存儲器區域的內容被復制到新存儲器區域中。如果新區域較大,多出的區域將不作初始化。realloc返回指向新存儲區的指針,如果返回NULL,則無足夠大的內存可用,這時將保持原存儲區不變。 |
| int rand() |
返回一個0~32767之間的偽隨機數,對rand的相繼調用將產生相同序列的隨機數 |
| void srand(int n) |
用來將隨機數發生器初始化成一個已知(或期望)值 |
| unsigned long strtod (const char *s, char **ptr) |
將字符串s轉換為一個浮點型數據並返回,字符串前面的空格、/、tab符被忽略 |
| long strtol (const char *s, char **ptr, unsigned char base) |
將字符串s轉換為一個long型數據並返回,字符串前面的空格、/、tab符被忽略 |
| long strtoul (const char *s, char **ptr, unsigned char base) |
將字符串s轉換為一個unsigned long型數據並返回,溢出時則返回ULONG_MAX。字符串前面的空格、/、tab符被忽略 |
6. 數學計算庫函數:
數學計算庫函數的原型聲明包含在頭文件MATH.H中。
| 函數名及定義 |
功能說明 |
|
| int abs(int val) char cabs(char val) float fabs(float val) long labs(long val) |
abs計算並返回val的絕對值。如果val為正,則不做改變就返回;如果val為負,則返回相反數。其余3個函數除了變量和返回值類型不同之外,其他功能完全相同
|
|
| float exp(float x) float log(float x) float log10(float x) |
exp計算並返回浮點數x的指數函數 log計算並返回浮點數x的自然對數(以e為底,e=2.718282) log10計算並返回浮點數x以10為底的對數 |
|
| float sqrt(float x) |
計算並返回x的正平方根 |
|
| float cos(float x) float sin(float x) float tan(float x) |
cos計算並返回x的余弦值 sin計算並返回x的正弦值 tan計算並返回x的正切值 |
變量范圍-π/2~+π/2 值在-65535~+65535之間 否則產生NaN錯誤 |
| float acos(float x) float asin(float x) float atan(float x) float atan2(float y, float x) |
acos計算並返回x的反余弦值 asin計算並返回x的反正弦值 atan計算並返回x的反正切值,值域為-π/2~+π/2 atan2計算並返回y/x的反正切值,值域為-π~+π |
|
| float cosh(float x) float sinh(float x) float tanh(float x) |
cosh計算並返回x的雙曲余弦值 sinh計算並返回x的雙曲正弦值 tanh計算並返回x的雙曲正切值 |
|
| float ceil(float x) |
計算並返回一個不小於x的最小整數(作為浮點數) |
|
| float floor(float x) |
計算並返回一個不大於x的最小整數(作為浮點數) |
|
| float modf(float x, float *ip) |
將浮點數x分成整數和小數部分,兩者都含有與x相同的符號,整數部分放入*ip,小數部分作為返回值 |
|
| float pow(float x, float y) |
計算並返回xy值,如果x不等於0而y=0,則返回1.當x=0且y<=0或當x<0且y不是整數時,則返回NaN |
|
