51單片機定時器實現LED閃爍


要啟用一個定時器,先要開啟定時器,然后產生中斷

系統中斷:

 

初始化程序應完成如下工作:

對TMOD賦值,以確定T0和T1的工作方式。

計算初值,並將其寫入TH0、TL0或TH1、TL1。

中斷方式時,則對EA賦值,開放定時器中斷。

使TR0或TR1置位,啟動定時/計數器定時或計數。

 

#include <reg52.h>
/************ 定時器+中斷控制led翻轉 ***********/

sbit LED = P0^0;

typedef unsigned int u16;
typedef unsigned char u8;

void timer_init(){
    TMOD |= 0x01;  //定時器工作方式1,啟用T0定時器, GATE位為0,用TCON的TR0控制T0定時器的啟動

    //設置定時器的初始計數值
    //計算方法
    //假設定時器為1ms,一個機器周期為 1/單片機的晶振頻率  即: 1/12M = 1us
    //而1個機器周期 = 12個時鍾周期 所以: n x 機器周期 = 1ms ===> n x 1us = 1ms
    //所以n = 1000,也就是經過1000個機器周期,定時器要溢出(從0開始計數)
    //所以定時器的初始值為65535 - 1000 + 1 = 64536 ===> 0xFC18
    TH0 = 0xFC;
    TL0 = 0x18;

    EA = 1;  //總中斷開關
    ET0 = 1; //T0中斷
        
    TR0 = 1;//啟動T0定時器
}

void trigger_timer0() interrupt 1{
    static u16 i = 0;
    TH0 = 0xFC;
    TL0 = 0x18;
    i++;
    if( i == 1000 ) { //1秒
        i = 0;
        LED = ~LED;
    }
}

void main(){
    timer_init();
    while( 1 );
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM