RYMCU

NO5.跑马灯-NEBULA-VSCODE

devcui 3 年前
# nebula-vscode

所属作品集

1.闪烁 LED 小灯

怎么让 LED 小灯闪烁?我们最先想到的办法当然是先让 LED 小灯点亮,延时一段时间,熄灭 LED 小灯,再延时一段时间,一直循环上面的步骤就能实现 LED 小灯的闪烁了。根据第 3 章的知识我们知道点亮 LED 的语句为“led0
= 0;”,熄灭 LED 的语句为“led0 = 1;”。按照第 3 章介绍我们重新建立一个 LED 小灯闪烁的工程。程序代码设计如下:

#include <STC89xx.h>

// 位声明,将P1-0 管脚声明为LED0
SBIT(LED0, _P1, 0);

void main()
{
    // 计数器声明
    int i;
    while (1)
    {
        // LED0开启
        LED0 = 0x00;
        // 计数器延时(计数5000次达到延时效果)
        for (i = 0; i < 5000; i++)
            ;
        // LED0关闭
        LED0 = 0xFF;
        // 计数器延时(计数5000次达到延时效果)
        for (i = 0; i < 5000; i++)
            ;
    }
}

2.跑马灯

在我们的开发板上设计了 8 个依次排列的 LED 小灯,让小灯依次点亮和熄灭实现跑马灯的效果是我们这一节的主要内容。

8 个 LED 小灯的硬件电路设计原理图如下图所示:

image.png

image.png

如上图所示,8 个 LED 小灯 LED0-LED7 的正极和电源 VCC 之间均串联了一个 1K 的限流电阻。LED7-LED0 的负极与 74HC573 锁存器的 Q0-Q7 一一相连接。锁存器 74HC573 的功能我们这里不详细介绍,把它的 D0-D7 与 Q0-Q7 之间看作是电气上一一联通的。由图所示,锁存器的 D0-D7 和单片机的 P1.7-P1.0 是一一连接的。因此,LED 小灯 LED7-LED0 的负极与单片机的 P1.7-P1.0 管脚一一相连,在单片机程序中通过控制 P1.7~P1.0 管脚的高低电平便可控制 8 个 LED 小灯的亮灭。(以上一堆话的意思是,P1.0-P1.7 和 LED D0-D7 共用 8 个管脚)

该实验要实现的功能为:首先点亮 LED0,然后延迟一段时间,熄灭 LED0,熄灭 LED0 点亮 LED1,延迟一段时间,熄灭 LED1 点亮 LED2,延迟一段时间,一直到熄灭 LED6 点亮 LED7,依照上面的步骤一直循环下去,便实现了一个简单的跑马灯的效果。

image.png

image.png

看图!!!这里第一行,直接对应的是 P1.0-P1.7 八个位,之前我们使用 SBIT(LED0, _P1, 0); 就是从 P1 这一行的 8 位里,取出第 0 位,也就是 0X90,也就是 P1.0。

image.png

所以我们也可以直接操作 P1,直接给 P1 一个数字 0-255 的数字,让 P1 的 8 个位置一下子都有值,就不用挨个赋值了。

2.1 代码

所以控制 8 个灯的代码如下

#include <STC89xx.h>

int i;
int flag = 0;

void main()
{
    while (1)
    {
        P1 = ~(0x01 << flag);
        for (i = 0; i < 5000; i++)
            ;
        if (flag > 8)
        {
            flag = 0;
        }
        else
        {
            flag++;
        }
    }
}

一整段代码的核心 P1 = ~(0x01 << flag);
核心就是给 P1 这个有 8 位的东西赋予一个 8 位的值,使得 P1.0-P1.7 都有 1 或 0 的值。

<< 是移位的意思
0x01 = 0x0000 0001
0x01 << 0 = 0x0000 0001
0x01 << 1 = 0x0000 0010
0x01 << 2 = 0x0000 0100
~是取反的意思,1->0,0->1的意思
~0x01 = ~0x0000 0001 = 0x1111 1110 : 最后一位是P1-0的值,为0所以灯亮了
~0x02 = ~0x0000 0010 = 0x1111 1101 : 倒数第二位是P1-1的值,为0所以灯亮了
~0x03 = ~0x0000 0100 = 0x1111 1011 : 倒数第三为是P1-2的值,为0所以灯亮了

再往下走

if (flag > 8)
        {
            flag = 0;
        }
        else
        {
            flag++;
        }

一共 8 个灯,所以移位就从 0 到 7,注意不是 >= 所以 0-8 是 0,1,2,3,4,5,6,7,通过给 P1 整个赋值,达到每个管脚都赋值的效果。

你学废了没?

所属作品集

后发布评论