前言
LED小灯闪烁实质是控制单片机上的I/O口,通过向I/O口循环输入高低电平,从而控制LED小灯的亮灭。但由于单片机的机器周期一般为12/11059200 s,而人眼一般不能识别这种快速转换,因此我们还需要利用定时器实现延时,降低到人眼可识别的闪烁效果,从而实现LED灯闪烁,这就是LED小灯闪烁的基本原理。
实际操作
程序功能
我们需要实现的功能的就是让LED小灯1 s闪烁一次,并且数码管依次显示数字,闪烁10次后打开蜂鸣器报警
在这里面我们主要要用到P1口、定时器0和外部中断1,整体的实现架构如下
实现思路
单片机开发板上的小灯接入了C51上的P1口,因此需要对P1口进行控制,可利用16进制数实现8个LED小灯的控制,此处为了简便,直接实现全亮和全灭,全亮对应16进制为0xFF,对其进行取反即为全灭,循环该过程则实现LED小灯的闪烁。
由于人眼的暂留效果,我们还需要采用定时器对其进行延迟,定时器能定时的最大机器周期为65536,约为71ms,虽然可能能够让我们看到LED闪烁,但是LED闪烁太快,因此我们需要使用多次循环进行扩展。此处为便于计算,选取定时器定时事件为50ms,对应机器周期为46080,因此定时器初值应为19456,对应十六进制为0x4BFD。
基于上述数据,采用函数来封装定时器初始化过程,定时器初始化主要分为三个步骤:
1、定时器工作模式的设置,设置其工作模式为第二种方式,即TMOD=0x01;
2、定时器初始值的设置,设置TH0=0x4B,TL0=0xFD
3、打开定时器,设定TR0=1
由此完成定时器0的设定,在对其进行循环20次,然后再实现对P1口取反,即可实现LED小灯1s闪烁一次,此处需要注意,由于没有使用内部中断T0,因此在定时器溢出后用软件将TF0置0,然后重新设定初值
实现上述功能后,本来任务应该完成了,但是我想着使用一下中断来熟悉一下,因此采用了外部中断1来实现另一个功能:10次闪烁后实现蜂鸣器报警。
实现外部中断的套路和实现定时器的套路差不多:
1、打开中断总开关EA
2、打开外部中断开关EX1
3、设定触发方式,此处设为下降沿触发方式,即IT1=1
由此完成外部中断1的设置,然后在设定外部中断1的服务程序,即满足触发条件后需进入中断执行服务程序,即打开蜂鸣器,循环一次后再关闭(或者可以实现延时一段时间后关闭),此处需要注意的是,在单片机开发板上需要连接P37口与P33口,然后在P3^7口产生一个下降沿来触发中断。
我在里面还加上了一个数码管显示函数,实现方式基本差不多,但是需要你去了解一下数码管的显示原理,此处不再详细说了,之后有时间再开一篇博客来谈谈电路问题
程序源码
#include<reg52.h>
sbit DU = P2^6;//段选锁存器
sbit WE = P2^7;//位选锁存器
sbit beep = P2^3;//蜂鸣器
sbit flag = P3^7;//产生下降沿控制进入中断
//数码管位置地址 加code存放在R0M区,在执行过程中不会被更改
code unsigned char location[