1. 程式人生 > >51單片機定時器使用

51單片機定時器使用

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單片機定時器使用