前言

答应了群主写一些示例程序,一直拖延拖延拖延唉。主要还是害怕在各大高手面前班门弄斧……(这也算是给拖延症找一个美好的理由吧),这几天终于下决心要写出来了,各位高手拍砖敬请轻拍啊。

示例程序

首先是闪灯程序

示例自带的闪灯就略过了,这里写个不大一样的,使用 millis() 来进行时间间隔的判断,与示例使用 delay() 的方式比较,这种方式不会阻塞主进程,以后很多地方会用得上的:

  1. // ----------------------------------------------------------------------------
  2. // millisBlink.ino
  3. //
  4. // Created 2015-05-28
  5. // By seesea <seesea2517#gmail#com>
  6. //
  7. // 使用millis()来判断时间间隔进行的闪灯程序
  8. //
  9. // 使用板上 LED
  10. // ----------------------------------------------------------------------------
  11.  
  12. const unsigned char led = ;
  13. const unsigned long switchMs = ; // 亮灭的切换延时时间
  14.  
  15. unsigned long lastMs = millis();
  16. bool light = false;
  17.  
  18. void setup()
  19. {
  20. pinMode(led, OUTPUT);
  21. }
  22.  
  23. void loop()
  24. {
    // 如果不到切换时间,则跳出函数,不阻塞主程序
  25. if (millis() - lastMs < switchMs)
  26. return;
  27.  
  28. lastMs = millis();
  29.  
  30. light = !light;
  31. digitalWrite(led, light);
  32. }

其次,还是闪灯程序

这里使用时钟中断来实现。

  1. // ----------------------------------------------------------------------------
  2. // intBlink.ino
  3. //
  4. // Created 2015-05-28
  5. // By seesea <seesea2517#gmail#com>
  6. //
  7. // 使用时钟中断来实现的闪烁灯
  8. //
  9. // 使用板上 LED
  10. // ----------------------------------------------------------------------------
  11.  
  12. const int led = ;
  13. const unsigned long T1InitCount = - F_CPU / / ; // 2Hz闪烁,TCNT 初始值, 256 预分频
  14.  
  15. void setup()
  16. {
  17. pinMode(led, OUTPUT);
  18.  
  19. noInterrupts();
  20.  
  21. TCCR1A = ;
  22. TCCR1B = ;
  23.  
  24. TCNT1 = T1InitCount;
  25. TCCR1B |= ( << CS12); // 256 预分频
  26. TIMSK1 |= ( << TOIE1); // T1 溢出中断允许
  27.  
  28. interrupts();
  29. }
  30.  
  31. // 中断函数
  32. ISR(TIMER1_OVF_vect)
  33. {
  34. TCNT1 = T1InitCount; // 重装初值。如果使用比较中断,则不需要重装初值了
  35. digitalWrite(led, ! digitalRead(led));
  36. }
  37.  
  38. void loop()
  39. {
  40. // loop 函数里啥也不需要,可以做爱做的事情哟
  41. }

接下来要加上一个按钮啦

  1. // ----------------------------------------------------------------------------
  2. // keyLED.ino
  3. //
  4. // Created 2015-05-29
  5. // By seesea <seesea2517#gmail#com>
  6. //
  7. // 按钮按下灯亮,松开灯灭的实验
  8. //
  9. // 使用板上 LED,按钮引脚接 8 脚及 GND,pin 8 使用内部上拉
  10. // ----------------------------------------------------------------------------
  11.  
  12. const unsigned char led = ;
  13. const unsigned char key = ;
  14.  
  15. void setup()
  16. {
  17. pinMode(led, OUTPUT);
  18. pinMode(key, INPUT_PULLUP);
  19. }
  20.  
  21. void loop()
  22. {
  23. digitalWrite(led, ! digitalRead(key));
  24. }

