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

單片機定時器延時

發布時間:2022-12-14 23:26:09

A. 如何用單片機的delay實現延時

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

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

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

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

(1)單片機定時器延時擴展閱讀

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

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

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

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

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

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

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

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

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

B. 51單片機用定時器查新的方法編寫一秒的延時程序,fosc=12MHZ

一、用定時器中斷,50ms中斷的1 次,20次就是1秒
#include <REG51.H>
#define uchar unsigned char
sbit LED =P1^1; //接一LED,1 秒鍾亮或滅一次
uchar time;
void init_t0int()
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init_t0int();
while(1);
}

void t0int() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
time++;
if(time==20)
{
time=0;
LED=~LED;
}
}

二、用循環延時可能程序更簡單一點,但沒實際意義 。單片機在這1 秒內只能循環而不能做其它事。
#include<reg51.h>
sbit LED=P1^0;
void delay_ms(unsigned char ms)
{
unsigned char i;
while(ms--)
for(i=0;i<123;i++);
}
void main()
{
while(1)
{
delay_ms(1000);
LED=~P1^0; //P1.0接一LED,可看到LED每1S亮或滅一次
}
}
參考資料: LED

C. 單片機定時器延時計算方法

用延時函數就可以實現;
首先,設置定時器工作方式,也就是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;
}

D. 51單片機軟體延時和定時器的區別

區別就是用單片機軟體定時,CPU循環執行一小段延時程序,浪費CPU的精力,用定時器定時,CPU就可以干別的。

如果是程序延時的話,時間消耗在(延時程序+剩下的代碼);計時器中斷則相當於把延時程序交給定時器,此時CPU可以干別的事情,提高了效率。就類似於電腦打游戲時把圖形處理任務交給顯卡,CPU的壓力就小。

單片機進中斷後執行中斷里的程序,比如你進定時中斷,執行完後退出中斷後做其他事,但定時還在計數,這樣計數和做其他事情兩不誤。

你的程序中本來就沒做其他事情,你的LED移動就是等待中斷計數到10才操作的,LED動作的先決條件就是中斷計數結束。

(4)單片機定時器延時擴展閱讀

1、軟體循環延時:採用循環語句,如for,while等,進行長時間的空操作,或者空語句。


優點:程序理解簡易,入手快,新手必備武器。


缺點:時間精度不高,且佔用單片機大量時間資源,引發其它子函數的不流暢(卡滯、遲鈍),導致系統實時反應能力下降。


2、定時延時:採用定時器定時,如T0,T1;


優點:時間精度高,提高系統程序執行的高效性,不影響子函數的正常運行。

缺點:需佔用1個定時器資源(可以復用),需良好程序構架支持,入手難。


個人建議:一旦學會定時器,就不應該再使用「循環延時」函數,採用定時器才是正道。如果對延時精度要求不高,建議使用結構體組成多個延時體。

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

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

F. 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計時器
}

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

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

H. 解釋一下51單片機定時器延時的查詢法和中斷法各是什麼

就好像你在燒一壺開水,查詢法就是你不停的去查看水開了沒有,中斷法就是等水開了,水壺就會鳴笛,這時你去關火倒水。其中水壺鳴笛就是觸發中斷的,而你去關火倒水算是一個中斷服務。很明顯,相比查詢的方法中斷可以極大提高程序的效率,你不必一直不停的查看水開了沒有而專注於其他的事情,只需到水響之後去關火倒水即可。

I. 用定時器1的工作方式2實現延時1s的程序是什麼(單片機)

用定時器1的工作方式2實現延時1s 不好,方式2最大隻能定時256us,中斷太頻繁了.
主程序中:
uint a=0;
TMOD=0X20;
TH1=256-200;//定時200us
TL1=256-200;
ET1=1;
EA=1;
TR1=1;
中斷程序里:
a++;
if(a ==5000)
{
a=0;
其它操作
}

J. 單片機定時器做精確延時問題

定時器溢出好像和cy沒有關系吧。我記得cy是程序狀態字寄存器(psw),是執行算術運算和邏輯運算時判斷第7位是否進位的一個標志位。所以cy不會變1.
定時器控制寄存器是tcon,tf0屬於tcon,用於計數溢出的標志位。

閱讀全文

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

熱點內容
伊克塞爾文檔怎麼進行加密 瀏覽:884
app轉賬是什麼 瀏覽:157
php的基本語法 瀏覽:790
對外漢語pdf 瀏覽:516
如何用mamp本地web伺服器 瀏覽:869
如何加密自己js代碼 瀏覽:627
排列組合a與c的演算法 瀏覽:534
如何在文件夾中找到同名內容 瀏覽:786
有什麼app文字轉韓文配音 瀏覽:372
循環宏1命令 瀏覽:35
斐波那契數列矩陣演算法 瀏覽:674
公式保護後加密不了 瀏覽:82
java跳轉到jsp 瀏覽:819
327平方根演算法 瀏覽:216
win7美化命令行終端 瀏覽:797
免加密狗圖片 瀏覽:485
一隻透明的鳥是什麼app 瀏覽:817
空氣壓縮機油批發商 瀏覽:69
linuxifexist 瀏覽:4
加密tf卡拷入文件 瀏覽:399