技术文档

51单片机花样流水灯 51单片机连载:花样流水灯

小编 2024-11-24 技术文档 23 0

51单片机连载:花样流水灯

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

小娄学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:八路灯同时闪烁?

... ...

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

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

相关问答

51单片机流水灯 怎么改变流速?

要改变51单片机流水灯的流速,可以通过调整延时函数的参数来实现。延时函数控制每个灯亮起和熄灭的时间间隔,从而改变流水灯的流速。增加延时时间可以使流水灯...

51单片机 c语言,如何用4个按键控制4个 流水灯 ?

这个要使用外部中断,你在程序里面改一下,加入中断,可以用你的连接矩阵键盘的io口的最高位与最低位做一个与非门作为中断信号就可以了。附上一段以前写的,你看...

51单片机 ,用定时器中断,在P1口实现1S移动一次的 流水灯 ,用汇编语言编写的程序?

CNTEQU30HORG0000HSJMPSTAORG000BHLJMPT0ISRORG0050HSTA:MOVTMOD,#01HMOVTH0,#3CHMOVTL0,#0B0...

单片机 八个 流水灯 左右依次点亮?

1.首先,打开proteus,可以看到界面上方有"库",点开,在库里选择做实验需要的元件。2.如图所示,我们做流水灯实验所需要的元件,就是红色方框里面的元件,一定...1...

单片机 如何用按钮控制 流水灯 ?

单片机可以通过编程控制流水灯的开关,只需要将相应的按钮连接到单片机的GPIO端口,编写程序实现开关控制逻辑,即可实现流水灯的控制。具体步骤包括初始化GP...

单片机 流水灯 从中间向两边闪烁,再从两边从中间闪烁,修改一下我的程序?

如果你的点灯是低电平那么编码如下:0x7e,0xbd,0xdb,0xe7;这四个编码实现从两边向中间流0xdb,0xbd,0x7e;由上面的四个编码加上下面的四个编码就达到了从中间...

单片机流水灯 全亮在灭在亮的程序怎么写?

你流水灯都写好了全亮全灭还不简单啊,设置P0=0X00(假设低电平亮,高电平灭)在延迟一下在P0=0XFF在延时不就OK了把这几个指令打包下放到一个子程序里...

单片机流水灯 闪烁几次停止?

单片机8个流水灯闪10次后停止。单片机流水灯是指一串LED灯,通过单片机控制,按照一定的顺序,不断循环地轮流点亮,闪烁10次后停止。单片机8个流水灯闪10次后停...

51 开发板特点?

51开发板能干什么51开发板也称51单片机实验板、51单片机学习板。是用于学习51型号的单片机的实验及学习器件,他是将51单片机常用的外围。比如流水灯,数码...

流水灯 带控制器原理?

流水灯带控制器可以实现流水灯效果,其原理是利用单片机产生一个连续的高低电平变化的脉冲信号,控制LED灯的开关以达到流水灯效果。具体地,将每一个LED灯的正...

猜你喜欢