十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
1、delay函數(shù)是一般自己定義的一個(gè)延時(shí)函數(shù)。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),承德縣企業(yè)網(wǎng)站建設(shè),承德縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,承德縣網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,承德縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
2、C語(yǔ)言定義延時(shí)函數(shù)主要通過(guò)無(wú)意義指令的執(zhí)行來(lái)達(dá)到延時(shí)的目的。下面給出一個(gè)經(jīng)典的延時(shí)函數(shù)。
//?定義一個(gè)延時(shí)xms毫秒的延時(shí)函數(shù)
void?delay(unsigned?int?xms)??//?xms代表需要延時(shí)的毫秒數(shù)
{
unsigned?int?x,y;
for(x=xms;x0;x--)
for(y=110;y0;y--);
}
c語(yǔ)言,微秒級(jí)延時(shí)
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;??聲明一個(gè)長(zhǎng)整型數(shù)據(jù),
TR2???=?0;????定時(shí)器2停止計(jì)時(shí)
TF2H??=?0;??????清除定時(shí)器2中斷標(biāo)志
TM_LODAE?=?65535-(UINT)(SYSCLK/1000000)?*?(UINT)(time_us);????計(jì)算定時(shí)器初值。?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)定時(shí)器需要?TM_LODAE指令周期才會(huì)溢出。
該單片機(jī)的一個(gè)指令周期就是一個(gè)時(shí)鐘周期.TMR2H?=??TM_LODAE8;??TMR2L =??TM_LODAE0x00FF;置定時(shí)器寄存器的初值、
TR2???=?1;???啟動(dòng)單片機(jī)計(jì)時(shí)? while?(!TF2H); ?等待定時(shí)器2寄存器溢出。TR2???=?0;停止計(jì)時(shí),在這段代碼注釋中已經(jīng)說(shuō)明了應(yīng)該有50nS的誤差,這個(gè)是函數(shù)調(diào)用產(chǎn)生的。
C語(yǔ)言中的兩個(gè)函數(shù)
一個(gè)是?windows.h?庫(kù)下的?Sleep()
效果為當(dāng)前進(jìn)程等待?Sleep(x)?毫秒
可以實(shí)現(xiàn)延時(shí)功能
另一個(gè)是?time.h?下的?time()
效果為返回當(dāng)前時(shí)間,配合循環(huán)可以實(shí)現(xiàn)定時(shí)功能
以下是一個(gè)例子:
//剛寫(xiě)完
#includestdio.h
#includewindows.h
#includetime.h
int?main()
{
printf("定時(shí)程序2秒后開(kāi)啟\n");
Sleep(2000);
printf("定時(shí)程序開(kāi)啟\n");
printf("當(dāng)前時(shí)間戳是%s\n",?time(NULL));
return?0;
}
延時(shí)時(shí)間的計(jì)算與單片機(jī)的晶振頻率有關(guān)。若晶振頻率為12Mhz,那么單片機(jī)每震動(dòng)一次所需要的時(shí)間是1/12M s。那么再來(lái)看看單片機(jī)執(zhí)行一次自減所需要的振動(dòng)次數(shù)是96次,假如我們對(duì)時(shí)間要求不是特別精確的話,可以約等于100來(lái)計(jì)算?,F(xiàn)在通過(guò)上面兩個(gè)數(shù)據(jù)可以得出:?jiǎn)纹瑱C(jī)每執(zhí)行一次自減所需要的時(shí)間是1/12M *100(s),即1/120000 s,逆向計(jì)算一下,每1ms需要自減多少次?120次對(duì)吧。所以一個(gè)簡(jiǎn)單的延時(shí)功能就誕生了,我們只需要自減120次,就可以延時(shí)1ms,如果我們要延時(shí)50ms呢,那就自減50*120=6000次。那么在程序上如何表達(dá)呢?我們可以用兩套for循環(huán)
void delay(int i){
int x,y;
for(x=i;x0;x--){
for(y=120;y0;y--)
}
}
參數(shù) i 代表該函數(shù)延時(shí)多少ms