一。在用C來編寫單片機程序時,計時精度比起彙編來,他們不能比。但還是有一些簡單的原則可循的:1.儘量使用unsigned型的數據結構。2.儘量使用char型,實在不夠用再用int,然後纔是long。3.如果有可能,不要用浮點型。4.使用簡潔的代碼,因爲按照經驗,簡潔的C代碼往往可以生成簡潔的目標代碼(雖說不是在所有的情況下都成立)。
二。編寫廷時程序:
1.a example
void delay1(unsigned char i)
{
while(--i);
}
assemble後的源碼:
; FUNCTION _delay1 (BEGIN)
; SOURCE LINE # 13
;---- Variable "i" assigned to Register "R7" ----
; SOURCE LINE # 14
0000 ?C0004:
; SOURCE LINE # 15
0000 DFFE
DJNZ R7,?C0004
; SOURCE LINE # 16
0002 ?C0006:
0002 22
RET
; FUNCTION _delay1 (END)
i delay time/us
1 5
2 7
3 9
...
計算延時時間時,已經算上了調用函數的lcall語句所花的2個時鐘週期的時間。
2.設廷時125*n毫秒程序:
#include <reg52.h>
#include <intrins.h>
void music_delay(unsigned char n) //delay 125*n ms
{
unsigned char i=125,j;
do{
do{
for(j=0;j<230;j++) _nop_(); //j=(11159KHz/12-10)/4
}while(--i)
}while(--n)
}
3. 在單片機C語言中如何加入NOP指令
標準的C語言中沒有空語句。但在單片機的C語言編程中,
經常需要用幾個空指令產生短延時的效果。
這在彙編語言中很容易實現,寫幾個nop就行了。
在AVR-GCC中,我用如下方法嵌入彙編指令:
asm ("nop; nop; nop; nop;" ::);
在keil C51中,直接調用庫函數:
#i nclude<intrins.h> // 聲明瞭void _nop_(void);
_nop_(); // 產生一條NOP指令