一、LED简介
LED 即发光二极管。它具有单向导电性,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般控制在 3 mA-20mA之间。发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极。直插式发光二极管长脚为阳极,短脚为阴极。
图中 LED 采用共阳接法,即LED 阳极管脚接电源 VCC,阴极管脚通过一个 470 欧的限流电阻接到 P2 口上。要让 LED 发光即对应的阴极管脚应该为低电平,若为高电平则熄灭。如果要想 51 单片机控制 LED,就必须通过单片机管脚在 P2 口上输出低电平。
二、流水灯程序
1、移位函数
_crol_()
和 _cror_()
函数不是标准 C 语言中的移位函数,而是针对 Keil C51 软件的特定扩展函数。这些函数在 Keil C51 软件中被用于进行循环左移和循环右移操作。循环移位操作是一种特殊的位移操作,在移位过程中将被移出的位重新循环到另一侧。
具体来说,crol() 函数用于执行循环左移操作,而 cror() 函数用于执行循环右移操作。
以下是这两个函数的基本使用示例:
** crol() 函数示例:**
#include <intrins.h>
unsigned char myByte = 0xAA; // 10101010 in binary
void main() {
myByte = _crol_(myByte, 2); // Perform circular left shift by 2 bits
// Now myByte will be 01010101 in binary
while (1) {
// Your code here
}
}
** cror() 函数示例:**
#include <intrins.h>
unsigned char myByte = 0x55; // 01010101 in binary
void main() {
myByte = _cror_(myByte, 3); // Perform circular right shift by 3 bits
// Now myByte will be 10101010 in binary
while (1) {
// Your code here
}
}
注意,这些函数是 Keil C51 软件的扩展函数,因此在使用之前,请确保您的项目配置正确,并包含了相应的头文件( #include <intrins.h>
)。
2、延时函数
延时函数用于在程序执行过程中产生一段延时时间,以控制流水灯的移动速度或其他需要等待的情况。在嵌入式系统中,由于硬件的不同,延时函数的实现方式也可能有所不同。在这里,我们使用的是一个简单的循环来实现延时。
void delay(unsigned int ten_us) {
while (ten_us--);
}
void:函数的返回类型,表示该函数没有返回值。
delay:函数的名称,可以根据需要自行命名。
(unsigned int ten_us):这是函数的参数列表,表示函数接受一个无符号整数作为参数。参数 ten_us 表示延时的微秒数,即十微秒。
{ ... }:函数的主体,包含要执行的代码。
函数的主体中使用了 while 循环来实现延时。循环的条件是 ten_us--,即将传入的 ten_us 参数递减,**直到变为零**。由于是一个简单的循环,每次循环都会消耗一定的时间,从而可以通过次数的累加实现延时。
这种延时函数的实现方式是非常基础的,也相对不精确,因为它不考虑处理器的工作速度和优化等因素。
3、流水灯程序代码
以共阳极为例,在8个灯中,让某一个灯点亮就是让这个LED灯为低电平。从左到右依次为01111111、10111111、11011111、11101111、11110111、11111011、11111101、11111110。其中1就是高电平、0位低电平,为低电平时LED点亮。具体程序代码如下:
#include <REGX52.H>
#include <intrins.h>
#define LED P2
void delay(unsigned int ten_us) {
while (ten_us--);
}
void main() {
unsigned char ledPattern = 0xFE; // 初始位模式,最右边的 LED 亮
int i; // 声明循环计数变量 i
delay(20000); // 初始延迟
while (1) {
// 循环左移实现流水灯向左移动
for (i = 0; i < 7; i++) {
ledPattern = _crol_(ledPattern, 1); // 循环左移一位,模拟流水向左移动
LED = ledPattern; // 更新 LED 状态,显示新的流水灯图案
delay(20000); // 延迟一段时间,控制流水灯移动速度
}
// 循环右移实现流水灯向右移动
for (i = 0; i < 7; i++) {
ledPattern = _cror_(ledPattern, 1); // 循环右移一位,模拟流水向右移动
LED = ledPattern; // 更新 LED 状态,显示新的流水灯图案
delay(20000); // 延迟一段时间,控制流水灯移动速度
}
}
}
注意,在 Keil C51 软件中,C语言标准并不支持在循环内部声明变量,因此不能在 for 循环的初始化部分中声明变量 i。为了解决这个问题,可以在函数的开头声明 i 变量,然后在循环中使用它。此外,程序中对P2进行了定义(#define LED P2
),此句话意思为将P2口整体定义为LED,增加了程序的可读性。
三、流水灯的实现步骤
在 Keil C51 中,从代码编写完成到烧录 51 单片机实现流水灯的步骤如下:
-
创建新项目:
打开 Keil C51 软件,点击 “Project” 菜单,选择 “New µVision Project”。然后选择项目的保存位置和名称,点击 “Save”。 -
添加源文件:
在 “Project” 窗口中,右键点击 “Source Group 1”(或其他源代码组),选择 “Add New Item to Group ‘Source Group 1’”。选择您的源文件(例如runningled.c
),然后点击 “Add”。 -
编写源代码:
编写您的源代码文件,包括流水灯控制逻辑和延时函数等。 -
配置目标设备:
在 “Project” 窗口中,右键点击 “Target 1”(或其他目标设备),选择 “Options for Target ‘Target 1’”。在 “Target” 选项卡中,选择适合您的目标单片机型号和相关设置。 -
编译代码:
点击 “Project” 菜单,选择 “Build Target”,或者直接点击工具栏上的 “Build” 图标。这将会编译您的代码并生成目标文件。 -
连接代码:
如果编译无错误,会在 “Output” 窗口中显示 “0 Error(s), 0 Warning(s)”。接下来,点击 “Project” 菜单,选择 “Rebuild Target”,或者直接点击工具栏上的 “Rebuild” 图标。这将会链接目标文件并生成最终的可执行文件(.hex
文件)。 -
烧录到单片机:
使用合适的烧录工具(STC-ISP、PZ-ISP等),将生成的.hex
文件烧录到目标单片机中。具体的烧录步骤可能因不同的烧录工具而异,通常需要将单片机连接到计算机,选择正确的端口和单片机型号,然后点击烧录按钮。 -
运行程序:
成功烧录后,您的程序将会在单片机上运行。观察单片机上的 LED,应该会看到流水灯效果。
注意,上述步骤可能会因具体的单片机型号、烧录工具和操作系统而有所不同。
四、小结
这是一篇无开发基础的单片机新人作的学习记录。文中介绍了实现流水灯的众多控制方法中的一种——移位函数法,可供借鉴学习,若有不足,欢迎指出问题,谢谢。