導航:首頁 > 操作系統 > 單片機定時器延時函數

單片機定時器延時函數

發布時間:2022-06-11 17:55:12

Ⅰ 51單片機中,定時器怎麼做延時函數用,比如說,要精確延時1s,該怎麼寫

unsigned long TimeTickCount;//1ms計時器
void Timer0Configuration();
void Delay1ms(unsigned int a);
void main()

{
while(1)
{
Delay1ms(1000);//1s延時;
}
}
void Delay1ms(unsigned int a)//0~65535
{
unsigned long b;//0~0xffffffff
b = TimeTickCount;//記下及時器初始值
while((TimeTickCount-b<a)||(0xffffffff+TimeTickCount-b<a));
//當計數器未溢出只須用 計數器實時變化的值-其初始值
//當計數器溢出則須用 計時器上限值+計數器實時變化的值-其初始值
}
void Timer1Configuration()
{
TMOD=0X10;//選擇為定時器模式,工作方式1。
TH1=0Xfc; //給定時器賦初值,定時1000us
TL1=0X18;
ET1=1;//打開定時器1中斷允許
EA=1;//打開總中斷
TR1=1;//打開定時器
}
void interrupt_timer1() interrupt 3 //1000us
{
TH1 = 0xfc; //重裝
TL1 = 0x18;
TimeTickCount++;//1000us計時器
}

Ⅱ 單片機定時器延時函數疑問

TCNT0 每us加1,它與 dauer 的差,也是每us加1。

差,如果小於 0(即為負數)時,差就是補碼,就是 128~255。
與上 0x80,即可滿足循環條件,即:循環、等待。

TCNT0 每us加1,加到差為0,就不滿足循環條件了,延時結束。

實際上,做不到准確的 us 延時。
因為,循環程序的工作、相減、與運算、判別,都要耽誤時間的。
到下一個循環的判別,誰也不知道,是隔了多少時間。
誤差幾十~幾百us,都是可能的。

Ⅲ 請問單片機中的delay()的單位時間是什麼

單片機中的delay()的單位時間不是系統提供的,而是用戶自己編制的。

如果用循環語句實現的循環,沒法計算,但是可以通過軟體模擬看到具體時間,但是一般精精確延時是沒法用循環語句實現的。

如果想精確延時,一般需要用到定時器,延時時間與晶振有關系,單片機系統一般常選用11.059 2 MHz、12 MHz或6 MHz晶振。第一種更容易產生各種標準的波特率,後兩種的一個機器周期分別為1 μs和2 μs,便於精確延時。本程序中假設使用頻率為12 MHz的晶振。

最長的延時時間可達216=65 536 μs。若定時器工作在方式2,則可實現極短時間的精確延時;如使用其他定時方式,則要考慮重裝定時初值的時間(重裝定時器初值佔用2個機器周期)。

(3)單片機定時器延時函數擴展閱讀

單片機C語言程序中延時函數delay的原理是:僅僅執行一些,沒有實質性影響的所謂「無意義指令」,比如做比大小啊,做某個int的自加運算啊之類的。

單片機的有些程序需要調用延時程序,合理的安排循環次數以及空操作的個數方法:用匯編的話就根據你的當前晶振頻率去推算你的指令周期,然後結合需要延遲的時間。

編寫延遲程序,用C的話還是要看最後生成的匯編碼是什麼樣的了。最簡單的方法就是寫好程序以後再編譯器里軟模擬看時間。

單片機C語言延時需注意的問題:

標準的C語言中沒有空語句。但在單片機的C語言編程中,經常需要用幾個空指令產生短延時的效果。這在匯編語言中很容易實現,寫幾個nop就行了。

在keil C51中,直接調用庫函數:

#include // 聲明了void _nop_(void);

_nop_(); // 產生一條NOP指令

作用:對於延時很短的,要求在us級的,採用「_nop_」函數,這個函數相當匯編NOP指令,延時幾微秒。NOP指令為單周期指令,可由晶振頻率算出延時時間,對於12M晶振,延時1uS。對於延時比較長的,要求在大於10us,採用C51中的循環語句來實現。

Ⅳ 怎麼寫段單片機延時函數要用定時器!

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,退出子程序
}
當然這樣定時精度可能需要調整,但思路可以試試。

Ⅳ 單片機怎麼用定時器替代延時函數

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,退出子程序
}
當然這樣定時精度可能需要調整,但思路可以試試。

Ⅵ 如何在不同的單片機中寫延時函數

如果採用12mhz的晶振,一條語句運行一次約為1us,你這個函數延時應該是z
ms,delay(10)就是10
ms,不是很精確。
如果要寫精確的延時函數,就要採用單片機中的定時器,很多單片機的書中都有講到,可以去查相關資料。

Ⅶ 單片機定時器延時計算方法

用延時函數就可以實現;
首先,設置定時器工作方式,也就是TMOD,在設置TH0/1,TL0/1的初值,也就是定時時間的設置,然後設置中斷允許,並開中斷就可以;
參考例子如下:
#include<reg51.h>
void main()
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void timer0() interrupt 1
{
TH0=0X3F;
TL0=0XB0;
}

Ⅷ 單片機延時計算方法

以C51為例,12MHZ晶振的話,1個時鍾周期為1/12微秒,1個機器周期=12個時鍾周期,定時器每個機器周期可延時12*1/12微秒=1微秒。如果晶振為8MHZ的話,定時器每個機器周期可延時12*1/8微秒=1.5微秒

Ⅸ 單片機延時函數原理

就是這個道理,如果一重循環延時時間較短的話,可以用二重循環。但C語言對延時時間不好精確計算,一般只用於對時間要求不嚴的場合。精確延時還是要用定時器。

Ⅹ 單片機延時函數怎麼寫

void DelayMs(unsigned char t)
{

while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}

閱讀全文

與單片機定時器延時函數相關的資料

熱點內容
手機程序加密有什麼作用 瀏覽:178
求黑馬程序員python教程 瀏覽:528
androidmvvm優缺點 瀏覽:894
unix下編譯庫文件 瀏覽:633
程序員的u盤 瀏覽:237
android根據經緯度獲取城市 瀏覽:564
python使用解釋器還是編譯器 瀏覽:358
以下關於有加密演算法及密鑰描述 瀏覽:220
linuxgethostname 瀏覽:416
程序員多數有對象 瀏覽:131
單片機延時程序計算 瀏覽:444
編譯原理語法翻譯 瀏覽:504
pr編譯出錯渲染存在偏移 瀏覽:262
如何製作自家的app 瀏覽:199
推薦一個解壓軟體rar解壓幫手 瀏覽:212
wd文檔加密器 瀏覽:748
伺服器上傳壓縮包一般是什麼格式 瀏覽:333
發送加密文件密碼幾位數 瀏覽:160
樹洞app怎麼樣 瀏覽:175
vivo編譯時間可以改么 瀏覽:150