1、就看樓主你用的晶振是多大的!如果你用的是12M的晶振,一個(gè)機(jī)器周期為T=12/f=1微秒,你的延時(shí)程序循環(huán)600*125=75000次,即75000微秒,就是75毫秒。
成都創(chuàng)新互聯(lián)長(zhǎng)期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為大石橋企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營(yíng)銷網(wǎng)站建設(shè),大石橋網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
2、首先你要延時(shí)多長(zhǎng)時(shí)間,us級(jí)別的必須使用匯編,C誤差很大,10-100us級(jí)別的可以用C控制,單必須考慮C出棧入棧時(shí)間。ms以上的用時(shí)間除以機(jī)器周期(除以你則個(gè)1us是不行的,誤差大)。
3、記下當(dāng)前時(shí)間T1,然后按F10(不進(jìn)入子函數(shù))調(diào)試,再記錄當(dāng)前時(shí)間T2,則延時(shí)=T2-T1。多試幾個(gè)A,差不多調(diào)到1s就夠了。我一般都這么調(diào)。你要想明白其中原理,想自己算的話,你就看看delay的匯編代碼段自己算吧。
4、用12MHz的晶振的話,其延時(shí)大概是1ms。其實(shí)for (i=0;i124;i++);更接近1ms。
5、每一遍,如果是1us,才能是延時(shí)約1s。但是,晶振是12MHz,一條匯編的指令就至少是1us,C語言的語句,就要更多。
6、在main函數(shù)中添加延時(shí)函數(shù),以實(shí)現(xiàn)上電后30秒后LED燈開始點(diǎn)亮的要求。
1、微秒延時(shí)函數(shù) void Delayus(unsigned int US){ unsigned i;US=US*5/4;//5/4是在8MHz晶振下,通過軟件仿真反復(fù)實(shí)驗(yàn)得到的數(shù)值 for(i=0;iUS;i++);} // 以上函數(shù)式根據(jù)AVR單片機(jī)在8MHZ時(shí)鐘頻率下得出的結(jié)果。
2、可以用_nop_( )函數(shù)來實(shí)現(xiàn)微秒級(jí)的延時(shí)。_nop_(); // 直接當(dāng)成一條語句使用,產(chǎn)生一條NOP指令NOP指令為單周期指令,可由晶振頻率算出延時(shí)時(shí)間,對(duì)于12M晶振,延時(shí)1uS。
3、在linux里用select可以達(dá)到延遲效果,阻塞和非阻塞都可以選擇,也可以創(chuàng)建一個(gè)線程用ulseep做延遲,時(shí)間到了就向目標(biāo)線程發(fā)送信號(hào)或者使用變量來通知。
這個(gè)跟的系統(tǒng)頻率有關(guān)系。看看你的晶振是多少。另外還跟指令集有關(guān)系。精確的時(shí)間你可以反匯編一下看看有多少條指令,根據(jù)指令周期算算延時(shí)時(shí)間。
簡(jiǎn)單比喻一次振蕩需要1us,那1ms就是1000次振蕩,300ms就是300x1000次振蕩,這樣就能大概的計(jì)算出300ms delay;這得看你的CPU運(yùn)行一條指令得多久,像單片機(jī)89C51一般一條1us。C語言是一門通用計(jì)算機(jī)編程語言,應(yīng)用廣泛。
就是用晶振頻率算cpu指令周期,再算Delay循環(huán)中有幾條代碼,需要多少個(gè)指令周期。除一下可以算個(gè)大概。具體你可以結(jié)合硬件資料來算。
算法是這樣的:這個(gè)用編譯軟件,如keil,編譯通過之后,進(jìn)入軟件調(diào)試功能,就可以測(cè)出來是延時(shí)多少秒。具體我?guī)湍阏{(diào)試過了,如果單片機(jī)接12mhz晶振的話,這個(gè)是延時(shí)0.2秒的子程序。你調(diào)用一次delay();就延時(shí)0.2秒。
{ unsigned int i,j;for(i=t;i0;i--)for(j=123;j0;j--);} 能精確到1ms。如果是10592MHz晶振,只需把上面的“j=123”改為“j=114”,都是調(diào)試過的,沒問題。
你這個(gè)10592是匹配波特率所用的晶振,機(jī)器周期只是約等于1us。首先你要延時(shí)多長(zhǎng)時(shí)間,us級(jí)別的必須使用匯編,C誤差很大,10-100us級(jí)別的可以用C控制,單必須考慮C出棧入棧時(shí)間。