前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C51 单片机开发中断方式控制 LED

C51 单片机开发中断方式控制 LED

作者头像
码农UP2U
发布2024-06-21 12:57:25
3180
发布2024-06-21 12:57:25
举报
文章被收录于专栏:嵌入式码农UP2U

闲话:看电视剧看到后半夜,外面除了路灯,黑了很多。电视剧说不上特别好看,但是这种感觉很棒!!!

本篇通过代码实现使用中断的方式来控制 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 证书,写小白也能看得懂的文章,感谢关注!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农UP2U 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01:回顾定时器相关中断概念
  • 0x02:代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档