c語言,微秒級延時
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),遂平企業(yè)網(wǎng)站建設(shè),遂平品牌網(wǎng)站建設(shè),網(wǎng)站定制,遂平網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,遂平網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
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)生的。
定義一個延時xms毫秒的延時函數(shù)
void delay(unsigned int xms) // xms代表需要延時的毫秒數(shù)
{
unsigned int x,y;
for(x=xms;x》0;x--)
for(y=110;y》0;y--);
}
使用:
void Delay10us(uchar Ms)
{
uchar data i;
for(;Ms》0;Ms--)
for(i=26;i》0;i--);
}
i=[(延時值-1.75)*12/Ms-15]/4
擴展資料
1、在C51中進行精確的延時子程序設(shè)計時,盡量不要或少在延時子程序中定義局部變量,所有的延時子程序中變量通過有參函數(shù)傳遞。
2、在延時子程序設(shè)計時,采用do…while,結(jié)構(gòu)做循環(huán)體要比for結(jié)構(gòu)做循環(huán)體好。
3、在延時子程序設(shè)計時,要進行循環(huán)體嵌套時,采用先內(nèi)循環(huán),再減減比先減減,再內(nèi)循環(huán)要好。
1、delay函數(shù)是一般自己定義的一個延時函數(shù)。
2、C語言定義延時函數(shù)主要通過無意義指令的執(zhí)行來達到延時的目的。下面給出一個經(jīng)典的延時函數(shù)。
//?定義一個延時xms毫秒的延時函數(shù)
void?delay(unsigned?int?xms)??//?xms代表需要延時的毫秒數(shù)
{
unsigned?int?x,y;
for(x=xms;x0;x--)
for(y=110;y0;y--);
}
sleep函數(shù),在windows中是以毫秒為單位延遲,如Sleep(1000)就是延遲1000ms,也就是1秒。