下面还是按钮,使用外部中断来实现

  1. // ----------------------------------------------------------------------------
  2. // keyIntLED.ino
  3. //
  4. // Created 2015-05-29
  5. // By seesea <seesea2517#gmail#com>
  6. //
  7. // 使用外部中断来实现的按钮按下灯亮,松开灯灭的实验
  8. // 注:0 号中断固定为 pin 2
  9. //
  10. // 使用板上 LED,按钮引脚接 2 脚及 GND,pin 2 使用内部上拉
  11. // ----------------------------------------------------------------------------
  12.  
  13. const unsigned char led = ;
  14. const unsigned char key = ;
  15.  
  16. void setup()
  17. {
  18. pinMode(led, OUTPUT);
  19. pinMode(key,INPUT_PULLUP);
  20.  
  21. attachInterrupt(, lightLED, LOW); // 使用低电平中断
  22. }
  23.  
  24. // 中断函数
  25. void lightLED()
  26. {
  27. // 中断函数优先于普通函数,低电平会不断中断,从而只执行灯亮的操作
  28. digitalWrite(led, HIGH);
  29. }
  30.  
  31. void loop()
  32. {
  33. // 中断函数优先于普通函数,低电平会不断中断,从而只执行灯亮的操作
  34. // 待中断结束后,执行这里灯灭操作
  35. digitalWrite(led, LOW);
  36. }

接着还要做按钮实验,这个实验演示了软件消抖

如果不消抖的话,会有非预期的效果出现哦

  1. // ----------------------------------------------------------------------------
  2. // keyIntLED.ino
  3. //
  4. // Created 2015-05-29
  5. // By seesea <seesea2517#gmail#com>
  6. //
  7. // 使用外部中断来实现的按钮按下灯亮,松开灯灭的实验
  8. // 注:0 号中断固定为 pin 2
  9. //
  10. // 使用板上 LED,按钮引脚接 2 脚及 GND,pin 2 使用内部上拉
  11. // ----------------------------------------------------------------------------
  12.  
  13. const unsigned char led = ;
  14. const unsigned char key = ;
  15.  
  16. void setup()
  17. {
  18. pinMode(led, OUTPUT);
  19. pinMode(key,INPUT_PULLUP);
  20.  
  21. attachInterrupt(, lightLED, LOW); // 使用低电平中断
  22. }
  23.  
  24. // 中断函数
  25. void lightLED()
  26. {
  27. // 中断函数优先于普通函数,低电平会不断中断,从而只执行灯亮的操作
  28. digitalWrite(led, HIGH);
  29. }
  30.  
  31. void loop()
  32. {
  33. // 中断函数优先于普通函数,低电平会不断中断,从而只执行灯亮的操作
  34. // 待中断结束后,执行这里灯灭操作
  35. digitalWrite(led, LOW);
  36. }

现在不玩按钮了,要实验 PWM

  1. // ----------------------------------------------------------------------------
  2. // pwmLED.ino
  3. //
  4. // Created 2015-05-31
  5. // By seesea <seesea2517#gmail#com>
  6. //
  7. // 外部模拟设备控制灯亮度的实验
  8. //
  9. // 使用板上 LED,pin 13 没有 pwm 功能,所以用接线把 pin 11 接到 pin 13 进行实验
  10. // 外部模拟器件可使用电位器,两端接 VCC 及 GND,中间接 A0 模拟引脚
  11. // 外部模拟器件或者使用光敏电阻与普通电阻串联,两端接 VCC 及 GND,中间接 A0 模拟引脚
  12. // ----------------------------------------------------------------------------
  13.  
  14. const unsigned char led = ;
  15. const unsigned char sensor = A0;
  16.  
  17. void setup()
  18. {
  19. pinMode(led, OUTPUT);
  20. pinMode(sensor, INPUT);
  21. }
  22.  
  23. void loop()
  24. {
  25. // 用 map 函数进行范围的映射
  26. analogWrite(led, map(analogRead(sensor), , , , ));
  27. }

下面有图有真相,使用电位器来控制灯的亮度,或者用模拟传感器来控制——比如光敏电阻:

呼吸灯

