1.数字I/O:LED
在线编译的参考程序如下:
#include <rxduino.h>
#define INTERVAL 100
void setup()
{
pinMode(PIN_LED0,OUTPUT);
pinMode(PIN_LED1,OUTPUT);
pinMode(PIN_LED2,OUTPUT);
pinMode(PIN_LED3,OUTPUT);
}
void loop()
{
digitalWrite(PIN_LED0, 1);
delay(INTERVAL);
digitalWrite(PIN_LED1, 1);
delay(INTERVAL);
digitalWrite(PIN_LED2, 1);
delay(INTERVAL);
digitalWrite(PIN_LED3, 1);
delay(INTERVAL);
digitalWrite(PIN_LED0, 0);
delay(INTERVAL);
digitalWrite(PIN_LED1, 0);
delay(INTERVAL);
digitalWrite(PIN_LED2, 0);
delay(INTERVAL);
digitalWrite(PIN_LED3, 0);
delay(INTERVAL);
}
以上就是开发板的管教分配
数字I/O教程二:LED闪烁
LED(发光二极管),能将电能转化为光能,也具有单向导电性,反向击穿电压约为5V。它的正向伏安特性曲线很陡,使用时必须串连限流电阻,在5V的电路中一般使用400欧姆左右的电阻。LED的两根引脚中较长的一根是正极,较短的一根为负极。
程序代码如下:
/*GR-SAKURA Sketch Template Version: V1.02*/
#include <rxduino.h>
#define INTERVAL 300
int ledPin=13;
void setup()
{
pinMode(ledPin,OUTPUT);
}
void loop()
{
digitalWrite(ledPin, 1);
delay(INTERVAL);
digitalWrite(ledPin, 0);
delay(INTERVAL);
}
LED闪灯可以有很多的玩法,本实验目的只是在于验证数字I/O的输出,如果有方便的数字示波器的话,可以用示波器观测到一个方波,周期是600ms,delay(ms),delay函数的延时是以毫秒为单位的,这就非常方便时间的定义,用过c51单片机的人都知道,51中要自己定义延时函数,对于准确的定时还要去模拟仿真,所以学到sakura就感觉到了太方便了。
Arduino的优势在于对数字信号的识别和处理,但我们所生活的真实世界并不是数字(digital)化的,简单到只要用0和1就能够表示所有的现象。例如温度这一我们已经司空见惯的概念,它只能在一个范围之内连续变化,而不可能发生像从0到1这样的瞬时跳变,类似这样的物理量被人们称为是模拟(analog)的。Arduino是无法理解这些模拟量的,它们必须在经过模数转换后变成数字量后,才能被Arduino进一步处理。
像温度这样的数据必须先被转换成微处理器能够处理的形式(比如电压),才能被Arduino处理,这一任务通常由各类传感器(sensor)来完成的。例如,电路中的温度传感器能够将温度值转换成0V到5V间的某个电压,比如0.3V、3.27V、4.99V等。由于传感器表达的是模拟信号,它不会像数字信号那样只有简单的高电平和低电平,而有可能是在这两者之间的任何一个数值。至于到底有多少可能的值则取决于模数转换的精度,精度越高能够得到的值就会越多。
Arduino所采用的ATmega8微处理器一其有6个模数转换器(ADC,Analog to Digital Converter),每一个模数转换器的精度都是10bit,也就是说能够读取1024(2^10 = 1024)个状态。在Arduino的每一个模拟输入管脚上,电压的变化范畴是从0V到5V,因此Arduino能够感知到的最小电压变化是4.8毫伏(5/1024 = 4.8mV)。
电位计(potentiometer)是一种最简单的模拟输入设备,它实际上就是一个可变电阻箱,通过控制滑块所在的位置我们可以得到不同的电压值,而输入信号正是从滑块所在的位置接入到电路中的。
这一实验我们将通过改变电位计的值来控制发光二极管闪烁的频率。电位计上一共有三个管脚,分别连接到Arduino的电源、地和模拟输入的5号管脚上,发光二极管则连接到数字I/O的13号管脚上,原理图如下所示:
相应的代码为:
/*GR-SAKURA Sketch Template Version: V1.02*/
#include <rxduino.h>
int ledPin=13;
int potPin=5;
int value=0;
void setup()
{
pinMode(ledPin,OUTPUT);
}
void loop()
{
value=analogRead(potPin);
digitalWrite(ledPin, HIGH);
delay(value);
digitalWrite(ledPin, LOW);
delay(value);
}
在Arduino中,对模拟输入端口不需要调用pinMode()函数将其指定为输入或者是输出模式,这点同数字I/O端口是有所不同的。
通过旋转电位计的轴,我们能改变电位计中间那根连线同地之间的电阻量,从而也就能改变从模拟输入的5号管脚上所读入的模拟量的值。当电位计完全旋转到头时,输入到模拟输入管脚上的电压为0V,用analogRead()函数读出的值为0;当电位计完全旋转到另一头时,输入到模拟I/O管脚上的电压为5V,此时用analogRead()函数读出的值为1023;当电位计旋转到中间的某个位置时,输入到模拟输入管脚上的电压是0V到5V之间的某个值,而用analogRead()函数读出的则是位于0到1023之间的某个对应值。读出的模拟量在我们的实验中被用来确定发光二极管点亮和熄灭的时间,以反映模拟量的变化。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 |