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

来自Microduino Wikipedia
Radiumray9@gmail.com讨论 | 贡献2014年11月5日 (三) 07:30的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索
Language English

目的

通过第一个实验,我们已经知道如何控制一个led灯,接下来稍微扩展下,制作花样流水灯。

设备

Microduino-CoreSTM32是采用 STM32F103CBT6芯片的ARM开发板,采用独特的Upin7接口,大小与一枚一元硬币差不多大,完全兼容Microduino其他扩展模块。

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

实验原理图

我们采用8个led灯,因此我们需要用到8个I/O口。

led的阴极接Microduino-CoreSTM32的GND,阳极接Microduino-CoreSTM32数据控制口D3~D10,高电平点亮led。我们可以通过设置高低电平来实现花样流水的效果。

程序

  • 程序一:
void setup() {                
//定义数字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    
  }
}

我们来看看程序结构: 采用for()循环结构语句,通过pinMode()函数定义数字D3~D10脚为输出,再通过for()循环依次让每个led灯闪烁。

  • 程序二:

采用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代表了Microduino-CoreSTM32I/O口对应16进制的某位,
  0是最低位,7是最高位。再将移的数据与0x01按位与,就可以得到16进制数某位的
  数据(0或1),再将其值赋值给Microduino-CoreSTM32的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));
}

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

调试

  • 按照原理图接线
  • 打开Maple IDE编译器,将程序拷贝到编译器中,选择好板卡(Microduino-CoreSTM32 to Flash)。点击下载按钮或者使用快捷键(Ctrl+U)即可完成下载。

结果

  • 程序一

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

  • 程序二

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