Arduino论坛
直播中

余华

12年用户 427经验值
擅长:可编程逻辑 嵌入式技术 处理器/DSP
私信 关注
[资料]

arduino学习笔记3 - 六灯闪烁实验

通过上一节学习,知道了怎样让一个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毫秒进入下一句。因为六灯逐个点亮的速度非常快,所以看上去像一起亮的。
  • [bvoid[/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灯开始了么
举报

袁国宁

2016-5-14 17:45:38
请问版主
在第一个程序中,如果我不用1~6号脚的话怎么弄?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分