[单片机]KeilC51简单流水灯制作与原理

本文详细介绍了使用8个LED和P0口实现的低电平驱动单行流水灯,涉及原理图解读、keilC51代码编写、延迟函数和_crol_()函数的应用。通过实例演示了如何通过循环和左移操作创建动态流水效果。

P1.单行最简流水灯示例

首先先看原理图,下面为对应解释

  • 最好使用低电平驱动,所谓低电平驱动就是引脚部分为低电平,就如图中电路所示,VCC处于LED右侧,故LED右侧高电平而其左侧低电平,符合条件
  • 这里使用八个LED,自上而下排列, 注意这里我们使用P0口,因为其电压最大方便观察
  • P0口为P0.0-P0.7,所以注意序号的标注!

请添加图片描述


代码时间
这里使用keil C51进行编写,首先看向文件头部

  1. 需要添加头文件<reg51.h>,里面包含了大多数我们需要用到的函数,比如我们接下来要用到的_crol_()函数
  2. 定义两个宏,是为了下文编写数据更加方便
#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int
使用Keil C51开发单片机流水灯,以下是相关教程和代码: ### 教程 玩单片机如同搭积木,掌握基础操作后能实现各种炫酷效果。以流水灯为例,它是51单片机的基础项目,就像解锁了首个“皮肤”。在实现流水灯时,需明确其原理,如流水灯主体代码中 `P0=0xfe` 代表激活P0口上地址为0xfe的子口,P0下属有8个孔,0xfe地址对应P0.0口。之后进入循环,通过调用延迟函数和移位操作,如 `crol(P0,1)` 表示将P0口的地址左移一位(参一为欲处理的口,参二为移动位数),然后将结果赋予P0口,以此激活下一个LED,如此循环往复,回到起始地址0xfe时即形成流水灯 [^1][^3]。 ### 代码示例 #### 方法一:基础实现及利用函数简化 ```c #include "reg52.h" #include <intrins.h> typedef unsigned int u16; typedef unsigned char u8; #define led P2 // 注意:这里可以直接利用stc - isp相关工具生成 void delay(u16 i) { while(i--); } void main() { u8 i; led = 0xfe; delay(50000); while(1) { for(i = 0; i < 7; i++) { led = _crol_(led, 1); delay(50000); } for(i = 0; i < 7; i++) { led = _cror_(led, 1); delay(50000); } } } ``` 此代码中,先定义了无符号整型和字符型的别名,将P2口定义为 `led`。`delay` 函数用于延时,`main` 函数里先给 `led` 赋初值 `0xfe` 并延时,之后通过两个 `for` 循环分别实现LED灯左移和右移,形成流水灯效果 [^2]。 #### 另一种代码示例 ```c #include <reg51.h> void Delayms(unsigned int m) { unsigned int a, b; for(b = m; b > 0; b--) for(a = 125; a > 0; a--); } void main() { P0 = 0xfe; while(1) { Delayms(60); P0 = _crol_(P0, 1); } } ``` 该代码中,`Delayms` 函数用于延时,`main` 函数里先将P0口赋值为 `0xfe`,之后在循环中不断调用延时函数并将P0口地址左移一位,实现流水灯效果 [^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhillerDev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值