51单片机 (五)位移函数和流水灯

您所在的位置:网站首页 51单片机cror 51单片机 (五)位移函数和流水灯

51单片机 (五)位移函数和流水灯

2024-06-30 15:42| 来源: 网络整理| 查看: 265

        上一章我们讲到了点灯,接下来我我们将会讲解流水灯的实现,那什么是流水灯呢,流水灯顾名思义就是让一排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),一般保存在头文件中。这两函数就可以实现位移,第一个参数代表要移位的数据,第二个形参代表要移动的位数。废话不多说,接下来上代码来举例:  

流水灯参考程序: #include "reg52.h" #include 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);//用提供的右移一位函数 } } void delay_ms(u16 xms)//延时函数,起到延时大约x毫秒的作用 { u16 i,j; for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3