独立按键控制LED

1.控制LED亮灭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <REGX52.H>  // 包含51单片机的特殊功能寄存器定义

void main()
{
while(1) // 无限循环
{
if(P3_1==0 || P3_0==0) // 如果P3.1引脚或P3.0引脚的输入为低电平(按键K1或K2被按下)
{
P2_0=0; // 将P2.0引脚的输出设置为低电平(LED1点亮)
}
else
{
P2_0=1; // 将P2.0引脚的输出设置为高电平(LED1熄灭)
}
}
}

详细解释:

  1. 包含头文件#include <REGX52.H> 这一行包含了51单片机的特殊功能寄存器的定义,使得我们可以方便地使用这些寄存器。

  2. 主函数void main() 是程序的主入口点。所有的操作都在这个函数中进行。

  3. 无限循环while(1) 表示进入一个永远不会结束的循环,确保程序一直在运行。

  4. 按键检测if(P3_1==0 || P3_0==0) 检测P3.1和P3.0引脚的电平状态。如果任何一个引脚被按下(低电平,表示按键K1或K2被按下),条件成立。

  5. LED控制

    • 如果按键被按下(条件成立),P2_0=0 将P2.0引脚输出低电平,使得连接在该引脚上的LED1点亮。
    • 如果按键没有被按下(条件不成立),P2_0=1 将P2.0引脚输出高电平,使得LED1熄灭。

简单来说,这段代码实现了按下任意一个按键(K1或K2)时点亮LED1,不按时则熄灭LED1的功能。

2.控制LED状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <REGX52.H>  // 包含51单片机的特殊功能寄存器定义

// 延时函数,参数 xms 指定延时的毫秒数
void Delay(unsigned int xms)
{
unsigned char i, j; // 定义两个 8 位无符号变量 i 和 j
while(xms)
{
i = 2; // 设置 i 的初始值
j = 239; // 设置 j 的初始值
do
{
while (--j); // 内层循环,减少 j 的值,直到 j 变为 0
} while (--i); // 外层循环,减少 i 的值,直到 i 变为 0
xms--; // 每次循环结束后,减少 xms 的值
}
}

void main()
{
while(1) // 无限循环
{
if(P3_1==0) // 如果P3.1引脚的输入为低电平(K1按键被按下)
{
Delay(20); // 延时 20 毫秒以消除按键抖动
while(P3_1==0); // 等待按键释放
Delay(20); // 再次延时 20 毫秒以消除按键抖动

P2_0 = ~P2_0; // 反转 P2.0 引脚的状态(LED1 取反)
}
}
}

详细解释:

  1. 包含头文件#include <REGX52.H> 这一行包含了51单片机的特殊功能寄存器的定义,使得我们可以方便地使用这些寄存器。

  2. 延时函数

    • void Delay(unsigned int xms) 定义了一个延时函数,参数 xms 指定延时的毫秒数。
    • 函数内部使用嵌套循环来实现延时,通过递减变量 ij 的值来控制延时时间。
  3. 主函数void main() 是程序的主入口点。所有的操作都在这个函数中进行。

  4. 无限循环while(1) 表示进入一个永远不会结束的循环,确保程序一直在运行。

  5. 按键检测和消抖

    • if(P3_1==0) 检测 P3.1 引脚的电平状态。如果该引脚为低电平(按键 K1 被按下),条件成立。
    • Delay(20) 延时 20 毫秒以消除按键抖动。
    • while(P3_1==0) 等待按键释放,即 P3.1 引脚恢复为高电平。
    • 再次 Delay(20) 延时 20 毫秒以确保消除按键抖动。
  6. LED 控制

    • P2_0 = ~P2_0 反转 P2.0 引脚的状态。如果 P2.0 原本为高电平,执行此操作后将变为低电平;如果原本为低电平,将变为高电平。这样实现了 LED1 的取反(如果 LED1 原本点亮,则熄灭;原本熄灭,则点亮)。

这段代码的功能是检测按键 K1 的状态,并在按键按下时反转 LED1 的状态,同时通过延时函数实现按键消抖。

3.LED显示二进制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <REGX52.H>  // 包含51单片机的特殊功能寄存器定义

// 延时函数,参数 xms 指定延时的毫秒数
void Delay(unsigned int xms)
{
unsigned char i, j; // 定义两个8位无符号变量 i 和 j
while(xms--) // 当 xms 不为0时,循环执行
{
i = 2; // 设置 i 的初始值
j = 239; // 设置 j 的初始值
do
{
while (--j); // 内层循环,减少 j 的值,直到 j 变为0
} while (--i); // 外层循环,减少 i 的值,直到 i 变为0
}
}

void main()
{
unsigned char LEDNum=0; // 定义并初始化一个变量,用于记录 LED 状态
while(1) // 无限循环
{
if(P3_1==0) // 如果 P3.1 引脚的输入为低电平(K1 按键被按下)
{
Delay(20); // 延时 20 毫秒以消除按键抖动
while(P3_1==0); // 等待按键释放,即 P3.1 引脚恢复为高电平
Delay(20); // 再次延时 20 毫秒以确保消除按键抖动

LEDNum++; // 变量自增
P2 = ~LEDNum; // 变量取反输出给 LED(即将 LEDNum 的二进制取反后赋值给 P2 端口)
}
}
}

