前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C51单片机开发让 LED 闪起来

C51单片机开发让 LED 闪起来

作者头像
码农UP2U
发布2024-03-25 17:14:37
850
发布2024-03-25 17:14:37
举报
文章被收录于专栏:码农UP2U码农UP2U

0x01:LED 闪烁的思路

上篇文章中我们知道,LED1 灯对应的是 P3.7 口。想要让 LED1 亮起来,那么给 P3.7 口送一个低电平,想要让 LED1 灭掉,那么就给 P3.7 口一个高电平。那么我们交替地给 P3.7 口低电平和高电平,是否可以让 LED1 闪烁呢?直接说结果,是不可以的。因为单片机的运算速度很快,虽然交替的给 P3.7 口低电平和高电平,但是给我们人的视觉上来看,LED1 是持续常亮的。

因此,在低电平和高电平之间应该有一个时间间隔,这个时间间隔至少要让我们的眼睛能够感觉到变化!

那么,大体的思路是这样的,给 P3.7 口一个低电平,然后间隔若干秒,给 P3.7 口一个高电平,然后间隔若干秒,再给 P3.7 口一个低电平,然后再间隔若干秒……如此循环反复即可!

0x02:时间间隔

对于单片机而言,所谓的时间间隔就是让单片机的 CPU 空转一会儿,就是什么都不做,因为 CPU 无法停止,因此就是让 CPU 去空转一会儿,这样就产生了一个时间的间隔。所谓的空转,其实就象当于是执行一些无用的指令,类似汇编中的 nop 指令。

但是,又有一个问题,我们让 CPU 执行多少条无用指令呢?这也是一个问题,因为 CPU 的频率不同,相同条数的指令,在不同频率的 CPU 上执行的时间是不同的。所以,这个指令的估算是要根据具体的单片机来估算的。

不过好在,可以通过 STC-ISP 这个软件帮我们生成一段代码。

上面就生成了一段延迟代码,可以看到里面是 do……while 这样的循环,而其中又没有什么指令,这就相当于 CPU 在空转,一直转圈圈!注意,选择时,8051 指令处选择 STC-Y1。看右侧,STC-Y1 适用于 STC89C 系列。

0x03:代码实现

新建一个 Keil 的工程,如果不知道如何创建工程,可以参考前面的文章:C51 单片机开发用 Keil 创建工程

完成如下的代码:

代码语言:javascript
复制
#include "reg52.h"

sbit led1 = P3 ^ 7;

void Delay500ms()    //@11.0592MHz
{
  unsigned char i, j, k;

  // _nop_();
  i = 4;
  j = 129;
  k = 119;
  do
  {
    do
    {
      while (--k);
    } while (--j);
  } while (--i);
}

void main()
{
    while (1)
    {
        led1 = 0;
        Delay500ms();
        led1 = 1;
        Delay500ms();
    }
}

在上面的代码中,Delay500ms() 函数是 STC-ISP 生成的(注意,我注释掉了 _nop_() 这个函数调用),下面的 main() 函数是我们完成的,代码很简单,在一个死循环中交替地给 P3.7 口低电平和高电平,低电平和高电平之间有 500 毫秒的时间间隔(延迟)。

编译生成一个 hex 文件,然后用 STC-ISP 写入单片机。如果不熟悉如何将 hex 文件写入单片机,请参考以前的文章:C51 单片机开发将 Keil 生成的文件写入单片机

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档