Ⅰ 51單片機延時函數
這個要結合你的模擬來做,首先設置斷點,測量出單個循環的指令周期數,然後再進行延時計算,用5/單次循環的時間後確認循環次數,你的i,j沒有嵌套,嵌套後更合理。
Ⅱ 怎麼寫段單片機延時函數要用定時器!
1、首先分析您的程序,
void
delay()
{
int
i;
if(1
==
TF0)//if(TF0==1),查詢定時器溢出標志位
{
TF0=0;
i=10000;//定時溢出時給i賦值1000
TH0=0xDC;TL0=0x00;
i--;//i=999,如果還沒有減到0時定時器又溢出,則i永遠不會減到0!!!!所以您的這段程序不應該行不通!!
}
while(1)
{
if(i==0)
break
;
}
}
2、建議做法
(1)定義一個全局變數用於作定時計數如unsigned
char
n;
(2)定時器採用以某一時間基準(10ms)中斷方式,每中斷一次中斷處理程序里n++;
(3)在延時函數中對n進行操作,如延時1s即1000ms則:
void
delay_1s()
{
while(n<100);//如果n<100,即還沒有到1s就等待
n=0;如果1s時間到則清零n,退出子程序
}
當然這樣定時精度可能需要調整,但思路可以試試。
Ⅲ 單片機關於延時函數,請問這段代碼不是延時500ms嗎為什麼這里說是200ms
按鍵的延時消抖是初學單片機的必經之路,因為只要是機械開關所傳遞的信號,都會存在波動,有時這些波動是「致命」的,所以消除其影響就是一門手藝了。硬體消抖有其優點,同樣的也有不方便的地方,開發成本高,操作難度大,可移植性差。軟體消抖就相對較好些,新手即可操作,延時消抖,並非消抖的最終最優方法,但好在簡單易懂,我們先認識消抖的方法和目的。
按鍵在按下和抬起時,都會出現短暫的抖動,稱之為前沿抖動和後沿抖動,他們持續的時間大致在5-10毫秒,鍵穩定時間會在100毫秒以上,就人的操作速度來看,鍵穩定的時間不會低於100毫秒,因為,1秒十次的操作,估計手都受不了。除非科幻世界或武俠世界的人。
既然抖動時間基本不變,那麼,我們就有這樣一種方法,當按鍵出現第一個電位變化,假設是高電位轉變成低電位,那麼我們就延時一段時間,設置10毫秒,10毫秒以後,我們再次判斷此時的電位狀態,是否是低電位,如果是低電位,那麼就認為按鍵按下了,如果是高電位,就認為按鍵是抖動。從低電位變成高電位也是一樣。
我們就是用延時來,把抖動的時間空過去了,這樣就不用擔心抖動產生的電位頻繁變化了。接下來,我們看下程序如何寫。
按流程來,基本上就能寫出來,程序分為兩大塊,一個是主函數,處理開關狀態,一個是延時函數。
我們先定義一個開關,然後我又聲明了一個位變數,其實這個位變數在這里可以不用,不過習慣如此,對採集來的數據我習慣讓其保存在特定的變數中,這樣方便後期使用,以防自己改變變數值,造成埠的電位隨之改變。
主函數中,先把開關採集埠置1,這是讀取數據的前提條件,然後把需要採集的io的狀態轉移給中間變數,接著判斷此時中間變數是否為零,也就是按鍵是否按下,如果沒有按下,那就跳出,繼續賦值,接著判斷,直到判斷為零,進入語句中,先延時一段時間,讓抖動空過去,延時結束,再判斷一次,由於此時程序還沒走出去,所以中間變數的值也沒有實時切換,我們此時要判斷按鍵實時狀態是否為零,就需要判斷埠的實際值,當key10為零,就說明按鍵確實處於按下狀態,這就可以執行,移位指令。
需要說明,如果使用函數,在調用時,只需寫出函數名即可。但是在程序最開始位置,需要聲明函數,聲明時,要寫全,尤其是返回值的類型和變數名,不能省略。可以把函數直接復制到前方,然後加一個冒號即可。
程序看完,我們模擬一下測試下程序是否執行。
這是之前我們使用的模擬電路,直接使用就好。我沒有改變工程文件,所以無需重新導入可執行文件,程序會直接讀取我保存好的新的可執行文件,文件名沒有改變。
這是軟體的初始狀態,所有埠都是高電位,我們按下P10.
按鍵隨著按下,可以穩定的響應,我們再通過實際電路測試一下。
測試發現,我按下按鍵,還沒鬆手,就已經流水般的熄滅了5個燈了,什麼情況?
我們可以看程序的這里
keybuff=key10; //賦值
if(keybuff==0) //判斷開關是否按下
{
delay(50); //延時一段時間
if(key10==0) //再次判斷開關是否按下
{
P3=P3>>1; //P3左移一位
}
}
從這一段可以看出,只要我能滿足keybuff為零,key10為零,那麼程序就會在延時結束再次進入程序,如此循環,就造成了,按鍵按下,P3被連續執行動作。我們怎麼才能讓這種情況不發生呢?這就需要我們不僅檢測按鍵按下,還需要檢測按鍵彈起,只有按鍵彈起我們才允許它執行下一步,這樣就能按下一次,抬起手,才會停止,保證了操作的准確。
執行流程如下:
判斷按鍵按下》按鍵按下》延時》判斷按鍵按下》按鍵按下》執行動作》判斷按鍵抬起》按鍵抬起》結束。
我們再次測試,此時發現,按下後,不松開,按鍵不再連續動作,但是松開按鍵後,原本熄滅的小燈又點亮了,我們梳理程序,可以發現,是不存在錯誤的,流程也沒有問題。其實這就涉及我們的硬體了,我們使用軟體模擬時,這些問題都是沒有的,但硬體跟模擬的區別就在這里,在單片機中,如果我們沒有規定執行下一步的位置,單片機就會在流程走完後,隨機進入我們無法控制的流程,這在專業中稱之為跑飛。為了防止跑飛,我們一般會在結束添加循環語句,讓程序停止在我們設定的位置,這樣就不會有問題了。
此處我們需要連續監測按鍵狀態,所以就讓程序不斷的循環判斷按鍵即可。
再次測試,一切就按照程序執行了,動作也正常了。
這就是為什麼我們之前的測試程序,都會在主函數中添加循環的作用。通過這個示例,也是告訴大家,模擬只是學習的方法,最終目的還是要在實際的硬體上進行。不然你永遠不知道自己的程序能不能完成真正的功能,設計不能光紙上談兵哦。
Ⅳ 怎麼計算單片機中的下列的延遲函數(12M)
首先你要知道一個指令周期是幾秒
演算法是1/(晶振頻率除以12)
然後你要知道循環究竟執行了幾個指令周期
你可以用keil里在線反匯編命令看看你的循環編譯成機器語言後到底是幾個指令周期
這樣就知道了延遲時間
當然你取近似值也可以的
比如
for(i=0,i<255,i++){x=2}
這里x=2是一個指令周期
而執行了255次
假如你的晶振是12mhz的
則你執行一個指令周期是1us
255次是0.255ms
Ⅳ 51單片機用c語言怎麼寫延時函數
延時時間的計算與單片機的晶振頻率有關。若晶振頻率為12Mhz,那麼單片機每震動一次所需要的時間是1/12M s。那麼再來看看單片機執行一次自減所需要的振動次數是96次,假如我們對時間要求不是特別精確的話,可以約等於100來計算。現在通過上面兩個數據可以得出:單片機每執行一次自減所需要的時間是1/12M *100(s),即1/120000 s,逆向計算一下,每1ms需要自減多少次?120次對吧。所以一個簡單的延時功能就誕生了,我們只需要自減120次,就可以延時1ms,如果我們要延時50ms呢,那就自減50*120=6000次。那麼在程序上如何表達呢?我們可以用兩套for循環
void delay(int i){
int x,y;
for(x=i;x>0;x--){
for(y=120;y>0;y--)
}
}
參數 i 代表該函數延時多少ms
Ⅵ 51單片機C語言程序中延時函數delay的原理是什麼
原理:只是執行一些所謂的「無實際意義的指令」,如縮放或執行一個int自加,簡單地說,就像高中數學中的「乘法原理」一樣,很容易迅速增加上面提到的「無意義指令」的數量
關於大小的值:如果是在C語言中,該值不僅與水晶振動、單片機本身的速度,但也與C的編譯器,所以,雖然這個值可以精確計算,但大多數情況下,程序員是經驗值。
當然,如果你在匯編中編程,情況就不同了,因為每條指令使用一定數量的機器周期,你當然可以根據所有指令使用的總時間來計算特定延遲的總時間。
(6)單片機延遲函數擴展閱讀:
定義延遲XMS毫秒的延遲函數
Voiddelay(unsignedintXMS)//XMS表示需要延遲的毫秒數
{
無符號intx,y;
For(x=XMS;X0;X-)
For(y=110;Y」0;Y-);
}
使用:
VoidDelay10us(ucharMs)
{
Uchar數據我;
(;女士「0;------Ms)
對於(I = 26)我> 0;我-);
}
I=[(延遲值-1.75)*12/ms-15]/4
Ⅶ 單片機延時函數原理
就是這個道理,如果一重循環延時時間較短的話,可以用二重循環。但C語言對延時時間不好精確計算,一般只用於對時間要求不嚴的場合。精確延時還是要用定時器。
Ⅷ 請求單片機delay延時函數
如果在程序中x=10(你寫程序時肯定會給他賦一個值,在這里假定是10),即在程序的某處會有delay(10)這樣的語句。相當於循環了600*x=600*10=6000次。可以根據自己的需要來定。你說得對,可以寫一個就行。但是有些晶元,你在控制他時,時序要求非常嚴格,如果延時太長或延時太短,都不會運行出結果。如果需要小延時的地方(只需幾個us),只寫一個就可以。如果需要延時幾ms,只寫一個,可能達不到延時要求。總而言之,要根據你的程序需要,時間長了,學的多了,也就懂了。希望我的回答,能給你提供點幫助
Ⅸ 怎麼理解這個單片機延遲函數
這個單片機延遲函數,其實就是 空操作 加 計數循環,至於延時時間 就要看用的單片機 指令周期而定,12T指令周期的約40uS左右,1T指令周期的約為5~6uS吧,單片機延遲函數可以有很多方法編寫,看行程需要而定,有得較長時間的延時最好不要用延時函數寫(因為延時函數是佔用CPU時間資源的)。
Ⅹ 單片機延時函數
因為第二個延時時間太長導致數碼管刷新頻率太低