Ⅰ 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);
}
}