【利用移位函数在51单片机上实现流水灯】

本文详细讲解了如何在51单片机上利用移位函数(_crol_和_cror_)以及延时函数实现流水灯效果,包括LED基础知识、程序设计步骤和代码实例,适用于初学者理解单片机编程实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、LED简介

在这里插入图片描述
LED 即发光二极管。它具有单向导电性,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般控制在 3 mA-20mA之间。发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极。直插式发光二极管长脚为阳极,短脚为阴极。
开发板上LED模块电路 图中 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 单片机实现流水灯的步骤如下:

  1. 创建新项目
    打开 Keil C51 软件,点击 “Project” 菜单,选择 “New µVision Project”。然后选择项目的保存位置和名称,点击 “Save”。

  2. 添加源文件
    在 “Project” 窗口中,右键点击 “Source Group 1”(或其他源代码组),选择 “Add New Item to Group ‘Source Group 1’”。选择您的源文件(例如 runningled.c),然后点击 “Add”。

  3. 编写源代码
    编写您的源代码文件,包括流水灯控制逻辑和延时函数等。

  4. 配置目标设备
    在 “Project” 窗口中,右键点击 “Target 1”(或其他目标设备),选择 “Options for Target ‘Target 1’”。在 “Target” 选项卡中,选择适合您的目标单片机型号和相关设置。

  5. 编译代码
    点击 “Project” 菜单,选择 “Build Target”,或者直接点击工具栏上的 “Build” 图标。这将会编译您的代码并生成目标文件。

  6. 连接代码
    如果编译无错误,会在 “Output” 窗口中显示 “0 Error(s), 0 Warning(s)”。接下来,点击 “Project” 菜单,选择 “Rebuild Target”,或者直接点击工具栏上的 “Rebuild” 图标。这将会链接目标文件并生成最终的可执行文件(.hex 文件)。

  7. 烧录到单片机
    使用合适的烧录工具(STC-ISP、PZ-ISP等),将生成的 .hex 文件烧录到目标单片机中。具体的烧录步骤可能因不同的烧录工具而异,通常需要将单片机连接到计算机,选择正确的端口和单片机型号,然后点击烧录按钮。

  8. 运行程序
    成功烧录后,您的程序将会在单片机上运行。观察单片机上的 LED,应该会看到流水灯效果。

注意,上述步骤可能会因具体的单片机型号、烧录工具和操作系统而有所不同。

四、小结

这是一篇无开发基础的单片机新人作的学习记录。文中介绍了实现流水灯的众多控制方法中的一种——移位函数法,可供借鉴学习,若有不足,欢迎指出问题,谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值