51单片机学习笔记,利用定时器的工作方式2实现LED灯闪烁

前言

对于80c51单片机,其内部的定时器可以通过TMOD(M0、M1)控制其工作方式。
其工作方式有如下4种:

方式0(TMOD=0x0):13位定时/计数模式
方式1(TMOD=0x1):16位定时/计数模式
方式2(TMOD=0x2):8位自动重装初值定时/计数模式
方式3(TMOD=0x3):T0定时器分成两个独立的8位的定时器,T1不工作

在之前的一篇博文中已经使用了定时器的工作方式1实现了LED闪烁

在这篇博文将使用定时器的工作方式2来实现LED闪烁

原理图

原理图与上一篇博文一样
晶振电路+80c51单片机+LED电路
原理图

程序

在这里为了方便程序编写,将实现LED亮一秒、灭一秒来让LED闪烁

工作方式2

从前言可知,定时器的工作方式2可以自动重新设置定时器的初始值,即在每次触发中断后不需要手动给定时器赋初始值以让定时器继续工作,而其计时最大值也只有2^8=256。
通过搜索引擎,了解到定时器以工作方式2工作时:

高8位不计数,只存储初始值,低8位计数
在触发中断时(溢出)定时器会自动将高8位(TH)赋给低8位(TL)

因其计时最大值为256为了方便计算,为其赋初始值为0x6,即每次触发中断,计时250微秒,即触发4000次中断为1秒。

基本逻辑

  1. 初始化定时器以工作方式2工作
  2. 赋初始值为0x6
  3. 在中断中判断当前已中断次数
  4. 每满4000次,就对LED所在位取反

代码

该代码在μVision V5.27.1.0调试通过

#include <reg51.h>

#define Count_MAX 4000

unsigned int Count=Count_MAX;
sbit LED_Status=P2^0;

void InitTimer(){
    TMOD=0x02;
    TH0=0x06;
    TL0=0x06;
    EA=1;
    ET0=1;
    TR0=1;
}

void Change_LED_Status() interrupt 1{
    if(Count){
        --Count;
    }
    else{
        Count=Count_MAX;
        LED_Status=~LED_Status;
    }
}

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

结语

相对于使用定时器的工作方式1来实现LED闪烁,使用工作方式2不需要手动重新赋初始值,但后果是计时最大值减少了8位。

Last modification:May 18th, 2020 at 11:00 am