arduino编程参考手册中文Word文档下载推荐.docx
《arduino编程参考手册中文Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《arduino编程参考手册中文Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
只有在两个操作数都为真时才返回真,例如:
if(digitalRead
(2)==HIGH&
digitalRead(3)==HIGH){.
}
只在两个输入都为高时返回真
||(逻辑或)
任意一个为真时返回真,例如:
if(x>
0||y>
0){
.
x或y任意一个大于0时返回真
!
(非)
当操作数为假时返回真,例如:
if(!
x){
若x为假返回真(即如果x等于0)
警告
确保你没有把布尔与运算符,&
(两个与符号)错认为按位与运算符&
(单个与符号)。
它们是完全不同的概念。
同样,不要混淆布尔或运算符||(双竖杠)与按位或运算符|(单竖杠)。
按位取反~(波浪号)看起来与布尔非!
有很大不同(感叹号或程序员口中的“棒”),但是你仍然必须确保在什么地方用哪一个。
例如
if(a>
=10&
a<
=20){}
在a和b的16位的每一位将使用按位与处理。
且所有16位结果存入C中,以二进制存入的结果值01000100,即十进制的68。
按位与的其中一个最常用的用途是从一个整型数中选择特定的位,常被称为掩码屏蔽。
看如下示例:
位或
按位或(|)
在C++中按位或运算符是垂直的条杆符号,|。
就像&
运算符,|独立地计算它周围的两个整型表达式的每一位。
(当然)它所做的是不同的(操作)。
两个输入位其中一个或都是1按位或将得到1,否则为0。
换句话说:
0011operand1
0101operand2
----------
0111(operand1|operand2)-returnedresult
这是一个使用一小断C++代码描述的按位或(运算)的例子:
inta=92;
按位与和按位或的一个共同的工作是在端口上进行程序员称之为读-改-写的操作。
在微控制器中,每个端口是一个8位数字,每一位表示一个引脚的状态。
写一个端口可以同时控制所有的引脚。
PORTD是内建的参照数字口0,1,2,3,4,5,6,7的输出状态的常量。
如果一个比特位是1,那么该引脚置高。
(引脚总是需要用pinMode()指令设置为输出模式)。
所以如果我们写入PORTD=B00110001;
我们就会让引脚2,3和7输出高。
一个小小的问题是,我们同时也改变了某些引脚的0,1状态。
这用于Arduino与串口通讯,所以我们可能会干扰串口通讯。
我们的程序规则是:
仅仅获取和清除我们想控制的与相应引脚对应的位(使用按位与)。
合并要修改的PORTD值与所控制的引脚的新值(使用按位或)。
inti;
1<
<
8==256
9==512
10==1024
...
当把x右移y位,x的最高位为1,该行为依赖于x的确切的数据类型。
如果x的类型是int,最高位为符号位,决定x是不是负数,正如我们在上面已经讨论过的。
在这种情况下,符号位会复制到较低的位:
intx=-16;
复合运算符
自加++
i++;
PI.
#defineHALF_PI
二分之一PI
#defineTWO_PI
二倍PI
#defineDEG_TO_RAD
弧度转角度
#defineRAD_TO_DEG
角度转弧度
整型常量
整数常量
整数常量是直接在程序中使用的数字,如123。
默认情况下,这些数字被视为int,但你可以通过U和L修饰符进行更多的限制(见下文)。
通常情况下,整数常量默认为十进制,但可以加上特殊前缀表示为其他进制。
进制例子格式备注
10(十进制)123无
2(二进制)B1111011前缀'
B'
只适用于8位的值(0到255)字符0-1有效
8(八进制)0173前缀”0”字符0-7有效
16(十六进制)0x7B前缀”0x”字符0-9,A-F,A-F有效
小数是十进制数。
这是数学常识。
如果一个数没有特定的前缀,则默认为十进制。
二进制以2为基底,只有数字0和1是有效的。
示例:
10105;
浮点数可以用科学记数法表示。
'
E'
和'
e'
都可以作为有效的指数标志。
浮点数被转换为被转换为
10
*10^5234000
67E-12*10^-12
数据类型
void
void只用在函数声明中。
它表示该函数将不会被返回任何数据到它被调用的函数中。
例子
.
}
voidloop()
boolean
布尔
一个布尔变量拥有两个值,true或false。
(每个布尔变量占用一个字节的内存。
)
intLEDpin=5;
inti;
for(intj=0;
j<
100;
j++){
..
x=pi*2;
78N110n
1547/79O111o
1648080P112p
1749181Q113q
1850282R114r
1951383S115s
2052484T116t
2153585U117u
2254686V118v
2355787W119w
2456888X120x
2557989Y121y
2658:
90Z122z
2759;
91[123{
2860<
92\124|
2961=93]125}
3062>
94^126~
3163?
95_127
基本函数
(本节由柴树杉[翻译整理]))
数字I/O
pinMode()
voidpinMode(uint8_tpin,uint8_tmode)
设置引脚模式
配置引脚为输出或输出模式.
参数:
pin引脚编号
mode:
INPUT,OUTPUT,或INPUT_PULLUP.
例子:
intledPin=13;
digitalWrite()
voiddigitalWrite(uint8_tpin,uint8_tvalue)
写数字引脚
写数字引脚,对应引脚的高低电平.在写引脚之前,需要将引脚设置为OUTPUT模式.
valueHIGH或LOW
用法:
digitalRead()
intdigitalRead(uint8_tpin)
读数字引脚
读数字引脚,返回引脚的高低电平.在读引脚之前,需要将引脚设置为INPUT模式.
返回:
HIGH或LOW
模拟I/O
analogReference()
voidanalogReference(uint8_ttype)
配置参考电压
配置模式引脚的参考电压.函数analogRead在读取模拟值之后,将根据参考电压将模拟值转换到[0,1023]区间.有以下类型:
DEFAULT:
默认5V.INTERNAL:
低功耗模式.ATmega168和ATmega8对应到.EXTERNAL:
扩展模式.通过AREF引脚获取参考电压.
type参考类型(DEFAULT/INTERNAL/EXTERNAL)
analogRead()
intanalogRead(uint8_tpin)
读模拟引脚
读模拟引脚,返回[0-1023]之间的值.每读一次需要花1微妙的时间.
0到1023之间的值
intanalogPin=3;
可以用来控制LED的亮度,或者控制电机的转速.在执行该操作后,应该等待一定时间后才能对该引脚进行下一次的读或写操作.PWM的频率大约为490Hz.
在一些基于ATmega168的新的Arduino控制板(如Mini和BT)中,该函数支持以下引脚:
3,5,6,9,10,11.在基于ATmega8的型号中支持9,10,11引脚.
intledPin=9;
其中dataPin为连接DS的引脚号,clockPin为连接SH_CP的引脚号,bitOrder为设置数据位移顺序,分别为高位先入MSBFIRST或者低位先入LSBFIRST.
dataPin数据引脚
clockPin时钟引脚
bitOrder移位顺序(MSBFIRST或LSBFIRST)
val数据
如果是HIGH,函数将先等引脚变为高电平,然后开始计时,一直到变为低电平为止.返回脉冲持续的时间长短,单位为毫秒.如果超时还没有读到的话,将返回0.
state脉冲状态
timeout超时时间
下面的例子演示了统计高电平的继续时间:
intpin=7;
unsignedlongduration;
voidsetup()
pinMode(pin,INPUT);
duration=pulseIn(pin,HIGH);
时间
millis()
unsignedlongmillis(void)
毫秒时间
获取机器运行的时间长度,单位毫秒.系统最长的记录时间为9小时22分,如果超出时间将从0开始.
警告:
时间为unsignedlong类型,如果用int保存时间将得到错误结果:
delay(ms)
voiddelay(unsignedlongms)
延时(毫秒)
延时,单位毫秒(1秒有1000毫秒).
参数为unsignedlong,因此在延时参数超过32767(int型最大值)时,需要用"
UL"
后缀表示为无符号长整型,例如:
delay(60000UL);
.同样在参数表达式,切表达式中有int类型时,需要强制转换为unsignedlong类型,例如:
delay((unsignedlong)tdelay*100UL);
一下例子设置13引脚对应的LED等以1秒频率闪烁:
如果延时的时间有几千微妙,那么建议使用delay函数.目前参数最大支持16383微妙(不过以后的版本中可能会变化).
以下代码向第8号引脚发送脉冲,每次脉冲持续50微妙的时间.
intoutPin=8;
例如:
sensVal=min(sensVal,100);
max()
#definemax(a,b)((a)>
(b)?
(a):
(b))
最大值
取两者之间最大值.例如:
sensVal=max(senVal,20);
一般可以用于将值归一化到某个区间.
例如:
sensVal=constrain(sensVal,10,150);
x要映射的值
in_min映射前区间
in_max映射前区间
out_min映射后区间
out_max映射后区间
例如下面的代码中用map将模拟量从[0,1023]映射到[0,255]区间:
随机种子的设置对产生的随机序列有影响.
seed随机种子
random()
longrandom(longhowbig)
生成随机数
生成[0,howbig-1]范围的随机数.
howbig最大值
longrandom(longhowsmall,longhowbig)
生成[howsmall,howbig-1]范围的随机数.
howsmall最小值
位操作
#definelowByte(w)((w)&
0xff)
外部中断有0和1两种,一般对应2号和3号数字引脚.
interrupt中断类型,0或1
fun对应函数
mode触发方式.有以下几种:
LOW低电平触发中断
CHANGE变化时触发中断
RISING低电平变为高电平触发中断
FALLING高电平变为低电平触发中断
注解:
在中断函数中delay函数不能使用,millis始终返回进入中断前的值.读串口数据的话,可能会丢失.中断函数中使用的变量需要定义为volatile类型.
下面的例子如果通过外部引脚触发中断函数,然后控制LED的闪烁.
intpin=13;
volatileintstate=LOW;
pinMode(pin,OUTPUT);
attachInterrupt(0,blink,CHANGE);
digitalWrite(pin,state);
voidblink()
state=!
state;
detachInterrupt()
voiddetachInterrupt(uint8_tinterruptNum)
取消中断
取消指定类型的中断.
interrupt中断的类型.
interrupts()
#defineinterrupts()sei()
开中断
voidsetup(){}
noInterrupts();
发送"
Helloworld."
可选的第二个参数用于指定数据的格式。
允许的值为:
BIN(binary二进制),OCT(octal八进制),DEC(decimal十进制),HEX(hexadecimal十六进制)。
对于浮点数,该参数指定小数点的位数。
例如:
(78,BIN)gives"
1001110"
(78,OCT)gives"
116"
(78,DEC)gives"
78"
(78,HEX)gives"
4E"
0)gives"
1"
2)gives"
"
4)gives"
你可以用F()把待发送的字符串包装到flash存储器。
(F(“HelloWorld”))
要发送单个字节数据,请使用()。
语法:
(val)
(val,format)
参数:
val:
要发送的数据(任何数据类型)
format:
指定数字的基数(用于整型数)或者小数的位数(用于浮点数)。
返回值:
>
size_t(long):
print()返回发送的字节数(可丢弃该返回值)。
/*
UsesaFORloopfordataandprintsanumberinvariousformats.
*/
intx=0;
//variable
voidsetup(){
(9600);
//opentheserialportat9600bps:
voidloop(){
//printlabels
("
NOFORMAT"
);
//printsalabel
\t"
//printsatab
DEC"
HEX"
OCT"
BIN"
for(x=0;
x<
64;
x++){//onlypartoftheASCIIchart,changetosuit
//printitoutinmanyformats:
(x);
//printasanASCII-encodeddecimal-sameas"
(x,DEC);
//printasanASCII-encodeddecimal
(x,HEX);
//printasanASCII-encodedhexadecimal
(x,OCT);
//printasanASCII-encodedoctal
(x,BIN);
//printasanASCII-encodedbinary
//thenaddsthecarriagereturnwith"
println"
delay(200);
//delay200milliseconds
}
//printsanothercarriagereturn
编程技巧:
在版本时,串口传输是异步的,()会在数据发送完成前返回。
println()
往串口发数据,类似(),但有换行
write()
写二进制数据到串口,数据是一个字节一个字节地发送的,若以字符形式发送数字请使用print()代替。
(str)
(buf,len)
ArduinoMega也支持:
Serial1,Serial2,Serial3(在Serial的位置)
作为单个字节发送的数据
str:
由一系列字节组成的字符串
buf:
同一系列字节组成的数组
len:
要发送的数组的长度
返回:
byte
write()会返回发送的字节数,所以读取该返回值是可选的。
voidsetup(){
voidloop(){
(45);
//以二进制形式发送数字45
intbytesSent=(“hello”);
//发送字符串“hello”并返回该字符串的长度。
peak()
描述:
返回收到的串口数据的下一个字节(字符),但是并不把该数据从串口数据缓存中清除。
就是说,每次成功调用peak()将返回相同的字符。
与read()一样,peak()继承自Stream实用类。
语法:
可参照()
serialEvent()
当串口有数据到达时调用该函数(然后使用()捕获该数据)。
注意:
目前serialEvent()并不兼容于Esplora,Leonardo,或Micro。
voidserialEvent(){
//statements
ArduinoMegaonly:
voidserialEvent1(){
voidserialEvent2(){
voidserialEvent3(){
statements可以是任何有效的语句。