第二课--多个led的闪烁/zh

来自Microduino Wikipedia
Pkj讨论 | 贡献2014年2月16日 (日) 03:20的版本
跳转至: 导航搜索
Language English

目的

已经讲了点亮一个led的方法,接下来稍微扩展下,控制多个led依次闪烁。巩固与深化下microduino的I/O口用法。

设备

  • Microduino-Core
  • Microduino-FT232R
  • 其他硬件设备
    • 面包板跳线 一盒
    • 面包板 一块
    • LED发光二极管 八个
    • 220欧姆电阻 八个
    • USB数据连接线 一根

原理图

  • led的阴极接Microduino的GND,阳极接Microduino数据控制口D3~D10,这样就是高电平点亮led。
  • led的阴极接Microduino的数据控制口D3~D10,阳极接Microduino的VCC,这样就是低电平点亮led。

其实数码管共阴、共阳就是这个原理,以后会详细介绍驱动数码管。

程序

  • 采用数据口直接输出
void setup() {                
//定义microduino数字D3~D10脚为输出   
  for(int i=3;i<11;i++)
  pinMode(i, OUTPUT);     
}
void loop() {
  for(int i=3;i<11;i++)
  {
  digitalWrite(i, HIGH); // 数据口i(D3~D10)输出高电平
  delay(50);            //延时50ms  
  digitalWrite(i, LOW); //// 数据口i(D3~D10)输出低电平
  delay(50);           //延时50ms    
  }
}
  • 采用16进制数组,将数据移位输出送至每个I/O口,花样流水
/*===============================================
ox(高-低:10,9,8,7)(高-低:6,5,4,3)
例如
0x81:10000001
10,9,8,7,6,5,4,3
↓  ↓ ↓ ↓↓ ↓↓ ↓
1  0 0 0 0 0 0 1
在共阴即所有led阴极都接在一起情况下,1代表亮,0代表灭,
就可以通过数组形式直接控制亮度。
=================================================*/
long  data[]=
{
  0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//单独一个从左至右亮
  0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,//单独一个从从右至左亮
  0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,//两边往中间亮及中间往两边亮
  0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,//从左到右依次点亮
  0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,//从右到左依次熄灭
};

void setup() 
{                
  for(int x=3;x<11;x++) 
  {
    pinMode(x,OUTPUT);//设置输出引脚
  }  
}


void loop() 
{
  for(int x=0;x<40;x++)//分别读取不同花样灯
  {
    leddisplay(data[x]);
    delay(200); //每个状态显示200ms
  }
  leddisplay(0x00);//循环完毕全灭
  delay(200);
}

void leddisplay(int num)    // 将花样字模对应到端口显示
{
  /*====================================================================
  先将16进制数向右移x位(num>>x),x代表了microduinoI/O口对应16进制的某位,
  0是最低位,7是最高位。再将移的数据与0x01按位与,就可以得到16进制数某位的
  数据(0或1),再将其值赋值给microduino的I/O就行。 
 ====================================================================*/
  digitalWrite(3, ((num>>0)&0x01));
  digitalWrite(4, ((num>>1)&0x01));
  digitalWrite(5, ((num>>2)&0x01));
  digitalWrite(6, ((num>>3)&0x01));
  digitalWrite(7, ((num>>4)&0x01));
  digitalWrite(8, ((num>>5)&0x01));
  digitalWrite(9,((num>>6)&0x01));
  digitalWrite(10,((num>>7)&0x01));
}

此实验类似51单片机流水灯写法,将16进制数组赋值到I/O,比如0x18表示2进制的00011000,对应值为“1”的灯亮,“0”的灭。能简单随意的写出各种花样。 两个实验比较,第一个实验看起来简单,效果单一,并且输出口必须连续,局限性很大。第二个实验就优化了,利用数组,将16进制的每位得值都赋值给指定的I/O口,可以实现花样流水。

结果

  • 程序1

led从左到右依次循环点亮每一个led。

  • 程序2

可以看到五种花样效果:单独一个从左至右亮;单独一个从从右至左亮;两边往中间亮及中间往两边亮;从左到右依次点亮;从右到左依次熄灭。

视频