當用"delay.h"這個頭文件進行軟件延時時,在延時時,CPU時間被佔用,無法進行其他任務,導致系統效率低下,因此軟件延時只適用於短暫延時,因此引出了定時器。
單片機中有多個小鬧鐘,可以幫助我們實現延時,這些小鬧鐘就是“定時器。每個定時/計數器既可以實現定時功能,也可以實現計數功能。可以工作在4種定時器模式下。
定時/計數器
51單片機有T0和T1兩個定時器,定時器0有四種工作方式:方式0:13位定時 /計數器模式方式1:16位定時 /計數器模式方式2:8位可重裝載定時 /計數器模式方式3:兩個單獨8位定時 /計數器模式定時器1只有三種方式,同上面三種。
實現定時功能,除了使用單片機內部的定時/計數器,還可有以下三種方法:
①使用軟件定時 優點:可隨意修改定時時間,一次編寫,多次調用 缺點佔用CPU時間,降低CPU的利用率。
②時基電路 優點:使用方便,缺點:硬件電路連接好之後,定時時間不好改變。利用時間計算電阻和電容的值,延時可能會出現誤差
③可編程芯片定時:優點:定時準確,可修改時間,使用靈活,可與單片機擴展連接。缺點:電路連接較不方便。
定時/計數器0的工作原理
在定時方式1下,定時/計數器0的核心是一個16位寬的由計數脈衝觸發的按遞增規律( 即累加方式)工作的循環累加計數器(TH0+TL0) 。從預先設定的初始值開始,每來一個計數脈衝就加1,當加到計數器爲全1時,再輸入一個脈衝,就會發生溢出現象,計數器回零,同時產生溢出中斷請求信號(TF0置1) 。如果定時/計數器工作於定時模式,則表示定時時間已到。
定時/計數器的實質是加1計數器,由高8位和低8位兩個寄存器構成。TMOD是定時/計數器的工作方式寄存器。TCON是控制寄存器。
控制寄存器
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字節地址:88H | TF1 | TR1 | TF0 | TR0 | TCON |
定時器操作步驟
①選擇工作步驟
②選擇控制方式
③選擇定時器模式
④定時器賦初值
⑤開中斷
⑥開總中斷
⑦開定時器
初值計算
定時時間T=(2的N次方-X)12/單片機晶振頻率
X:定時時間
方式0時,N=13
方式1時,N=16
方式2時,N=8
具體實現代碼與電路
代碼
//定時器,led閃爍,
#include<reg51.h>
sbit led=P1^0;
void time();
void main()
{
led=1;
time();
while(1);
}
void time() //定時器設置
{
TMOD=0x10; // 定時器0,工作方式1
TH0=0x00;
TL0=0x00;
EA=1; //開總中斷
ET0=1; //開定時器中斷
TR0=1; //啓動定時器
}
void timer()interrupt 1
{
TH0=0x00;
TL0=0x00;
led=~led;
}
電路
優化閃爍週期定時500ms
//led閃爍500ms
#include<reg51.h>
sbit led=P1^0;
int i=0;
void time();
void main()
{
led=1;
time();
while(1)
{
if(i==10)
{
led=~led;
i=0;
}
}
}
void time()
{
TMOD=0x10;
TH0=0x4c; //50ms
TL0=0x00;
EA=1;
ET1=1;
TR1=1;
}
void timer()interrupt 3
{
TH0=0x4c;
TL0=0x00;
i++;
}