PWM 会了,大名鼎鼎的呼吸灯不能少

  1. // ----------------------------------------------------------------------------
  2. // breathingLED.ino
  3. //
  4. // Created 2015-05-29
  5. // By seesea <seesea2517#gmail#com>
  6. //
  7. // 呼吸灯程序
  8. //
  9. // 使用时将 pin 11 用线接到 pin 13 上可以使用板子上的 LED 来实验
  10. // ----------------------------------------------------------------------------
  11.  
  12. const unsigned char led = ;
  13.  
  14. void setup()
  15. {
  16. pinMode(led, OUTPUT);
  17. // pinMode(13, INPUT); 如果遇到灯亮度不够的情况,可以试试把这句话加上
  18. }
  19.  
  20. void loop()
  21. {
  22. static unsigned char pwm = ;
  23. static char delta = ;
  24.  
  25. if (pwm == )
  26. {
  27. // 最亮的时候改变变化方向为变暗
  28. delta = -;
  29. }
  30. else if (pwm == )
  31. {
  32. // 最暗的时候改变变化方向为变亮
  33. delta = ;
  34. }
  35.  
  36. pwm += delta;
  37.  
  38. analogWrite(led, pwm);
  39. delay();
  40. }

简单上个接线图:

数字口实现的呼吸灯

还是呼吸灯,这次使用数字口来实现,以后有遇到 PWM 口不够的时候,就可以用这种模拟的方法了

  1. // ----------------------------------------------------------------------------
  2. // digitalbreathingLED.ino
  3. //
  4. // Created 2015-05-29
  5. // By seesea <seesea2517#gmail#com>
  6. //
  7. // 直接使用 pin 13 数字引脚来实现呼吸灯
  8. // ----------------------------------------------------------------------------
  9.  
  10. const unsigned char led = ;
  11. const unsigned char maxPwm = ;
  12.  
  13. void setup()
  14. {
  15. pinMode(, OUTPUT);
  16. }
  17.  
  18. void loop()
  19. {
  20. static unsigned char pwm = ;
  21. static char delta = ;
  22.  
  23. if (pwm == )
  24. {
  25. // 最亮的时候改变变化方向为变暗
  26. delta = ;
  27. }
  28. else if (pwm == )
  29. {
  30. // 最暗的时候改变变化方向为变亮
  31. delta = -;
  32. }
  33.  
  34. pwm += delta;
  35.  
  36. // 先亮灯,等占空比到切换点的时候灭灯
  37. digitalWrite(led, HIGH);
  38. for (unsigned char i = ; i < maxPwm; ++i)
  39. {
  40. if (i == pwm)
  41. digitalWrite(led, LOW);
  42.  
  43. delayMicroseconds();
  44. }
  45. }

这个也有图,可以看看没有接线的图 :D

