数字输入输出
pinMode(pin, mode)
void pinMode(uint8_t, uint8_t);
在使用输入或输出功能前,你需要先通过pinMode() 函数配置引脚的模式为输入模式或输出模式。
参数
- pin: 为指定配置的引脚编号
- mode: 为指定的配置模式 通常可用模式有三种:
-
INPUT: 输入模式 (DDRx=0xFF)
-
OUTPUT: 输出模式 (DDRx=0x00)
-
INPUT_PULLUP: 输入上拉模式 (DDRx=0xFF;PORTx=0xFF)
-
…
digitalWrite(pin, value)
void digitalWrite(uint8_t, uint8_t);
参数
-
pin: 为指定输出的引脚编号;
-
value: 为你要指定输出的电平
- HIGH: 指定输出高电平(1)
- LOW: 指定输出低电平(0)(PORTx)
…
digitalRead(pin)
int digitalRead(uint8_t);
参数
- pin: 为指定读取状态的引脚编号。(PINx)
返回值
- 获取到的信号状态,1为高电平,0为低电平。
模拟输入输出
…
analogRead(pin)
int analogRead(uint8_t);
模拟输入引脚是带有ADC(Analog-to-Digital Converter,模数转换器)功能的引脚。
它可以将外部输入的模拟信号转换为芯片运算时可以识别的数字信号,从而实现读入模拟值的功能。
模拟输入功能需要使用analogRead() 函数。
参数
- pin: 是指定要读取模拟值的引脚,被指定的引脚必须是模拟输入引脚。
如analogRead(A0),即是读取A0引脚上的模拟值。
返回值
Arduino Uno模拟输入功能有10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示。
…
analogWrite(pin,value)
void analogWrite(uint8_t, int);
使用analogWrite() 函数实现PWM输出功能。
在Arduino Uno中,提供PWM功能的引脚为3、5、6、9、10、11。
在analogWrite() 和analogRead() 函数内部,已经完成了引脚的初始化,因此不用在Setup() 函数中进行初始化操作。
参数
-
pin: 是指定要输出PWM波的引脚;
-
value: 指定是PWM的脉冲宽度,范围为0~255。
…
analogReference()
void analogReference(uint8_t mode);
功能
- 为模拟电压输入设置参考值;
形式
analogReference(type)
参数
-
type有以下几个选项:
- DEFAULT: 默认参考值5v (在5V的 板子上 ) 或者 3.3 v (在3.3V 的Arduino板子上);
- INTERNAL: 内置参考值, 在 ATmega168 或者ATmega328板子上为1.1v;在ATmega8 板子上为2.56v (在Arduino Mega板子上不可获得)。
- INTERNAL1V1: 内置的1.1V 参考值 (只在Arduino Mega板子上有效 )
- INTERNAL2V56: 内置的2.56V 参考值 (只在Arduino Mega板子上有效)
- EXTERNAL: 在AREF引脚加的电压(0到5V)将作为参考值 。 AREF外接电源后不能使用其他的基准源,使用时会引起片内基准源与外部参考源短路
返回值
- -none
注:改变参考值的时候,刚开始的读数可能不准确。
不要用低于0v或高于5v的电压加在AREF引脚。如果使用加在AREF的外部电压作为参考那一定要在调用analogRead()之前设置analogReference为EXTERNAL,否则可能毁坏芯片。
也可以使用一个5千欧的电阻连接外部参考电压到AREF引脚,这样可以方便地在内外参考电压间转换,不过请注意电阻将改变原先你想要的参考值,因为在AREF引脚内部有个32千欧的内置电阻。这样两个电阻就可以分压了,例如:加的是2.5v,那么在AREF引脚的电压就是:2.5 * 32 / (32 + 5) = ~2.2V 。
高级输入输出
tone()
void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0);
tone() 主要用于Arduino连接蜂鸣器或扬声器发声。可以让指定引脚产生一个占空比为50%的指定频率的方波。
语法
…
tone(pin, frequency) tone(pin, frequency, duration)
参数
- pin: 需要输出方波的引脚
- frequency: 输出的频率,unsigned int型
- duration: 方波持续的时间,单位毫秒。如果没有该参数,Arduino将持续发出设定的音调,直到你改变发声频率或者使用noTone() 函数停止发声。
…
noTone(pin)
void noTone(uint8_t _pin);
停止指定引脚上的方波输出。
语法
- noTone(pin)
参数
- pin: 需要停止方波输出的引脚
…
pulseIn()
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);
检测指定引脚上的脉冲信号宽度。
例如当要检测高电平脉冲时,pulseIn() 会等待指定引脚输入的电平变高,当变高后开始记时,直到输入电平变低,停止计时。
pulseln() 函数会返回这个脉冲信号持续的时间,即这个脉冲的宽度。
函数还可以设定超时时间。如果超过设定时间,仍未检测到脉冲,则会退出pulseIn()函数并返回0。
当没有设定超时时间时,pulseIn() 会默认1秒钟的超时时间。
语法
- pulseIn(pin, value)
- pulseIn(pin, value, timeout)
- 参数
- pin:需要读取脉冲的引脚
- value:需要读取的脉冲类型,HIGH或LOW
- timeout:超时时间,单位微秒,数据类型为无符号长整型。
- 返回值
返回脉冲宽度,单位微秒,数据类型为无符号长整型。如果在指定时间内没有检测到脉冲,则返回0。
…
attachInterrupt(pin, ISR, mode)
对中断引脚进行初始化配置,以开启Arduino的外部中断功能
参数
- pin:中断引脚,部分为中断源标号
型号 编号 | int.0 | int.1 | int.2 | int.3 | int.4 | int.5 |
UNO\Ethernet | 2 | 3 | ||||
Mega2560 | 2 | 3 | 21 | 20 | 19 | 18 |
Leonardo | 3 | 2 | 0 | 1 | ||
Due | 所有IO口均可 |
---|
- ISR: 中断函数名
- mode: 中断模式
- LOW: 低电平触发
- CHANGE: 变化时触发
- RISING: 低电平变为高电平时触发
- FALLING: 高电平变低电平时触发
- 示例
attachInterrupt(2, Hello, LOW); 该语句会开启Arduino Uno的 2号引脚(中断编号0)的外部中断功能,并指定下降沿时触发该中断。
当2号引脚上电平由高变低后,该中断会被触发,Arduino即会运行Hello() 函数中的语句。
…
detachInterrupt(pin)
中断分离函数,关闭中断功能。
参数
- pin: 需要禁用中断的引脚。
- 示例
detachInterrupt(2)
外部中断
外部中断控制寄存器- EICRA
ISC11 | ISC10 | ISC01 | ISC00 |
INT0:(ISC11&ISC10) INT1:(ISC01&ISC00)
00:低电平触发
01:逻辑变化触发
10:下降沿触发
11:上升沿触发
外部中断屏蔽寄存器- EIMSK
INT1 | INT0 |
0:中断关闭
1:中断使能
外部中断标志位寄存器- EIFR
INTF1 | INTF0 |
- 示例
…
#define EXINT_LOW 0b00//低电平触发
#define EXINT_CHANGE 0b01//逻辑变化触发
#define EXINT_FALL 0b10//下降沿触发
#define EXINT_RISE 0b11//上升沿触发
void SetInterrupt()//外部中断
{
cli();
// Set EXINT0(pin->PD2), EXINT1(pin->PD3) to Mode INPUT_PULLUP
DDRD &= ~((1 << PD2) | (1 << PD3));
PORTD |= ((1 << PD2) | (1 << PD3));
// Set EXINT Mode to catch FALLING EDGE 下降沿触发中断
EICRA |= (EXINT_FALL << ISC00);
EICRA |= (EXINT_FALL << ISC10);
// Enable EXINT
EIMSK |= ((1 << INT1) | (1 << INT0));//启用外部中断
sei();
}
// EXINT0(p2)
ISR(INT0_vect)
{
}
// EXINT1(p3)
ISR(INT1_vect)
{
}