C51的一點技巧

 一。在用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指令

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章