如果是單片機上,是有可能的
創(chuàng)新互聯(lián)專注于安居企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,商城網(wǎng)站建設(shè)。安居網(wǎng)站建設(shè)公司,為安居等地區(qū)提供建站服務(wù)。全流程按需開發(fā),專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
單片機12M晶振執(zhí)行一條指令1us,所以C語言1us延時程序 用12M晶振延時1us,用—_nop_();
#includeintrins.h //頭文件
_nop_(); //這一個語句表示1us延時
C語言的延遲函數(shù)一般是利用無意義程序運行來控制時間從而達到延時的目的
舉個例子:
for(i=0;ix;i++)
for(j=0;j120;j++);
這是延時x毫秒的for循環(huán)語句。
值得注意的是記得最后的;一定得記得寫。
c語言,微秒級延時
void?Delay_us?(unsigned?char?time_us)
{
unsigned?long?int??TM_LODAE;
TR2???=?0;??????????????????????????//?Stop?timer
TF2H??=?0;??????????????????????????//?Clear?timer?overflow?flag
TM_LODAE?=?65535-(UINT)(SYSCLK/1000000)?*?(UINT)(time_us);
//?TMR2??=?-(?(UINT)(SYSCLK/1000000)?*?(UINT)(time_us)?);
TMR2H?=??TM_LODAE8;
TMR2L =??TM_LODAE0x00FF;
TR2???=?1;??????????????????????????//?Start?timer
while?(!TF2H);??????????????????????//?Wait?till?timer?overflow?occurs
TR2???=?0;??????????????????????????//?Stop?timer
}
程序分析:
前面一起住航分析一下該代碼,
unsigned?long?int??TM_LODAE;??聲明一個長整型數(shù)據(jù),
TR2???=?0;????定時器2停止計時
TF2H??=?0;??????清除定時器2中斷標(biāo)志
TM_LODAE?=?65535-(UINT)(SYSCLK/1000000)?*?(UINT)(time_us);????計算定時器初值。?SYSCLK是系統(tǒng)的晶振頻率,SYSCLK/1000000是系統(tǒng)?1uS?執(zhí)行的指令。?(UINT)(SYSCLK/1000000)?*?(UINT)(time_us)就是系統(tǒng)?time_us執(zhí)行的指令數(shù)。?65535-(UINT)(SYSCLK/1000000)?*?(UINT)(time_us)定時器需要?TM_LODAE指令周期才會溢出。
該單片機的一個指令周期就是一個時鐘周期.TMR2H?=??TM_LODAE8;??TMR2L =??TM_LODAE0x00FF;置定時器寄存器的初值、
TR2???=?1;???啟動單片機計時? while?(!TF2H); ?等待定時器2寄存器溢出。TR2???=?0;停止計時,在這段代碼注釋中已經(jīng)說明了應(yīng)該有50nS的誤差,這個是函數(shù)調(diào)用產(chǎn)生的。
原理:只是執(zhí)行一些所謂的“無實際意義的指令”,如縮放或執(zhí)行一個int自加,簡單地說,就像高中數(shù)學(xué)中的“乘法原理”一樣,很容易迅速增加上面提到的“無意義指令”的數(shù)量
關(guān)于大小的值:如果是在C語言中,該值不僅與水晶振動、單片機本身的速度,但也與C的編譯器,所以,雖然這個值可以精確計算,但大多數(shù)情況下,程序員是經(jīng)驗值。
當(dāng)然,如果你在匯編中編程,情況就不同了,因為每條指令使用一定數(shù)量的機器周期,你當(dāng)然可以根據(jù)所有指令使用的總時間來計算特定延遲的總時間。
擴展資料:
定義延遲XMS毫秒的延遲函數(shù)
Voiddelay(unsignedintXMS)//XMS表示需要延遲的毫秒數(shù)
{
無符號intx,y;
For(x=XMS;X0;X-)
For(y=110;Y”0;Y-);
}
使用:
VoidDelay10us(ucharMs)
{
Uchar數(shù)據(jù)我;
(;女士“0;------Ms)
對于(I = 26)我 0;我-);
}
I=[(延遲值-1.75)*12/ms-15]/4