闲话:看电视剧看到后半夜,外面除了路灯,黑了很多。电视剧说不上特别好看,但是这种感觉很棒!!!
本篇通过代码实现使用中断的方式来控制 LED 的闪烁,结合上篇文章的理论,以及在之前代码的基础上完成。
0x01:回顾定时器相关中断概念
上篇文章中整理了关于定时器中断的寄存器 IE,即中断允许寄存器。涉及到到关于定时器 0 的话,会使用 IE 寄存器的 EA 位和 ET0 位。
EA 是 CPU 的总中断允许控制位,ET0 是 T0 的溢出中断允许位。
如下图:(手册的 P156 和 P158)
过多的内容不在赘述,在上篇文章中已经都整理过了!
0x02:代码实现
现在来实现用中断的方式控制 LED 和使用延时控制 LED 的方式,中断的方式控制 LED1,延时的方式控制 LED2。中断的方式 LED1 每秒闪烁一次,延时的方式 LED2 每 300 毫秒闪烁一次。
代码如下:
代码语言:javascript复制#include <intrins.h>
#include "reg52.h"
sbit LED2 = P3 ^ 6;
sbit LED1 = P3 ^ 7;
int cnt = 0;
void Time0Init()
{
TMOD = 0x00000001;
TL0 = 0x00;
TH0 = 0xDC;
TR0 = 1;
TF0 = 0;
// 打开定时器0中断
ET0 = 1;
// 打开总中断EA
EA = 1;
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
LED1 = 1;
Time0Init();
while (1)
{
LED2 = 0;
Delay300ms();
LED2 = 1;
Delay300ms();
}
}
void Time0Handler() interrupt 1
{
cnt ;
TL0 = 0x00;
TH0 = 0xDC;
if (cnt == 100)
{
cnt = 0;
LED1 = !LED1;
}
}
在代码中,关键的位置是函数定义处使用了 interrupt 1,它代表了中断号,因为定时器0 使用的是中断1。软件延时同样使用的是 STC-ISP 生成的,看下面的演示。
我是一个程序员,了解 C、PHP、Java、ASM、Python,有 信安、CISP 证书,写小白也能看得懂的文章,感谢关注!!!