51單片機定時器使用
阿新 • • 發佈:2018-05-19
lock 生成 思路 計算 任務 count 子程序 alt 單片機
51單片機定時器
考試考完了,閑得無聊,正好手頭有一塊51學習板,搗鼓一下。控制任務如下:
P1.0 控制一個LED燈,亮0.5s,滅0.5s。
設計思路:這裏我們只用定時器,不用軟延時。51的定時器最多定時60ms,所以我們設置定時器每
50ms中斷一次,通過在中斷程序設置一個變量來統計中斷次數,從而實現較長時間的定時。這裏我們
是每500ms執行一次燈亮燈滅的動作,所以每10個中斷等於500ms(50ms x 10)。第6行,全局變量
timer50msCount 就是中斷次數。第19-23行,當timer50msCount 為10時,代表500ms時間到,把
P1.0 取反,動作一次。
這裏有個繁瑣的地方,定時器的初值需要手工計算。不過前人開發了一下小程序,直接拿過來用就可以了。
見下圖。把自動生成代碼中的第一行刪掉就可以了。
下面是程序。
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit P10 = P1 ^ 0;
// 第 6 行
uchar timer50msCount = 0;
void Timer0Init(void);
void main()
{
EA = 1; // 開總中斷
ET0 = 1; // 開定時器 0 中斷
Timer0Init();
while (1)
{
// 每500ms允許if語句塊中的程序
// 19 - 23 行
if (timer50msCount == 10)
{
timer50msCount = 0;
P10 = ~P10;
}
}
}
void Timer0Init(void) //[email protected]
{
TMOD &= 0xF0; // 設置定時器模式,這裏為T0
TMOD |= 0x01; // 設置定時器工作方式1,為16為定時器
TL0 = 0x00; // 設置定時器低位初值
TH0 = 0x4C; // 設置定時器高位初值
TF0 = 0; // 清楚TF0溢出標誌位
TR0 = 1 ; // 啟動定時器0開始計時
}
// 定時器0中斷子程序
void timer0Interrupt() interrupt 1
{
timer50msCount++;
// 每次中斷時,定時器初值為0,需重新設置定時器初值,保持50ms
// 時間不變
TL0 = 0x00;
TH0 = 0x4C;
}
51單片機定時器使用