Arduino 入门程序示例之一个 LED(2015-06-11)的更多相关文章

  1. Arduino 入门程序示例之一排 LED(2015-06-11)

    概述 最简单的一个 LED 的实验之后,自然是增加几个 LED,咱排成一排来玩吧.最后,再把一排的 LED 排成一个 8 字来玩——七段数码管. 示例程序 流水灯 第一个出场的肯定是经典的流水灯,也叫 ...

  2. Arduino 入门程序示例之一片 LED(2015-06-11)

    概述 从点到线,从线到面.现在开始要来一片的 LED 了,一大波的 LED 正在到来! 示例程序 因为手头没有现成的模块,手头只有 595,所以这里每一个示例程序都是使用 74HC595 扩展 IO ...

  3. Arduino 入门程序示例之直流电机(2015-06-15)

    概述 演示直流电机的控制. 示例程序 PWM控制直流电机 略过控制电机转停的示例啦,有需要就把这里的 PWM 换成数字口输出 HIGH 或 LOW 就行了. // ------------------ ...

  4. arduino入门学习实现语音控制LED灯

    需要的准备的硬件arduino+PC+麦克风实现语音命令控制LED灯的亮灭. 首先需要将写好的arduino程序烧录到arduino uno主板中,下面是代码如下: int val;//定义变量val ...

  5. 第一个程序点亮一个LED灯

    #include <reg52.h> // 引用52包文件 可以理解为命名空间 sbit P1_0 = P1^0;   // 定义P1管脚0 void main()             ...

  6. 译文 [ROM][多国语言][2015.06.11] Lenovo S750 (MTK6589) - andrea_d86-lenovos750-4.2.2

    ************************************************** andrea_d86-lenovos750-4.2.2-150530 ************** ...

  7. 2015.06.11,技术,关于Matlab中的Jbtest检验

    总体分布的正态性检验一般采取Jarque-Bera检验方法. 1. JBTest检验的定义: 在统计学中,Jarque-Bera检验是对样本数据是否具有符合正态分布的偏度和峰度的拟合优度的检验.该检验 ...

  8. SpringMVC系列(一)SpringMVC概述和搭建SpringMVC的第一个helloWord入门程序

    一.SpringMVC 概述 • Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一 • Spring3.0 后全面超越 Struts2,成为最优秀的 MVC ...

  9. SpringBoot的入门程序

    1. 创建一个springboot工程 可以参考springboot入门程序 2. 创建一个实体类 @Data //想相当于@Setter.@Getter和@ToString替代了setter.get ...

随机推荐

  1. Node安装及搭建简单服务器

    注:本文安装系统为mac,windows及其他系统下载对应安装包 ,mac下载后的安装包为apk文件,windows为msi文件. 安装 1.在网上下载node安装包,官方网站2.双击下载文件,按步骤 ...

  2. grunt用来压缩前端脚本

    grunt作为一个任务管理工具,提供丰富的插件和强大的自动化管理功能.需要安装node及npm. 主要使用到两个文件,一个是npm的依赖配置文件package.json { "name&qu ...

  3. leetcode第一刷_Construct Binary Tree from Inorder and Postorder Traversal

    这道题是为数不多的感觉在读本科的时候见过的问题. 人工构造的过程是如何呢.兴许遍历最后一个节点一定是整棵树的根节点.从中序遍历中查找到这个元素,就能够把树分为两颗子树,这个元素左側的递归构造左子树,右 ...

  4. 离线安装.NET 3.5小记

    最近为系统新增一个功能,写完以后进行部署,发现在IIS7上部署没有问题,但是IIS6上部署会出现未知情况,具体表现为取不到数据,估计是IIS6和IIS7直接的差异导致程序异常退出. 为了重现异常,在本 ...

  5. [翻译]Orchard-修改首页布局

    前言 Orchard在你的站点应用的默认主题叫做”Theme Machine”.该主题包括CSS样式和一个布局框架. Orchard 允许你选择或排除显示在你站点每个页面的布局. 默认情况下下图中蓝色 ...

  6. BZOJ 1863: [Zjoi2006]trouble 皇帝的烦恼( 二分答案 )

    二分答案..然后从头到尾推一下, 看最后一个能不能取0个和第一个人相同的勋章 ------------------------------------------------------------- ...

  7. Android操作HTTP实现和服务器通信

    众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post两种方式.至于Socket通信会在以后的博文中介绍. HTTP协议简介: HT ...

  8. c显示数字的LED(数字转LED)

    实现这么一个函数:传入一个int值,在屏幕输出类似LED显示屏效果的字母拼图,例如: 输入1234567890,输出: 请注意每个字符的固定宽度和高度,两个数字间保留一个空格. 函数名:void LE ...

  9. switf资源

    http://www.swiftv.cn/ http://letsswift.com/

  10. 基于visual Studio2013解决C语言竞赛题之0307函数求值

      题目 解决代码及点评 这又是个条件函数,但是这个函数无法用switch来解决,因为switch只能用于和某条件相等情况下,而这个函数的范围是无穷的 遇到这种问题,我们还是需要用复合的if语 ...