導航:首頁 > 操作系統 > 單片機500ms延時

單片機500ms延時

發布時間:2022-09-10 09:15:27

『壹』 單片機c語言的延時程序500ms

一般單片機在c語言中很難得到精確的延時,所以一般對時間要求高的都用計時器中斷來做了。如果時間要求不嚴格可以用for循環來做,你可以實際測試一下,把時間延時到大概一秒左右,然後燒進單片機里運行,比如一個燈亮燈滅的程序,看著燈計數,同時用秒錶計時,幾個幾十次後取平均值就能知道大概時間了。

『貳』 單片機延遲500ms試寫出延遲程序

根據外部晶振的不同,延時1毫秒的循環次數也不一樣,一般12m晶振的話用
for(j=time;j>0;j--);延時時,1毫秒time大概為125左右,這里用110,大概晶振為11.0592m,所以這段程序,內部循環完成1毫秒延時,外部循環完成500毫秒延時。

『叄』 單片機匯編語言流水燈,定時器中斷控制,(500ms)延時

單片機匯編語言流水燈,用定時器中斷控制,可以初始化設置定時器時間(如50mS註定時器最大定時時間到不了500mS,需要加計數存儲,中斷10就是500mS),有多種方式實現如作一個流水狀態表,定時讀取寫入IO埠 表加一,,或者用左移太移等方式都可以實現在,網上有很多這種實例。

『肆』 單片機延時時間怎樣計算

如果用循環語句實現的循環,沒法計算,但是可以通過軟體模擬看到具體時間,但是一般精精確延時是沒法用循環語句實現的。
如果想精確延時,一般需要用到定時器,延時時間與晶振有關系,單片機系統一般常選用11.059
2
mhz、12
mhz或6
mhz晶振。第一種更容易產生各種標準的波特率,後兩種的一個機器周期分別為1
μs和2
μs,便於精確延時。本程序中假設使用頻率為12
mhz的晶振。最長的延時時間可達216=65
536
μs。若定時器工作在方式2,則可實現極短時間的精確延時;如使用其他定時方式,則要考慮重裝定時初值的時間(重裝定時器初值佔用2個機器周期)。

『伍』 51單片機延時500ms程序

void DelayM(unsigned int a){
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++); //一個 ; 表示空語句,CPU空轉。
} //i 從0加到125,CPU大概就耗時1毫秒
}
定時M毫秒的程序,晶振為12MHz。a取500就為500ms

『陸』 求單片機高手幫我算下這個延時程序的500ms是怎麼算出來的

設51系列單片機晶振頻率Fosc為12MHz
則第個機器周期 =12/Fosc =1μs
.
每條MOV Rn,#data指令耗用1個機器周期
6條NOP指令執行耗用6個機器周期
每條DJNZ Rn,rel指令耗用2個機器周期,
D2內循環耗用機器周期數N2=1+(6+2)250 =2001
D1外循環耗用機器周期數N1=1+(N2+2)250=500751
運行整段程序耗用機器周期數N=1+N1=500752
.
運行整段程序延時時間 =500752x1μs ≈500ms

『柒』 單片機流水燈C語言程序(8個燈,依次點亮每個燈,延時500MS)

單片機流水燈C語言程序的源代碼如下:

#include //51系列單片機定義文件

#define uchar unsigned char //定義無符號字元

#define uint unsigned int //定義無符號整數

void delay(uint); //聲明延時函數

void main(void)

