c51单片机学习笔记-LED流水灯库函数实验

目的:实现 LED 流水灯,只需循环让 D1-D8 指示灯逐个点亮再从D8-D1逐个点亮,循环下去。

方法:利用移位库函数,点亮 D1 且把 D2-D8 熄灭,延时一段时间后再点亮 D2 且把 D1、 D3-D8 熄灭,延时一段时间后再点亮 D3 且把 D1-D2、D4-D8 熄灭,如此循环,反向亦然。

(移位函数功能:移位函数实现的移位功能就相当于一个队列内循环移动,如 果是左移,那么最高位就被移到最低位了,次高位变为最高位,依次类推)

编译软件:keil5

过程:

(1)使用移位库函数,必须包含 intrins.h 头文件

#include "intrins.h"

(2)main函数后首先定义一个变量i,LED_PORT=~0x01,因为 LED 是低电平点亮,所以 0X01取反后的结果是 0XFE,对应二进制数为 1111 1110,即最低位为 0,因此最开始的 D1 指示灯会点亮,然后进入 while 循环,使用 for 循环、 _crol_和_cror_移位函数实现 LED 左右流水显示.

for(i=0;i<8;i++)
		{
			LED_PORT=_crol_(LED_PORT,1);
			delay_10us(50000);
		}
		for(i=0;i<8;i++)
		{
			LED_PORT=_cror_(LED_PORT,1);
			delay_10us(50000);
		}

(3)编译整体代码无误得到hex.文件

(4)通过CH340驱动烧录hex.文件到单片机开发板 

(5) 通过排线连接P20-P27与D1-D8观察实验现象

c51单片机学习笔记-LED流水灯库函数实验(错)

(返现错误,返回时未从D8直接返回而是到D1再返回)

(6)分析错误原因

移库函数移位是在这段数字内移位,最前移位补到最后,不是自动补零,所以现此处每个 for 循环只有 7 次,这是因为在进入 main 开始,就已经将 LED_PORT 端口设置了一次状态,即让 D1 点 亮,并且我们是想让 LED 从左至右依次点亮,然后继续又从右至左依次点亮,这 样形成左右流水效果。假如将循环次数改为 8 次,我们列举下第一个 for 循环的 LED_PORT 端口状态值,如下所示:

 通过上述列举,可以非常清楚的了解端口 LED 状态,所以此处应该将循环次 数设置为 7 次,即 i 最大等于 6。这样到下一个循环右移时就可以从最高位开始 往低位移动,从而实现左右流水灯效果。

(7)重新编写代码编译得到hex.文件烧录后观察现象

 

 

c51单片机学习笔记-LED流水灯库函数实验(对)

 

 

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GallyDowney

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

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

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

打赏作者

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

抵扣说明:

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

余额充值