Arduino论坛
登录
直播中
余华
12年用户
427经验值
擅长:可编程逻辑 嵌入式技术 处理器/DSP
私信
关注
[资料]
arduino学习笔记3 - 六灯闪烁实验
Arduino
通过上一节学习,知道了怎样让一个led进行闪烁,下面的实验会对六个led进行控制,先看硬件连接图。
按照上面的硬件连接方法接好后,咱们来测试两段程序,看看其中的差别。通过这两段程序介绍一下arduino的语言轮廓。
ARDUINO 代码
复制
打印
//设置控制Led的数字IO脚
int
Led1 =
1
;
int
Led2 =
2
;
int
Led3 =
3
;
int
Led4 =
4
;
int
Led5 =
5
;
int
Led6 =
6
;
//led灯花样显示样式1子程序
void
style_1
(
void
)
{
unsigned
char
j;
for
(
j=
1
;j<=
6
;j++
)
{
digitalWrite
(
j,
HIGH
)
;
delay
(
200
)
;
}
for
(
j=
6
;j>=
1
;j--
)
{
digitalWrite
(
j,
LOW
)
;
delay
(
200
)
;
}
}
void
setup
(
)
{
unsigned
char
i;
for
(
i=
1
;i<=
6
;i++
)
//依次设置1~6个数字引脚为输出模式
pinMode
(
i,
OUTPUT
)
;
//设置第i个引脚为输出模式
}
void
loop
(
)
{
style_1
(
)
;
//样式1
}
上面代码的效果视频如下:
ARDUINO 代码
复制
打印
//设置控制Led的数字IO脚
int
Led1 =
1
;
int
Led2 =
2
;
int
Led3 =
3
;
int
Led4 =
4
;
int
Led5 =
5
;
int
Led6 =
6
;
//led灯花样显示样式1子程序
void
style_1
(
void
)
{
unsigned
char
j;
for
(
j=
1
;j<=
6
;j++
)
digitalWrite
(
j,
HIGH
)
;
delay
(
200
)
;
for
(
j=
6
;j>=
1
;j--
)
{
digitalWrite
(
j,
LOW
)
;
delay
(
200
)
;
}
}
void
setup
(
)
{
unsigned
char
i;
for
(
i=
1
;i<=
6
;i++
)
//依次设置1~6个数字引脚为输出模式
pinMode
(
i,
OUTPUT
)
;
//设置第i个引脚为输出模式
}
void
loop
(
)
{
style_1
(
)
;
//样式1
}
上面代码的效果视频如下:
通过下载测试,发现第一段程序是led 1-6逐个点亮,然后从6-1再逐个熄灭如此循环。
第二段程序是6个灯同时亮,然后再6-1逐个熄灭如此循环。下面对产生不同效果的代码进行分析。
下面这段代码代表的for语句循环的是,是把j点亮,然后再延迟200毫秒,然后再循环。形成的效果就是6个灯相隔200毫秒逐步被点亮。
ARDUINO 代码
复制
打印
for
(
j=
1
;j<=
6
;j++
)
{
digitalWrite
(
j,
HIGH
)
;
delay
(
200
)
;
}
[
/code
[
size=
4
下面这段代码其实是不规范写法,
for
命令表达要求一定要有
{
}
循环,如果没有标出
{
}
,编译时就会自动对下一句加上
{
}
。如果代码量很大,出问题是查找起来会非常辛苦。
[
/size
[
DISCUZ_CODE_0
[
size=
4
六个灯逐个被点亮,然后再延时
200
毫秒进入下一句。因为六灯逐个点亮的速度非常快,所以看上去像一起亮的。
[
b
void
[
/b(无类型)在arduino中是数据类型的一种,通常用来代表一个事件。如果控制过程比较简单
void
一般无需定义,直接使用
[
/size
[
pre lang=
"arduino"
line=
"1"
void
setup
(
)
{
// ...
}
void
loop
(
)
{
// ...
}
代表事件的开始与事件的循环。
如果控制过程比较复杂,一般就要设置多个子事件,把复杂的过程进行分解,每一个子事件定义为一个void数据。
把以下代码上传上去,看看led灯是如何工作的。
ARDUINO 代码
复制
打印
//设置控制Led的数字IO脚
int
Led1 =
1
;
int
Led2 =
2
;
int
Led3 =
3
;
int
Led4 =
4
;
int
Led5 =
5
;
int
Led6 =
6
;
//led灯花样显示样式1子程序
void
style_1
(
void
)
{
unsigned
char
j;
for
(
j=
1
;j<=
6
;j++
)
//每隔200ms依次点亮1~6引脚相连的led灯
{
digitalWrite
(
j,
HIGH
)
;
//点亮j引脚相连的led灯
delay
(
200
)
;
//延时200ms
}
for
(
j=
6
;j>=
1
;j--
)
//每隔200ms依次熄灭6~1引脚相连的led灯
{
digitalWrite
(
j,
LOW
)
;
//熄灭j引脚相连的led灯
delay
(
200
)
;
//延时200ms
}
}
//灯闪烁子程序
void
flash
(
void
)
{
unsigned
char
j,k;
for
(
k=
0
;k<=
1
;k++
)
//闪烁两次
{
for
(
j=
1
;j<=
6
;j++
)
//点亮1~6引脚相连的led灯
digitalWrite
(
j,
HIGH
)
;
//点亮与j引脚相连的led灯
delay
(
200
)
;
//延时200ms
for
(
j=
1
;j<=
6
;j++
)
//熄灭1~6引脚相连的led灯
digitalWrite
(
j,
LOW
)
;
//熄灭与j引脚相连的led灯
delay
(
200
)
;
//延时200ms
}
}
//led灯花样显示样式2子程序
void
style_2
(
void
)
{
unsigned
char
j,k;
k=
1
;
//设置k的初值为1
for
(
j=
3
;j>=
1
;j--
)
{
digitalWrite
(
j,
HIGH
)
;
//点亮灯
digitalWrite
(
j+k,
HIGH
)
;
//点亮灯
delay
(
400
)
;
//延时400ms
k +=
2
;
//k值加2
}
k=
5
;
//设置k值为5
for
(
j=
1
;j<=
3
;j++
)
{
digitalWrite
(
j,
LOW
)
;
//熄灭灯
digitalWrite
(
j+k,
LOW
)
;
//熄灭灯
delay
(
400
)
;
//延时400ms
k -=
2
;
//k值减2
}
}
//led灯花样显示样式3子程序
void
style_3
(
void
)
{
unsigned
char
j,k;
//led灯花样显示样式3子程序
k=
5
;
//设置k值为5
for
(
j=
1
;j<=
3
;j++
)
{
digitalWrite
(
j,
HIGH
)
;
//点亮灯
digitalWrite
(
j+k,
HIGH
)
;
//点亮灯
delay
(
400
)
;
//延时400ms
digitalWrite
(
j,
LOW
)
;
//熄灭灯
digitalWrite
(
j+k,
LOW
)
;
//熄灭灯
k -=
2
;
//k值减2
}
k=
3
;
//设置k值为3
for
(
j=
2
;j>=
1
;j--
)
{
digitalWrite
(
j,
HIGH
)
;
//点亮灯
digitalWrite
(
j+k,
HIGH
)
;
//点亮灯
delay
(
400
)
;
//延时400ms
digitalWrite
(
j,
LOW
)
;
//熄灭灯
digitalWrite
(
j+k,
LOW
)
;
//熄灭灯
k +=
2
;
//k值加2
}
}
void
setup
(
)
{
unsigned
char
i;
for
(
i=
1
;i<=
6
;i++
)
//依次设置1~6个数字引脚为输出模式
pinMode
(
i,
OUTPUT
)
;
//设置第i个引脚为输出模式
}
void
loop
(
)
{
style_1
(
)
;
//样式1
flash
(
)
;
//闪烁
style_2
(
)
;
//样式2
flash
(
)
;
//闪烁
style_3
(
)
;
//样式3
flash
(
)
;
//闪烁
}
上面的代码分为4个子事件,样式1,样式2,样式3和闪烁。
闪烁:1-6号灯亮,延时200ms,1-6号灯熄灭,延时200ms。效果视频如下:
样式1:1-6号灯逐个点亮,然后6-1逐个熄灭。效果视频如下:
样式2:3,4号灯先亮,然后2,5号再亮,最后1,6号两。接着1,6号灯熄灭,再2,5号熄灭,最后3,4号熄灭。效果视频如下:
样式三:3,4号灯亮,然后3,4号熄灭2,5号亮,然后2,5号熄灭1,6号亮,再1,6号熄灭2,5号亮,最后2,5号熄灭3,4号亮。效果视频如下:
通过以上4种事件的组合,就可以做出来各种效果。
回帖
(2)
wang17
2015-1-15 11:36:50
unsigned char j;第一个程序里的,这个j不用给初值么,直接就从 for(j=1;j<=6;j++)//每隔200ms依次点亮1~6引脚相连的led灯开始了么
unsigned char j;第一个程序里的,这个j不用给初值么,直接就从 for(j=1;j<=6;j++)//每隔200ms依次点亮1~6引脚相连的led灯开始了么
举报
袁国宁
2016-5-14 17:45:38
请问版主
在第一个程序中,如果我不用1~6号脚的话怎么弄?
请问版主
在第一个程序中,如果我不用1~6号脚的话怎么弄?
举报
更多回帖
rotate(-90deg);
回复
相关帖子
Arduino
Arduino
学习
笔记
2021-11-23
1413
Arduino
学习
笔记
2021-07-13
875
Arduino
LED
闪烁
实验
详细步骤
2018-08-27
12983
Arduino
实验
之LED
闪烁
程序与接线图
2018-08-20
7418
FreeRTOS
学习
笔记
(
六
)——队列管理
2017-10-21
2573
FreeRTOS
学习
笔记
(
六
)——队列管理
2017-09-28
3617
arduino
学习
笔记
23 - 任意输出舵机角度
实验
2014-10-24
27319
arduino
学习
笔记
20 - 使用
Arduino
Duemilanove给其他芯片下载bootloa...
2014-10-24
4138
arduino
学习
笔记
9 - 光控LED
实验
2014-10-23
7724
arduino
学习
笔记
6 - 按键
实验
2014-10-23
48753
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分