高级 I/O

tone()

描述:
在一个引脚上产生一个特定频率的方波(50%占空比)。持续时间可以设定,否则波形会一直产生直到调用noTone()函数。该引脚可以连接压电蜂鸣器或其他喇叭播放声音。
在同一时刻只能产生一个声音。如果一个引脚已经在播放音乐,那调用tone()将不会有任何效果。如果音乐在同一个引脚上播放,它会自动调整频率。
使用tone()函数会与3脚和11脚的PWM产生干扰(Mega板除外)。

注意:
如果你要在多个引脚上产生不同的音调,你要在对下一个引脚使用tone()函数前对此引脚调用noTone()函数。

语法:

tone(pin, frequency) 
tone(pin, frequency, duration)

参数:
pin:要产生声音的引脚
frequency: 产生声音的频率,单位Hz,类型unsigned int
duration:声音持续的时间,单位毫秒(可选),类型unsigned long

noTone()

描述:
停止由tone()产生的方波。如果没有使用tone()将不会有效果。

注意:
如果你想在多个引脚上产生不同的声音,你要在对下个引脚使用tone()前对刚才的引脚调用noTone()。

语法:

noTone(pin)

参数:
pin:所要停止产生声音的引脚。

shiftOut()

描述:
将一个数据的一个字节一位一位的移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。

注意:
如果你所连接的设备时钟类型为上升沿,你要确定在调用shiftOut()前时钟脚为低电平,如调用digitalWrite(clockPin, LOW)。
这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。

语法:

shiftOut(dataPin, clockPin, bitOrder, value)

参数:
dataPin:输出每一位数据的引脚(int)
clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)
bitOrder:输出位的顺序,最高位优先或最低位优先
value: 要移位输出的数据(byte)
返回值:

注意:
dataPin和clockPin要用pinMode()配置为输出。shiftOut目前只能输出1个字节(8位),所以如果输出值大于255需要分两步。
//最高有效位优先串行输出
int data = 500;
//移位输出高字节
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));  
// 移位输出高字节
shiftOut(dataPin, clock, MSBFIRST, data);
 
// 最低有效位优先串行输出
data = 500;
// 移位输出低字节
shiftOut(dataPin, clock, LSBFIRST, data);  
// 移位输出高字节
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));

例子:
相应电路,查看tutorial on controlling a 74HC595 shift register

/**************************************************************//
//  Name   : shiftOut代码, Hello World                         //
//  Author  : Carlyn Maw,Tom Igoe                               //
//  Date    : 25 Oct, 2006                                      //
//  Version  : 1.0                                               //
//  Notes   : 使用74HC595移位寄存器从0到255计数           //
//****************************************************************
 
//引脚连接到74HC595的ST_CP
int latchPin = 8;
//引脚连接到74HC595的SH_CP
int clockPin = 12;
////引脚连接到74HC595的DS
int dataPin = 11;
 
void setup() {
  //设置引脚为输出
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
 
void loop() {
  //向上计数程序
  for (int j = 0; j < 256; j++) {
    //传输数据的时候将latchPin拉低
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, j);  
    //之后将latchPin拉高以告诉芯片
    //它不需要再接受信息了
    digitalWrite(latchPin, HIGH);
    delay(1000);
  }
}

shiftIn()

描述:
将一个数据的一个字节一位一位的移入。从最高有效位(最左边)或最低有效位(最右边)开始。对于每个位,先拉高时钟电平,再从数据传输线中读取一位,再将时钟线拉低。

注意:
这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。

语法:

shiftIn(dataPin,clockPin,bitOrder)

参数:
dataPin:输出每一位数据的引脚(int)
clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)
bitOrder:输出位的顺序,最高位优先或最低位优先
返回值:
读取的值(byte)

pulseIn()

描述:
读取一个引脚的脉冲(HIGH或LOW)。例如,如果value是HIGH,pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。返回脉冲的长度,单位微秒。如果在指定的时间内无脉冲函数返回。
此函数的计时功能由经验决定,长时间的脉冲计时可能会出错。计时范围从10微秒至3分钟。(1秒=1000毫秒=1000000微秒)
语法:

pulseIn(pin, value) 
pulseIn(pin, value, timeout)

参数:
pin:你要进行脉冲计时的引脚号(int)
value:要读取的脉冲类型,HIGH或LOW(int)
timeout (可选):指定脉冲计数的等待时间,单位为微秒,默认值是1秒(unsigned long)
返回值:
脉冲长度(微秒),如果等待超时返回0(unsigned long)
例子:

int pin = 7;
unsigned long duration;
 
void setup()
{
  pinMode(pin, INPUT);
}
 
void loop()
{
  duration = pulseIn(pin, HIGH);
}