详细解释:

  1. 包含头文件#include <REGX52.H> 这一行包含了51单片机的特殊功能寄存器的定义,使得我们可以方便地使用这些寄存器。

  2. 延时函数

    • void Delay(unsigned int xms) 定义了一个延时函数,参数 xms 指定延时的毫秒数。
    • 函数内部使用嵌套循环来实现延时,通过递减变量 ij 的值来控制延时时间。
  3. 主函数void main() 是程序的主入口点。所有的操作都在这个函数中进行。

  4. 无限循环while(1) 表示进入一个永远不会结束的循环,确保程序一直在运行。

  5. 按键检测和消抖

    • if(P3_1==0) 检测 P3.1 引脚的电平状态。如果该引脚为低电平(按键 K1 被按下),条件成立。
    • Delay(20) 延时 20 毫秒以消除按键抖动。
    • while(P3_1==0) 等待按键释放,即 P3.1 引脚恢复为高电平。
    • 再次 Delay(20) 延时 20 毫秒以确保消除按键抖动。
  6. LED 控制

    • LEDNum++ 变量自增。每按下一次按键,LEDNum 的值增加1。
    • P2 = ~LEDNum 将变量 LEDNum 取反后输出给 P2 端口。这样,LED 的状态就会根据 LEDNum 的变化而变化。

这段代码的功能是每次按下按键 K1,LED 状态就会发生变化,通过自增和取反实现不同的输出状态。

4.控制LED移位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <REGX52.H>  // 包含51单片机的特殊功能寄存器定义

// 延时函数,参数 xms 指定延时的毫秒数
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--) // 当 xms 不为0时,循环执行
{
i = 2; // 设置 i 的初始值
j = 239; // 设置 j 的初始值
do
{
while (--j); // 内层循环,减少 j 的值,直到 j 变为0
} while (--i); // 外层循环,减少 i 的值,直到 i 变为0
}
}

unsigned char LEDNum; // 定义全局变量 LEDNum

void main()
{
P2 = ~0x01; // 上电默认 LED1 点亮(P2 端口第0位输出低电平)
while(1) // 无限循环
{
if(P3_1 == 0) // 如果 P3.1 引脚的输入为低电平(K1 按键被按下)
{
Delay(20); // 延时 20 毫秒以消除按键抖动
while(P3_1 == 0); // 等待按键释放
Delay(20); // 再次延时 20 毫秒以确保消除按键抖动

LEDNum++; // LEDNum 自增
if(LEDNum >= 8) // 限制 LEDNum 自增范围在 0 到 7
LEDNum = 0;
P2 = ~(0x01 << LEDNum); // 点亮第 LEDNum 个 LED
}
if(P3_0 == 0) // 如果 P3.0 引脚的输入为低电平(K2 按键被按下)
{
Delay(20); // 延时 20 毫秒以消除按键抖动
while(P3_0 == 0); // 等待按键释放
Delay(20); // 再次延时 20 毫秒以确保消除按键抖动

if(LEDNum == 0) // 如果 LEDNum 为 0,将其设为 7
LEDNum = 7;
else // 否则 LEDNum 自减
LEDNum--;
P2 = ~(0x01 << LEDNum); // 点亮第 LEDNum 个 LED
}
}
}

详细解释:

  1. 包含头文件#include <REGX52.H> 这一行包含了51单片机的特殊功能寄存器的定义,使得我们可以方便地使用这些寄存器。

  2. 延时函数

    • void Delay(unsigned int xms) 定义了一个延时函数,参数 xms 指定延时的毫秒数。
    • 函数内部使用嵌套循环来实现延时,通过递减变量 ij 的值来控制延时时间。
  3. 主函数void main() 是程序的主入口点。所有的操作都在这个函数中进行。

  4. **全局变量 LEDNum**:unsigned char LEDNum 用于记录当前点亮的 LED 编号。

  5. 初始化P2 = ~0x01 设置 P2 端口的第0位为低电平,默认上电时点亮第一个 LED。

  6. 无限循环while(1) 表示进入一个永远不会结束的循环,确保程序一直在运行。

  7. 按键 K1 的检测和处理

    • if(P3_1 == 0) 检测 P3.1 引脚的电平状态。如果该引脚为低电平(按键 K1 被按下),条件成立。
    • Delay(20) 延时 20 毫秒以消除按键抖动。
    • while(P3_1 == 0) 等待按键释放,即 P3.1 引脚恢复为高电平。
    • 再次 Delay(20) 延时 20 毫秒以确保消除按键抖动。
    • LEDNum++ 变量自增。如果 LEDNum 达到8,则重置为0。
    • P2 = ~(0x01 << LEDNum) 根据 LEDNum 计算出需要点亮的 LED 并更新 P2 端口。
  8. 按键 K2 的检测和处理

    • if(P3_0 == 0) 检测 P3.0 引脚的电平状态。如果该引脚为低电平(按键 K2 被按下),条件成立。
    • Delay(20) 延时 20 毫秒以消除按键抖动。
    • while(P3_0 == 0) 等待按键释放,即 P3.0 引脚恢复为高电平。
    • 再次 Delay(20) 延时 20 毫秒以确保消除按键抖动。
    • if(LEDNum == 0) 如果 LEDNum 为0,则设置为7。
    • else 否则 LEDNum 自减。
    • P2 = ~(0x01 << LEDNum) 根据 LEDNum 计算出需要点亮的 LED 并更新 P2 端口。

这段代码的功能是通过按键 K1 和 K2 控制 LED 灯的点亮顺序:按下 K1 后,LED 顺次点亮;按下 K2 后,LED 逆序点亮。