一、延時程序的處理:
1、對于可以設置系統時鐘的單片機,延時程序統一先把系統時鐘設頻率置為最低,然后按這個最低時鐘頻率寫延時
函數,這樣的好處:第一,統一了不同系統時鐘下的延時;第二,降低功耗
2、對于單片機系統,不同的外部時鐘,延時程序對應的時間不同,為了方便使用,加入預編譯指令#ifdef/#else/
#endif 這樣如果預定義了一個系統時鐘,則選擇相應的延時參數進行編譯,而延時程序主體不變,只是里面有
一個延時參數,根據預定義選擇相應參數。
二、for循環的處理:
用for(i=XX,i>0,i--) 而不用for(i=0;i<XX,i++) 速度快
對于兩層或多層for循環,頻繁的循環放在內層,減少循環間跳轉花費的時間
三、對外設的操作:可以把外設作為一個文件來操作,比如液晶,就可以把液晶看作一個文件,往液晶打印字符串或
者數據,就可以用fprintf()來做,(51的C標準庫不支持,但是可以自己寫一個文件操作的庫)。只要是輸入輸出
設備,都試著用文件操作的方法去操作。
四、標準庫函數的使用:
1、標準輸入輸出庫(stdio.h):
字符串夾雜變量數字(比如:發送完nihao字符串,然后發送變量i的值)往液晶顯示或往串口發送的時候,往串口發
送可以使用格式輸出函數printf("nihao%d",i);但是往LCD顯示就不好做了,通常是寫一個數字轉字符串的函數,然
后先送原來的字符串,再送數字轉換后的字符串,太麻煩,可以使用標準輸入輸出庫里的sprintf()函數來完成,它
的原型為:sprintf(char *buffer, const char *format, …),*buffer是要把字符串和變量寫入的緩沖區,可以使
用數組或者指針,后面的格式和printf()函數一樣; 與之對應的還有sscanf()函數,從緩沖區讀一個字符串把它
轉成相應的類型后賦給指定的變量。
比如:
#include <stdio.h>
void PrintToLcd(unsigned char *str)
{
...
}
void main()
{
unsigned char *p;
unsigned char i = 50;
sprintf(p,"nihao%d",i);
PrintToLcd(p);
}
2、字符串庫(string.h)
字符串連接(相加) char *strcat(char *dest,const char *stc)
把src連接到dest字符串后面,返回指向dest的指針
字符串比較 int strcmp(char *str1,char *str2)
返回值:小于0: str1<str2,等于0: str1=str2,大于0: str1>str2
字符串拷貝1 char *strcpy(char *dest,const char *src)
結果把src的內容拷進dest,兩個字符串內容相同,返回指向dest的指針
字符串拷貝2 char *strdup(const char *src)
src:待拷貝的源字符串,返回值:指向拷貝后的字符串的指針
字符串倒序 char *strrev(char *s);
返回指向倒序后字符串的指針
3、類型轉換(math.h; stdlib.h)
字符串轉雙精度(類似C++Builder里的StrToDouble) double atof(char *str)
字符串轉整數(類似StrToInt) int atoi(char *str)
字符串轉長整型 long atol(char *str)
浮點數轉字符串 char *ecvt(double value,int ndigit,int*dec,int *sign)
char *fcvt(double value,int ndigit,int*dec,int *sign)
輸入參數:value: 待轉換浮點數,ndigit: 轉換后的字符串長度
輸出參數:dec: 小數點位置,sign: 符號
返回轉換后的字符串指針
整型轉字符串 char *itoa(int value,char *string,int radix)
輸入參數:value: 要轉換的數,radix: 轉換的進制
輸出參數:string: 轉換后的字符串
返回指向string的指針
長整型轉字符串 char *ltoa(long value,char *string,int radix)