3.1.1pinMode(pin,mode)3.1数字I/O3.1.1pinMode(pin,mode)pinMode函数在第2章中已经出现过了,用以配置引脚为输出或输出模式,它是一个无返回值函数,函数有两个参数pin和mode,pin参数表示所要配置的引脚,mode参数表示设置的模式—INPUT(输入)或OUTPUT(输出)。注意:Arduino板上的模拟引脚也可以当做数字引脚使用,编号为14(对应模拟引脚0)到19(对应模拟引脚5)。由于Arduino项目是完全开源的,所以pinMode(pin,mode)函数原型可直接在Arduino开发环境目录下的hardware\arduino\cores\arduino文件夹里的wiring_digital.c文件中查看。函数原型有助于我们深入了解Ardnino的基本函数的底层实现方式,但这部分的内容需要在单独深入学习AVR单片机的基础上进行,本书将这些函数原型从文件中提取出来,有兴趣的读者可以参考一下。一般只要能够熟练地使用这些Arduino基本函数就可以了,本书对函数原型没有进行过多讲解。pinMode(pin,mode)函数原型:voidpinMode(uint8_tpin,uint8_tmode){uint8_tbit=digitalPinToBitMask(pin);uint8_tport=digitalPinToPort(pin);volatileuint8_t*reg;if(port==NOT_A_PIN)return;reg=portModeRegister(port);if(mode==INPUT){uint8_toldSREG=SREG;cli();*reg&=~bit;SREG=oldSREG;}else{uint8_toldSREG=SREG;cli();*reg|=bit;SREG=oldSREG;}}可以在开发环境中的下列实例程序中找到pinMode函数的应用:ADXL3xx.pde、AnalogInput.pde、Blink.pde、BlinkWithoutDelay.pde、Button.pde、Calibration.pde、Debounce.pde、Dimmer.pde、Knock.pde、Loop.pde、Melody.pde、Memsic2125.pde、PhysicalPixel.pde、Ping.pde3.1.2digitalWrite(pin,value)digitalWrite函数也是在Blink程序中见到过的,它的作用是设置引脚的输出的电压为高电平或低电平。该函数也是一个无返回值的函数,函数有两个参数pin和value,pin参数表示所要设置的引脚,value参数表示输出的电压—HIGH(高电平)或LOW(低电平)。注意:在使用digitalWrite(pin,value)函数设置引脚之前,需要将引脚设置为OUTPUT模式。digitalWrite(pin,value)函数原型同样也可以在wiring_digital.c文件中找到,函数原型如下:voiddigitalWrite(uint8_tpin,uint8_tval){uint8_ttimer=digitalPinToTimer(pin);uint8_tbit=digitalPinToBitMask(pin);uint8_tport=digitalPinToPort(pin);volatileuint8_t*out;if(port==NOT_A_PIN)return;//IfthepinthatsupportPWMoutput,weneedtoturnitoff//beforedoingadigitalwrite.if(timer!=NOT_ON_TIMER)turnOffPWM(timer);out=portOutputRegister(port);if(val==LOW){uint8_toldSREG=SREG;cli();*out&=~bit;SREG=oldSREG;}else{uint8_toldSREG=SREG;cli();*out|=bit;SREG=oldSREG;}}可以在开发环境的下列实例程序中找到digitalWrite函数的应用:ADXL3xx.pde、AnalogInput.pde、Blink.pde、BlinkWithoutDelay.pde、Button.pde、Calibration.pde、Debounce.pde、Knock.pde、Loop.pde、Melody.pde、PhysicalPixel.pde、Ping.pde3.1.3digitalRead(pin)digitalRead函数用在引脚为输入的情况下,可以获取引脚的电压情况—HIGH(高电平)或LOW(低电平),参数pin表示所要获取电压值的引脚,该函数返回值为int型,表示引脚的电压情况。函数原型如下:intdigitalRead(uint8_tpin){uint8_ttimer=digitalPinToTimer(pin);uint8_tbit=digitalPinToBitMask(pin);uint8_tport=digitalPinToPort(pin);if(port==NOT_A_PIN)returnLOW;//IfthepinthatsupportPWMoutput,weneedtoturnitoff//beforegettingadigitalreading.if(timer!=NOT_ON_TIMER)turnOffPWM(timer);if(*portInputRegister(port)&bit)returnHIGH;returnLOW;}注意:如果引脚没有链接到任何地方,那么将随机返回HIGH或LOW。可以在开发环境的下列实例程序中找到digitalRead函数的应用:Button.pde、Debounce.pde3.2.1analogReference(type)3.2模拟I/O3.2.1analogReference(type)analogReference函数的作用是配置模拟引脚的参考电压。在嵌入式应用中引脚获取模拟电压值之后,将根据参考电压将模拟值转换到0~1023。该函数为无返回值函数,参数为type类型,有3种类型(DEFAULT/INTERNAL/EXTERNAL),具体含义如下:DEFAULT:默认值,参考电压为5V。INTERNAL:低电压模式,使用片内基准电压源。EXTERNAL:扩展模式,通过AREF引脚获取参考电压,AREF引脚位置见图3.2。注意:如果在AREF引脚加载外部参考电压,需要使用一个5KW的上拉电阻,这会避免由于设置不当造成控制芯片的损坏。3.2.2analogRead(pin)analogRead函数用于读取引脚的模拟量电压值,每读一次需要花100ms的时间。参数pin表示所要获取模拟量电压值的引脚,该函数返回值为int型,表示引脚的模拟量电压值,范围在0~1023。函数原型可在wiring_analog.c文件中查看,如下:intanalogRead(uint8_tpin){uint8_tlow,high;//settheanalogreference(hightwobitsofADMUX)andselect//thechannel(low4bits).thisalsosetsADLAR(left-adjust//result)to0(thedefault).ADMUX=(analog_reference6)|(pin&0x07);//starttheconversionsbi(ADCSRA,ADSC);//ADSCisclearedwhentheconversionfinisheswhile(bit_is_set(ADCSRA,ADSC));//wehavetoreadADCLfirst;doingsolocksbothADCL//andADCHuntilADCHisread.readingADCLsecondwould//causetheresultsofeachconversiontobediscarded,//asADCLandADCHwouldbelockedwhenitcompleted.low=ADCL;high=ADCH;//combinethetwobytesreturn(high8)|low;}注意:函数的参数pin范围是0~5,表示6个模拟量I/O口中的一个。可以在开发环境中的下列实例程序中找到analogRead函数的应用:ADXL3xx.pde、AnalogInput.pde、Calibration.pde、Graph.pde、Knock.pde、Smoothing.pde、VirtualColorMixer.pde3.2.3analogWrite(pin,value)analogWrite函数通过PWM的方式在引脚上输出一个模拟量,较多的应用在LED亮度控制、电机转速控制等方面。PWM(PulseWidthModulation,脉冲宽度调制)方式是通过对一系列脉冲的宽度进行调制,来等效地获得所需要的波形或电压。脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。图3.3是一个简单的PWM波示意图。其中,VCC是高电平值,T是PWM波的周期,D是高电平的宽度,D/T是PWM波的占空比,当上述PWM波通过一个低通滤波器后,波形中高频的部分被滤掉得到所需的波形,其平均电压为VCC×D/T。因此,可通过调节D的大小来改变占空比,产生不同的平均电压;同样,调节PWM波的周期T也可以改变占空比,从而得到不同的平均电压值。在Arduino中执行该操作后,应该等待一定时间后才能对该引脚进行下一次操作。Arduino中的PWM的频率大约为490Hz。该函数支持以下引脚:3、5、6、9、10、11。在Arduino控制板上引脚号旁边标注~的就是可用作PWM的引脚,如图3.4所示。analogWrite函数为无返回值函数,有两个参数pin和value,参数pin表示所要设置的引脚,只能选择函数支持的引脚;参数value表示PWM输出的占空比,范围在0~255的区间,对应的占空比为0%~100%,函数原型如下:voidanalogWrite(uint8_tpin,intval){if(digitalPinToTimer(pin)==TIMER1A){//connectpwmtopinontimer1,channelAsbi(TCCR1A,COM1A1);//setpwmdutyOCR1A=val;}elseif(digitalPinToTimer(pin)==TIMER1B){//connectpwmtopinontimer1,channelBsbi(TCCR1A,COM1B1);//setpwmdutyOCR1B=val;}elseif(digitalPinToTimer(pin)==TIMER0A){if(val==0){digitalWrite(pin,LOW);}else{//connectpwmtopinontimer0,channelAsbi(TCCR0A,COM0A1);//setpwmdutyOCR0A=val;}}elseif(digitalPinToTimer(pin)==TIMER0B){if(val==0){digitalWrite(pin,LOW);}else{//connectpwmtopinontimer0,channelBsbi(TCCR0A,COM0B1);//setpwmdutyOCR0B=val;}}elseif(digitalPinToTimer(