产品选型

花样单片机 单片机初学者轻松入门之(六):单片机制作花样流水灯

小编 2024-10-06 产品选型 23 0

单片机初学者轻松入门之(六):单片机制作花样流水灯

小娄学51单片机 2018-03-21 10:47:46

流水灯可以有一个花样,也可以有多个花样,所以可称为花样流水灯。

1、RROTEUS仿真电路图如下(共阳极接法、P2口八路流水灯)

2、写出程序并创建*.hex文件(按不同花样分解依次设计程序)。

花样1:自左至右依次流水,每次只亮一个灯。程序如下:

先来补充三个知识点。

(1)“宏”定义

#define是一个宏定义命令,它常用来指定常数、字符串或者宏函数的代用标识符。其指令格式如下。

#define 代名词 常数(字符串或者宏函数)

例如:

#define outputs P0 //定义使用outputs代替P0。

定义后,当程序中用P0口输出时,如P0=0xFF就可以用outputs=0xFF代替。

程序中 #define uchar unsigned char定义使用uchar代替unsigned char,#define uint unsigned int定义使用uint代替unsigned int。

(2)移位(〉〉和〈〈)和循环移位函数(_crol_ _cror_)

A、标准C语言中的移位操作符"<<"左移一次,超过8位的就被舍去了,最低位补0;">>"右移一次,超过8位的就被舍去了,最高位补0。

应用举例:

一,问:计算表达式14 << 2的值。

答:表达式14 << 2的值为56,因为14(即二进制的00001110)向左移两位等于56(即二进制的00111000)。

二,问: 计算表达式8 >> 2的值。

答:表达式8 >> 2的值为2,因为8(即二进制的00001000)向右移两位等于2(即二进制的00000010)。

具体还需要自己多调试调试。

B、循环移位函数(_crol_, _cror_)

在51头文件reg51.h中没有循环移位函数的定义,而在intrins.h中有说明,所以需要调用intrins.h头文件。

_crol_( m1 , m2 )循环左移位函数

_cror_( m1 , m2 )循环右移位函数

其中m1为需要移位的变量,m2为需要移动的位数。移出去的码循环移动的另一端。

例如程序中i=0xfe(1111 1110); i=_crol_(i,1)意思为将变量i循环左移一位,i=0xfd(1111 1101);

循环移位函数在执行效率上,肯定比标准C的移位效率高,因为不用管移出的超过8位的位。

(3)延时子程序delay(uint t)

子函数是一种具有相对独立功能的程序,其结构与主程序相似。函数格式如下:

返回数据类型 函数名(传入数据类型)

函数可将要处理的数据传入该函数,也可将函数处理完成的数据返回到调用它的程序中。如将一个字符型数据(char)传入函数,处理完成后返回一个整型数据(int),假定其函数名为“SUB_name”,则函数可以这样定义:int SUB_name(char x)

如果不需要传入函数,则可在小括号内用"void"代替,函数可以这样定义:int SUB_name(void)

如果不要返回数据,则可以在函数名左侧用"void"代替,函数可以这样定义:void SUB_name(char x)。

如本设计中的1ms延时子函数:

void delay(uint t) //无返回值的带有传入数据的子函数

{

uchar j;

while(t--)

for(j=0;j<120;j++); //根据上一节的知识介绍,此循环为 //11.0592MHz 51单片机的1ms延时

}

因此,如果想要一个500ms的延时,可以直接调用此函数delay(500),使用起来非常方便,而且理论延时时间很接近实际时间。

此外,需要掌握几个时间转换公式。

1ms=1000us, 1s=1000ms, 1s=106us

现将程序附于下:

#include<reg51.h> //调用51单片机头文件,include调用

#include<intrins.h> //调用头文件,intrins.h中含有循环移位函数

#define uchar unsigned char //宏定义使用uchar代替unsigned char

#define uint unsigned int //宏定义使用uint代替unsigned int

void delay(uint t) //1ms延时子函数

{

uchar j;

while(t--)

for(j=0;j<120;j++);

}

void main()

{

uchar i;

i=0xfe; //设定左边第一个灯亮的初始码

while(1) //死循环

{

P2=i; //将代码编入外接八路流水灯的P2口

delay(500); //延时500ms,如果是delay(1000)则延时1s

i=_crol_(i,1); //将代码循环左移一位数

}

}

花样2:自右至左依次流水,每次只亮一个灯。程序如下:

只改动了主程序中我注释的两处,在此不再详述。

花样3:自右至左依次流水,每次亮两个灯。程序如下:

花样4:自左至右依次流水,每次亮两个灯。程序如何改动呢?

花样5:每次只亮一个灯,流水时间隔一个灯再亮?

花样6:八路灯同时闪烁?

... ...

各种花样太多了,就不一一罗列了。

最后将你需要的花样组合到一个程序之中,就可以实现你想要的效果。

单片机之路—流水灯的N种花式

上一次文章中我们讲解了怎样新建一个单片机keil工程、怎样写程序点亮LED灯。今天我们来通过程序让LED灯闪烁出更多的花式。

在点亮LED灯的程序中我们知道开发板上的LED灯是接到高电平的,如果单片机引脚输出电平,LED导通发亮。如果单片机引脚输出高电平,LED截止熄灭。知道这个原理后我们把单片机的P0端口的8个引脚都按照同样的方法接上8个LED灯,这样我们就能玩出更多的花样啦。

流水灯电路原理图

1、所有LED灯亮灭闪烁