{

uint i;

uchar temp;

while(1)

{

temp=0x01;

for(i=0;i<8;i++) //8個流水燈逐個閃動

{

P1=~temp;

delay(100); //調用延時函數

temp<<=1;

}

temp=0x80;

for(i=0;i<8;i++) //8個流水燈反向逐個閃動

{

P1=~temp;

delay(100); //調用延時函數

temp>>=1;

}

temp=0xFE;

for(i=0;i<8;i++) //8個流水燈依次全部點亮

{

P1=temp;

delay(100); //調用延時函數

temp<<=1;

}

temp=0x7F;

for(i=0;i<8;i++) //8個流水燈依次反向全部點亮

{

P1=temp;

delay(100); //調用延時函數

temp>>=1;

}

void delay(uint t) //定義延時函數

{

register uint bt;

for(;t;t--)

for(bt=0;bt<255;bt++);

}

(7)單片機500ms延時擴展閱讀

51單片機流水燈的源代碼如下

#include<reg51.h>

#include<intrins.h>

voiddelay(inta)

{

inti;

while(a--)for(i=0;i<110;i++);

}

main()

{

inti;

while(1)

{

P0=0xfe;

for(i=0;i<8;i++)

{

P0=_crol_(P0,1);

delay(500);

}

}

}

『捌』 單片機的主頻是12MHZ,試用循環指令編寫延時500ms的延時子程序 求大神解答,在線等,略急

12MHZ就是 1/12M 秒運行一個指令周期,(部分指令是2周期、3周期指令,具體看你執行什麼指令),
times= 500ms / 1/12M,
times就是 500ms需要運行的周期數。

你先把循環計時指令寫好,再計算循環指令執行1次需要多少個指令周期(即循環程序種每條指令運行周期數疊加),再把 times/一次循環周期數 就是要循環的次數 x,把 x 放進已經寫好的循環程序中,替換循環的次數即可。

『玖』 利用單片機的定時/計數器,編寫延時500ms的3個發光二極體程序,使3個燈閃爍。晶振為6MHz,控制埠自定

定時器其實就是單片機的一個內部自身時鍾的計數器,每一個周期計數器加1,所以使用定時器功能時候先要給定時器付初值,就是先寫TH0TL0的值(如下),寫完初值後就等著定時器功能的那個計數器記滿了數後也就是到了65536後就溢出了,所以一次定時的過程就是65536-初值 之間的數 所代表的時鍾周期,計數滿了溢出要產生中斷就要寫一個中斷服務子程序,子程序如下void timer0() interrrupt X 中斷服務子程序中還要給定時器計數器的TH TL付初值 進行下一次的計數,明白了吧。。樓上的那個沒寫interrupt 選擇定時器工作方式。哎呀,媽呀 累死我了
void main()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//定時器0初值,定時50ms 定時多少MS就多少*1000
EA=1;//開啟總中斷
ET0=1;//定時器0中斷允許
TR0=1;//開啟定時器0
while(1)
{
}
}
void timer0() interrrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}

『拾』 單片機關於延時函數,請問這段代碼不是延時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被連續執行動作。我們怎麼才能讓這種情況不發生呢?這就需要我們不僅檢測按鍵按下,還需要檢測按鍵彈起,只有按鍵彈起我們才允許它執行下一步,這樣就能按下一次,抬起手,才會停止,保證了操作的准確。
執行流程如下:
判斷按鍵按下》按鍵按下》延時》判斷按鍵按下》按鍵按下》執行動作》判斷按鍵抬起》按鍵抬起》結束。
我們再次測試,此時發現,按下後,不松開,按鍵不再連續動作,但是松開按鍵後,原本熄滅的小燈又點亮了,我們梳理程序,可以發現,是不存在錯誤的,流程也沒有問題。其實這就涉及我們的硬體了,我們使用軟體模擬時,這些問題都是沒有的,但硬體跟模擬的區別就在這里,在單片機中,如果我們沒有規定執行下一步的位置,單片機就會在流程走完後,隨機進入我們無法控制的流程,這在專業中稱之為跑飛。為了防止跑飛,我們一般會在結束添加循環語句,讓程序停止在我們設定的位置,這樣就不會有問題了。
此處我們需要連續監測按鍵狀態,所以就讓程序不斷的循環判斷按鍵即可。
再次測試,一切就按照程序執行了,動作也正常了。
這就是為什麼我們之前的測試程序,都會在主函數中添加循環的作用。通過這個示例,也是告訴大家,模擬只是學習的方法,最終目的還是要在實際的硬體上進行。不然你永遠不知道自己的程序能不能完成真正的功能,設計不能光紙上談兵哦。

閱讀全文

與單片機500ms延時相關的資料

熱點內容
單片機連接蜂鳴器電路 瀏覽:844
程序員買房前後對比照 瀏覽:988
cmdjava中文亂碼 瀏覽:947
窗口app哪個好 瀏覽:731
xzforandroid 瀏覽:577
程序員那麼可愛歌曲完整版 瀏覽:906
為什麼購買pdf 瀏覽:45
操作系統代碼編譯 瀏覽:483
程序員東北大學 瀏覽:426
編譯忽略空字元 瀏覽:117
多店鋪阿里雲伺服器教程 瀏覽:378
單片機求初值 瀏覽:420
安卓機如何在電腦備份圖片 瀏覽:925
ca證書加密機價格 瀏覽:798
天乾地支年份演算法 瀏覽:796
程序員打造的視頻 瀏覽:7
java和php通信 瀏覽:680
為什麼黑程序員 瀏覽:163
程序員男生 瀏覽:456
戴爾文件夾內文件怎麼置頂 瀏覽:583