51单片机学习笔记,利用定时器实现LED灯闪烁

前言

LED灯闪烁实际上就是LED交替的亮与灭,但是要注意,如果亮或者灭的时间过短,这该状态是无法被人的肉眼所察觉的,在仿真软件上也一样,所以只要合理控制LED亮灭的时间就可以实现LED定时闪烁。

原理图

晶振电路+80c51单片机+LED电路
原理图

程序

在这里实现每间隔1秒,LED灯亮0.1秒,LED以该规律闪烁,要比较精确的控制时间需要使用定时器

定时器

对于80c51单片机

拥有两个16位的可编程定时器
每个定时器由两个专用的8位寄存器(TH0、TL0、TH1、TL1)组成
可以通过TMOD(M0、M1)控制其工作方式(四种工作方式)
在计数溢出时触发中断

相关链接
80C51单片机的定时器/计数器的作用与结构
80C51单片机定时器/计数器详解(含工作方式)

基本逻辑

  1. 使用定时器设置初始值为65536-50000,即每0.05秒触发一次中断
  2. LED灯灭1秒,即中断触发20次,LED灭
  3. LED灯亮0.1秒,即中断触发2次,LED亮

代码

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

#include <reg51.h>

#define H_MAX 19
#define L_MAX 1

unsigned char H_Count=0;
unsigned char L_Count=0;

//Deley 0.05s
void Deley(){
    TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  EA=1;
  ET0=1;
  TR0=1;
}

void Stop() interrupt 1{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
    
    if(H_Count==H_MAX){
        if(L_Count==L_MAX){
            H_Count=0;
            L_Count=0;
        }else{
            ++L_Count;
            P2=0x1;
        }
    }else{
        ++H_Count;
        P2=0x0;
    }
}

void main(){
    P2=0x0;
    Deley();
    while(1);
}

结语

只要熟悉定时器基本上很容易写出来,不过这个定时也只是相对比较精确,真正的亮灭时间要更长一点。

Last modification:May 18th, 2020 at 10:59 am