【51单片机】3-LED灯的流水功能(多种方式操作)Proteus 8.6 仿真

        在仿真中用8个LED灯的负极与51单片机的P1口连接,每个LED灯的正极与470欧的电阻一端串联,电阻的另一端与电源5V相连。LED灯使用黄颜色,这个颜色在仿真中的效果比较好,如下图所示。

       流水灯的原理就是让每个灯依次亮灭,比如刚开始上电,8个LED灯全灭,过一会D1灯亮,D1灯亮一会,D1灯灭的同时D2灯亮,D2灯亮一会,D2灯灭的同时D3灯亮,按照这种方法D4、D5、D6、D7、D8依次亮灭,然后再从D1灯开始。流水灯的方式有很多,有从左向右移、从右向左移、从中间向两边移等。

       这些不同流水方式都是用程序实现,接下来结合其中的从D1向D8移位方式来讲解六中不同编程。

一、LED流水灯(位操作)

       位操作是实现流水灯最基础的一种方式,首先需要给P1口的八位定义八个变量,然后同时对这8位进行操作,再结合【51单片机】2-LED灯的闪烁(多种方式操作)Proteus 8.6 仿真中的带参延时函数,可以实现流水灯功能。程序如下:

二、LED流水灯(字节操作)

       字节操作就是把十六进制值直接赋给P1端口,比如P1.0口的灯亮(给低电平),其他口的灯灭(给高电平),P1.7-P1.0对应二进制值为 1111 1110,把该值转成十六进制位0xFE并赋给P1口,书写方式为:P1 = 0xfe;程序如下:

三、LED流水灯(位移运算符方法一)

       该方法使用 移位运算“<<”和 或“|”运算,先把P1口赋值0xfe,然后把P1口的值向左移移位再赋给P1口(P1 = P1 << 1;),由于移位运算符使当前值0xfe整体向左移动,得到的结果为 0xfc( 1111 1100 ),如果把这个值直接赋给P1口,会有两个LED灯亮,不符合要求,所以需要把0xfc 与 0x01进行或计算把0xfc最后一位置 1 ,1111 1100 | 0000 0001 =1111 1101(0xfd),把该值赋给P1口这样就只有P1.1端口的LED灯亮。通过for 循环8次后再从while(1)开始执行。程序如下:

四、LED流水灯(位移运算符方法二)

       该方法使用 移位运算“<<” 和 取反“~”运算,把变量0x01取反后赋给P1口,再把0x01按照对应控制的位向左移动i位(i取0-7),通过for 循环执行。程序如下:

五、LED流水灯(库函数操作)

       该方法用到了_crol_这个外部函数,表达的意思是:循环左移这个函数是包含在"intrins.h"中所以使用时需要添加头文件 #include <intrins.h>。比如:P1 = 0xfe;P1 = _crol_P1,1);“P1表示将要左移的数据,“1”表示将要左移的位数,如果为3就是左移3位。P1 = _crol_P1,1);后的结果为0xfd(1111 1101),向左循环移位时,从左边出去会从右边重新补入程序如下:

       _cror_函数

       与_crol_函数类似,区别只是进行的是右位移;

       注释:向右循环移位时,从右边出去会从左边重新补入。

六、LED流水灯(数组)

       该方法使用时需要用到 C51中的存储类型 code :程序存储区(64KB),参考模板:unsigned char code table[]。code的作⽤是告诉单⽚机,定义的数据要放在ROM(程序存储区)⾥⾯,写⼊后就不能再更改,数组的使用方法可以参考C语言。程序如下:

演示视频如下: 

LED灯流水视频

  • 19
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值