本节书摘来华章计算机《Arduino开发实战指南:机器人卷》一书中的第2章 ,第2.3节,黄文恺 伍冯洁 陈 虹 编著更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.3 高级I/O
2.3.1 PulseIn(pin,state,timeout)
PulseIn函数用于读取指定引脚的脉冲持续的时间长度,该函数返回值类型为无符号长整型(unsigned long),单位为ms,如果超时没有读到的话,则返回0。
PulseIn函数包含3个参数pin、state、timeout。参数pin代表脉冲输入的引脚;参数state代表脉冲响应的状态,脉冲可以是HIGH或者LOW,如果是HIGH,则PulseIn函数将先等引脚变为高电平,然后开始计时,一直到变为低电平;参数timeout代表超时时间。
做一个按钮脉冲计时器,测一下按钮的时间,测测谁的反应快,看谁能按出最短的时间,其中按钮接引脚3。示例程序如下:
int button=3;
int count;
void setup()
{
pinMode(button,INPUT);
}
void loop()
{
count=pulseIn(button,HIGH);
if(count!=0)
{
Serial.println(count,DEC);
count=0;
}
}
2.3.2 shiftOut(dataPin,clockPin,bitOrder,val)
shiftOut函数的作用是将一个数据的一个字节一位一位地移出,它是一个无返回值函数。从最高有效位(最左边)或最低有效位(最右边)开始,依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。
shiftOut函数包括4个参数dataPin、clockPin、bitOrder、val,其具体含义如下。
- dataPin:输出每一位数据的引脚,引脚需配置成输出模式。
- clockPin:时钟脚,当dataPin有数据时,此引脚电平会发生变化,引脚需配置成输出模式。
- bitOrder:输出位的顺序,有最高位优先(MSBFIRST)和最低位优先(LSBFIRST)两种方式。
- val:所要输出的数据值,该数据值将以byte形式输出。
从相应引脚输出500的示例程序如下,其中dataPin接引脚11,clockPin接引脚12,按最低位优先输出方式:
int dataPin = 11;
int clockPin = 12;
int data = 500;
void setup()
{
pinMode(dataPin, OUTPUT); // 设置引脚为输出
pinMode(clockPin, OUTPUT); // 设置引脚为输出
}
void loop()
{
shiftOut(dataPin,clockPin,LSBFIRST,data); // 移位输出低字节
shiftOut(dataPin,clockPin,LSBFIRST,data>>8); // 移位输出高字节
}
注意
shiftOut目前只能输出1个字节(8位),所以如果输出值大于255需要分两步。