2 回答

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
一種最原始,最沒有效率的延時(shí)程序。在調(diào)用這個(gè)延時(shí)程序時(shí),CPU將在while(time--){}這個(gè)循環(huán)處不停的等待,直到time減到零,標(biāo)志著延時(shí)結(jié)束。程序也隨之退出。
從函數(shù)第一句開始,直到while循環(huán)語句之前,都屬于定時(shí)器配置。通過注釋可以看出,使用了定時(shí)器3。由于不知道單片機(jī)的型號(hào),只能做一個(gè)通用的解釋??炊@一解釋的基礎(chǔ)是你知道單片機(jī)定時(shí)器的配置方法和工作原理。
首先,表示時(shí)間的變量time不是時(shí)間單位,并不表示毫秒或者秒,他代表了延時(shí)多少個(gè)脈沖。而變量val也是脈沖,他定義了一個(gè)定時(shí)器工作周期所經(jīng)過的脈沖數(shù)。單個(gè)脈沖表示的時(shí)間間隔則通過單片機(jī)工作頻率計(jì)算出來。比如說,單片機(jī)的頻率為10mHz,那么每個(gè)脈沖的時(shí)間就是1uS(假設(shè)分頻電路為1:1)。如果需要定時(shí)器的一個(gè)工作周期為1ms,那么val就需要設(shè)為1000。如果延時(shí)10ms,則time=100??梢?,延時(shí)時(shí)間只能是定時(shí)器工作周期的整數(shù)倍。
rTcon3是定時(shí)器3的計(jì)數(shù)器,每個(gè)脈沖過后,會(huì)根據(jù)定時(shí)器的設(shè)定而自動(dòng)進(jìn)行+1操作。完成一個(gè)工作周期后,恢復(fù)為0。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
這是利用定時(shí)器3的計(jì)數(shù)功能來延時(shí)的程序
void Delay(int time)
{
U32 val = (PCLK>>3)/1000-1;
rTCFG0 &= ~(0xff<<8);
rTCFG0 |= 3<<8; //prescaler = 3+1
rTCFG1 &= ~(0xf<<12);
rTCFG1 |= 0<<12; //mux = 1/2 //這四句設(shè)置定時(shí)器輸入的頻率,PCLK/8
rTCNTB3 = val; //設(shè)置計(jì)數(shù)值,輸入頻率除以1000,即計(jì)數(shù)器到底時(shí)正好1ms
rTCMPB3 = val>>1; // 50% //這個(gè)是設(shè)置比較值,計(jì)數(shù)到這個(gè)值時(shí),引腳會(huì)有輸出
rTCON &= ~(0xf<<16);
rTCON |= 0xb<<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
rTCON &= ~(2<<16); //clear manual update bit //這幾行是啟動(dòng)定時(shí)器,開始進(jìn)行計(jì)數(shù),計(jì)數(shù)到0時(shí)自動(dòng)重新裝載計(jì)數(shù)值
while(time--) {
while(rTCNTO3>=val>>1);
while(rTCNTO3<val>>1); //這兩行是讀取計(jì)數(shù)器的值,每次到一半時(shí),將time減一次,因?yàn)橛?jì)數(shù)器一直在走的,所以要使用范圍讀取,不能像這樣while(rTCNTO3 == 0),這樣的話,估計(jì)會(huì)永遠(yuǎn)都等等不到的。
};
}
- 2 回答
- 0 關(guān)注
- 126 瀏覽
添加回答
舉報(bào)