先来一个简单的,先全部点亮和全部熄灭,间隔500ms,上次我们点亮LED灯的程序中我们只操作了P0端口的一位P0.0,现在只需要将原来操作一个端口的一位更改为操作操作整个端口即可。

将P0口定义为一个宏定义,方便后续理解。

#define LED P0

将原来的LED操作函数

void LedDisplay(unsigned char num)

{

Led0 = num;

}

更改为:

void LedDisplay(unsigned char num)

{

LED = num;

}

该函数传入的形参刚好是8bit的无符号整型数据,对应P0口的8个bit,P0.0为最低位。也就是说我们只需要改变LED操作函数传入的形参,P0口对应的8个LED灯状态就能对应改变。所以,我们需要实现全部LED灯的亮灭操作,全都LED点亮,形参传入16进制的0X00,P0口所有引脚置为低电平,延时后熄灭所有的LED灯,LED灯操作函数传入形参0XFF,P0端口所有引脚置为高电平。需要将主函数中对应做如下修改。

void main()

{

for(;;)

{

LedDisplay(0x00);

delay_ms(500);

LedDisplay(0xFF);

delay_ms(500);

}

}

2、间隔一个LED交替闪烁

根据上面我们实现所有LED亮灭的操作方法,如果要实现间隔一个LED交替闪烁,我们只需要更改传入的LED形参即可。对应为8bit的二进制数据为1010 1010为奇数的LED灯点亮,对应二进制为0101 0101为偶数的LED点亮。转化为16进制就是0xAA和0x55。我们对应修改主函数程序如下。编译下载到单片机,你会神奇地发现这时候已经有流水的效果了。

void main()

{

for(;;)

{

LedDisplay(0xAA);

delay_ms(500);

LedDisplay(0x55);

delay_ms(500);

}

}

3、从低位到高位依次点亮

从上面我们已经知道原理了,一次点亮的话我们需要给P0口依次赋值0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F。那我们有没有更简单一下的方法呢,有的,我们发现上面的数据取反后是0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80。然后0x02等于0x01向左移动一位,也就是说上面所有的数据可以用0x01通过移位和取反两个操作得到。

我们先定义一个全局变量并且初始值赋值0x01

unsigned char dat = 0x01;

在主函数中循环操作,循环一次移位一次。过更改延时函数的传入的形参大小可以调节流水的速度

void main()

{

unsigned char i;

for(;;)

{

dat = 0x01;

for(i=0;i<8;i++)

{

LedDisplay(~dat);

delay_ms(500);

dat = dat<<1;

}

}

}

给大家讲解了一下LED流水灯的原理和一些基本的操作方法,可以通过更改传入的数据和延时的时间,实现更多的流水灯样式。请关注我,我们一起学单片机写程序,感受DIY带来的乐趣。

相关问答

单片机 中的流水灯, 花样 灯,跑马灯?

没什么实质的区别只是各人说法不一样,像流水灯程序也有人叫跑马灯,说个简单的例子,比方说一个亮点不断的左循环就叫流水灯。从中间亮两个点,从左右两边流动就...

单片机 节日彩灯课程设计,从两边向中间点亮依次循环不止。亮灭时间为0.25S,用一个开关控制彩灯的工作?

D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RET;以下为流水灯的花样表格,每个数据对应一个时刻下的LED的状态;TABLE的数据最后会被编译器...

如何设计一个 单片机 可控的循环流水灯?

首先在硬件方面,我们使用了最经典的选型用AT89S51单片机作为主控芯片,LED电路选用共阳极接法:8路红色LED灯正极接5V电源、各路串联一个限流电阻,保护发光二...

机器绣花机的价格是多少?- 一起装修网

一起装修网问答平台为您提供机器绣花机的价格是多少?的相关答案,并为您推荐了关于机器绣花机的价格是多少?的相关问题,一起装修网问答平台:装修问题,因我而止。

单片机 热敏电阻怎么检测他的温度的?

突然...如果是最老式的电饭锅(某宝上50元以内就能买一个),就那个开关通过杠杆连着一个磁体,你按下去的时候会吸住,开始加热,然后这种磁体在105度的时候磁性会...

在座的同志,帮忙答一下!攀枝花正规彩灯费用,彩灯评价如何??

[回答]用关键帧弄的!首先画出小雪花,有少到多,中间创建不见动画啊,彩灯画的一个白色一个透明中间创建关键帧,补间少些,就行了,慢慢练彩灯,又名“花灯”,...

什么是led筒灯控制器?-设计本有问必答

智能灯光控制器,也称为可编程式灯光控制器,即控制器的灯光程序是可以按照使用者的需要进行修改,比如修改灯光闪烁的速度、时间、花样、同步与异步等...

童鞋们 急需赐教!!靠谱的彩灯设计供应商,彩灯设计优势有...

[回答]我跟辰鑫彩灯他们家合作挺久了,效果挺好的,真心推荐看了你的问题,我也比较郁闷。图有点不好做,给你描述一下吧,老早以前用这种方式做过信号发生器...

自动化专业和电气工程及其自动化改选哪一个?

1、电气工程及其自动化专业培养目标:电气工程及其自动化专业培养适应我国社会主义建设需要的德、智、体全面发展的,能够从事与电气工程有关的系统运行、自动...

你们谁明白!ktv智能灯光控制器是怎么安装的?

[回答]智能灯光控制器,也称作可编程式灯光控制器,即控制器的灯光程序是可以按照使用者的必须展开改动,比如改动灯光闪光的速度、时间、花样、同步与异步等...

猜你喜欢