5-0 51单片机流水灯

        上一章我们讲到了点灯,接下来我我们将会讲解流水灯的实现,那什么是流水灯呢,流水灯顾名思义就是让一排led灯从一端逐个亮起来,然后每次移动一个灯,让led灯从一端逐个亮到另一端,过程看起来就好像流水一般,因此叫做流水灯。

        下图是学习中所用到的单片机中LED模块原理图。可以看到正极的公共极是连在一起的,所以称为共阳,共阴则公共极相反。那么如何实现流水灯效果呢,我们知道,在单片机中,1是代表高电平,0是代表低电平,当灯为共阳的时候,我们只需要让对应的端口为低电平(为0)的时候,那么对应的灯就会亮,那么要实现流水灯,不外乎就是让灯P10到P17依次点亮。并且让他每次延时亮一段时间即可。

备注:科普一下位操作。

        首先看原理图,我们会发现8盏灯分别对应八个引脚,如果按照对半分的话,会变成XXXX XXXX,因为只存在有电和没电两种情况,X只能为1或者0。1或者0本来就是二进制,XXXX XXXX只是更好的转化为16进制。

       再说说什么是P1和P10,这是一个宏定义,将这个LED灯所连接的引脚在单片机内的地址用P10来表示,而P1,只不过是这一块引脚的总地址。

        当我们往这个地址里写入1时,单片机便会将该引脚电平拉高,写入0时引脚电平会拉低,不写的话要看单片机内部怎么定义。那我们是不是可以直接给P1这个总地址写入一个0xXX来直接给所有的灯一个命令那些灯亮,那些灯不亮,这就是位操作。当然还可以通过位移符号或者与或非等对灯进行操作。

        实现流水灯,也就是让P10到P17灯的电平从01111111,变成10111111,变.....,变化到11111110,也就是让0在这这8位中依次位移,要实现这个效果,就需要用到位移这个概念,(这里的位移可不是游戏里面的位移哦),位移有算术移位、逻辑移位、循环移位。     

算术右移、逻辑右移的差别:

        左移和右移大家应该都能从字面意思看懂,,就是将一个数向左移动或者向右移动,一般来说,移动后溢出的数据位我们是以舍弃处理的,那么空出来的位呢?要填1还是0呢?由此引出“算术右移”和“逻辑右移”这两个名词。

        逻辑左移和算数左移用法是一致的,都是右边空缺的位统一添0;逻辑右移,左边空缺的位统一添0;算数右移,左边空缺的位添加的数和符号有关;

以1010101010举例子,其中[]是添加的位。

逻辑左移一位:010101010[0];算数左移一位:010101010[0]

逻辑右移一位:[0]101010101;算数右移一位:[1]101010101

        那么我们如何在c语言中实现位移呢,其实在我们C语言中,程序开发人员已经写出来的两个函数,函数名为_cror_(int,int),和_crol_(int,int)一般保存在头文件<intrins.h>中。这两函数就可以实现位移,第一个参数代表要移位的数据,第二个形参代表要移动的位数。废话不多说,接下来上代码来举例:

流水灯参考程序:

#include "reg52.h"
#include <intrins.h>
void delay_ms(u16 xms);//延时函数,起到延时大约x毫秒的作用

void main()
{
    unsigned char b,i=0;
	b=0xfe;          // 1111 1110
	while(1)
	{		 
		P1= b;//让芯片的P1口输出一个低电平
		Delay(50000);//用于延时	
		b= _crol_(b,1);//用<intrins.h>提供的右移一位函数
	}
}
void delay_ms(u16 xms)//延时函数,起到延时大约x毫秒的作用
{
    u16 i,j;
    for(i=0;i<xms;i++)
    for(j=0;j<110;j++);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值