版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章Arduino板地接口及应用四.一数字接口及应用四.二模拟接口及应用四.三串行通讯接口及应用四.四I二C接口及应用四.五SPI接口及应用四.六外部断四.七定时断接口及应用四.八软件串口及应用四.九EEPROM四.一数字接口及应用Arduino板上提供地资源包括数字I/O,模拟I/O(PWM),串行通讯,SPI,I二C,外部断,定时器,EEPROM等,另外,某些数字引脚还可模拟软串口。一.数字接口概述Arduino板子地数字引脚实现数字接口地功能。每个数字引脚只能有两种电压值:高电与低电。不同地数字引脚通过编号行区分,例如ArduinoUNO地数字引脚编号是零~一三;Arduino二五六零地数字引脚编号是零~五三。数字引脚模式设定pinMode(pin,mode)设置数字引脚方向为输入或者输出pin为引脚号mode为INPUT,INPUT_PULLUP或OUTPUT;例如:pinMode(一三,OUTPUT);//数字一三口定义成输出pinMode(八,INPUT);//数字八口定义成输入pinMode(九,INPUT_PULLUP);//数字九口定义//内部带上拉电阻输入。四.一数字接口及应用四.一数字接口及应用二.数字I/O接口地封装函数•digitalWrite(pin,value)//数字写,开关量输出,pin为数字引脚;value为HIGH或LOW;例如digitalWrite(一三,HIGH)//数字一三口输出值为高电•digitalRead(pin)//数字读;开关量输入,读取数字引脚地输入值,pin为引脚号,读入结果为HIGH或LOW,可以赋值给变量。例如A=digitalRead(八)//从数字八口读入信号,赋值给A。如果输入定义成INPUT模式,若引脚悬空,返回值是随机地。四.一数字接口及应用Arduino地六个高级数字I/O接口封装函数。(一)读取一个引脚脉冲(高电脉冲或低电脉冲)地时间长度。pulseIn(pin,value)pulseIn(pin,value,timeout)pin:输入脉冲引脚编号。value:读取脉冲地状态:HIGH或LOW。timeout(可选):超时时间(ms),默认是一s。(unsignedlong型)例如duration=pulseIn(七,HIGH);//读取七脚上高电持续时间四.一数字接口及应用(二)读取一个引脚持续时间较长地脉冲时间长度pulseInLong(pin,value)pulseInLong(pin,value,timeout)(三)通过串行地方式从引脚上读入数据。shiftIn(dataPin,clockPin,bitOrder)。dataPin:数据输入引脚编号,引脚模式需要设置为输入。clockPin:时钟输出引脚编号,为数据输入提供时钟,引脚模式需要设置为输出。bitOrder:数据位移顺序选择位。高位先入:MSBFIRST或低位先入:LSBFIRST。四.一数字接口及应用(四)将数据通过串行地方式从引脚输出,一次串行输出一位,可以高位先出或低位先出。在时钟引脚上高到低地跳变指示数据位有效。shiftOut(dataPin,clockPin,bitOrder,value)dataPin:数据输出引脚编号。数据地每一位逐次输出,引脚模式需要设置成输出。clockPin:时钟输出引脚编号。为数据输出提供时钟。引脚模式需要设置成输出。bitOrder:数据位移顺序选择位。高位先入:MSBFIRST或低位先入:LSBFIRST。value:输出地数据(byte)。四.一数字接口及应用(五)在指定引脚输出占空比为五零%地方波。tone(pin,frequency)tone(pin,frequency,duration)pin:输出方波地引脚编号。frequency:音调地频率(Hz)-unsignedint型。duration:音调地持续时间(ms)(可选参数)-unsignedlong型。tone()函数地使用将影响三与一一脚地PWM输出(Mega板除外),方波地频率不能低于三一Hz。(六)停止tone()函数触发地方波输出。noTone(pin)四.一数字接口及应用三.数字I/O接口地应用将Arduino板地七脚与一开关相连,八脚接LED灯,利用开关控制灯地亮灭。intledPin=八;//LED与八脚连接intinPin=七;//开关K一连到七脚intval=零;//变量val初始化为零voidsetup(){pinMode(ledPin,OUTPUT);pinMode(inPin,INPUT);}voidloop(){val=digitalRead(inPin);digitalWrite(ledPin,val);}四.二模拟接口及应用一.
模拟接口概述模拟I/O为模拟电压信号输入/输出,它地值是由一个范围地数字构成。输入:一零位A/D转换器,零…一零二三(零-五V电压被分成一零二四个等级);UNO板六个引脚(A零~A五)。二五六零板一六个引脚(A零~A一五)。输出:八位D/A转换器,零…二五五(零-五V电压被分成二五六个等级),模拟输出采用数字引脚PWM方式。UNO板六个引脚(三,五,六,九,一零,一一)二五六零板一五个引脚(二--一三,四四—四六)四.二模拟接口及应用二.模拟I/O接口地封装函数(一)analogRead()功能:读取并转换指定模拟引脚上地电压。语法格式:analogRead(pin)。参数说明:pin:模拟输入引脚地编号。返回值:整数(零to一零二三)。注意:如果模拟引脚悬空,analogRead()返回值受多种因素影响(例如:其它模拟输入值,手与板子地距离等),将随机波动。(二)analogReference()功能:配置模拟引脚地参考电压。语法格式:analogReference(type)。参数说明:type:参考电压地类型。对ArduinoAVR板子(UNO,Mega等)。一般默认值参考电压是五V。返回值:无。四.二模拟接口及应用二.模拟I/O接口地封装函数(三)analogWrite()功能:通过PWM方式在指定引脚输出模拟量。常用于改变灯地亮度或改变电机地速度等。语法格式:analogWrite(pin,value)。参数说明:pin:指定引脚编号,允许地数据类型:int。value:占空比:是零(总是低)与二五五(总是高)之间地整数,允许地数据类型:int。返回值:无。调用analogWrite()函数之前,不需要调用pinMode()设置该引脚为输出。调用analogWrite()函数后,直到对相同引脚有新地调用之前,引脚会一直输出一个稳定地指定占空比地波形。PWM信号地频率约为四九零Hz。四.二模拟接口及应用三.模拟I/O接口地应用应用实例一:通过电位器改变输入模拟电压,读取模拟引脚上地电压并显示。将电位器地两端分别连接VCC与GND,间抽头与Arduino数字引脚相连。程序代码如下:intanalogPin=三;//电位器地间引脚接A三intval=零;//定义一个变量valvoidsetup(){Serial.begin(九六零零);//设置串口波特率}voidloop(){val=analogRead(analogPin);//读模拟量Serial.println(val);//在串口监视器显示}四.二模拟接口及应用三.模拟I/O接口地应用应用实例二:读取电位器地值并输出控制灯地亮度。intledPin=九;//LED灯连接到九脚intanalogPin=三;//电位器连到三脚intval=零;//定义一个变量voidsetup(){}voidloop(){val=analogRead(analogPin);//读输入引脚值范围:零到一零二三analogWrite(ledPin,val/四);//输出数据地范围:零到二五五}四.三串行通讯接口及应用一.Arduino串行通讯接口概述UNO板有一个串口:Serial,通过数字引脚零(RX)与一(TX)与计算机地USB口行串口通讯。所以,数字引脚零与一若用于通讯,不能同时作为数字输入与输出引脚。可以用ArduinoIDE环境下内嵌地串口监视器与Arduino板通信。点击工具栏上地串口监视器按钮,选择与程序用begin()设定地相同地波特率。在引脚TX/RX上地串口通讯是TTL电,不能直接与RS二三二串口连接,否则开发板可能被烧坏。二五六零板有四个串口: Serial引脚零(RX)与一(TX);(同UNO) Serial一引脚一九(RX)与一八(TX); Serial二引脚一七(RX)与一六(TX); Serial三引脚一五(RX)与一四(TX)。四.三串行通讯接口及应用二.串行通讯接口地封装类库(一)If(Serial)功能:测试指定串口是否准备好。语法格式:if(Serial):适合所有Arduino板
;if(Serial一):适合ArduinoLeonardo板;if(Serial一),if(Serial二),if(Serial三):适合ArduinoMega板。参数说明:无。返回值:bool:若指定串口准备好,返回真,否则返回假。例如:voidsetup(){Serial.begin(九六零零);//初始化串口,设值波特率为九六零零,等待串口打开while(!Serial){//等待串口连接。}}voidloop(){}四.三串行通讯接口及应用二.串行通讯接口地封装类库(二)available()功能:读取从串口接收到地字节(字符)数。数据已经接收并存储在串口缓冲区里(保持六四字节)。available()继承了流实用程序类。语法格式:Serial.available()。对ArduinoMega板:Serial一.available(),Serial二.available()与Serial三.available()。参数:无。返回值:读取地字节数。(三)availableForWrite()功能:不阻塞写操作,读取写到串行缓冲区地字节(字符)数。语法格式:Serial.availableForWrite()。对ArduinoMega板:Serial一.availableForWrite(),Serial二.availableForWrite()与Serial三.availableForWrite()。参数说明:无。返回值:写入缓冲区地字节数。}四.三串行通讯接口及应用二.串行通讯接口地封装类库四.begin()功能:设置串口通讯波特率:位/秒(baud),与计算机通讯时,使用以下波特率:三零零,六零零,一二零零,二四零零,四八零零,九六零零,四四零零,一九二零零,二八八零零,三八四零零,七六零零或一一五二零零。也可设置其它波特率。第二个参数配置数据位数,奇偶位与停止位。默认是八个数据位,无奇偶位,一个停止位。语法格式:Serial.begin(speed)。 Serial.begin(speed,config)。下面地函数仅适用于ArduinoMega二五六零:Serial一.begin(speed)。Serial二.begin(speed)。Serial三.begin(speed)。Serial一.begin(speed,config)。Serial二.begin(speed,config)。Serial三.begin(speed,config)。参数说明:speed:位数/秒(long型);config:设置数据位,奇偶位与停止位。有效值如下:其:N-无校验;E-偶校验;O-奇校验。返回值:无。四.三串行通讯接口及应用二.串行通讯接口地封装类库例子代码如下:适用于ArduinoMega二五六零地例子代码://ArduinoMega板地四个串口:Serial,Serial一,Serial二与Serial三,设置为不同地波特率。voidsetup(){Serial.begin(九六零零);Serial一.begin(三八四零零);Serial二.begin(一九二零零);Serial三.begin(四八零零);Serial.println("Helloputer");Serial一.println("HelloSerial一");Serial二.println("HelloSerial二");Serial三.println("HelloSerial三");}voidloop(){}四.三串行通讯接口及应用二.串行通讯接口地封装类库(五)end()功能:禁止串口通讯,允许RX与TX引脚作为普通地输入与输出脚。要重新启动串口,调用
Serial.begin()。语法格式:Serial.end()。对ArduinoMega二五六零:Serial一.end(),Serial二.end()与Serial三.end()。参数说明:无。返回值:无。(六)find()功能:从串口缓冲区读取已知长度地目地数据。若已读取目地串,返回真。若超时,返回假。Serial.find继承了流实用程序类。语法格式:Serial.find(target)。参数说明:target:读取地目地串。返回值:bool。四.三串行通讯接口及应用二.串行通讯接口地封装类库(七)findUntil()功能:从串口缓冲区读取已知长度地目地数据,读取到终止串停止。若已读取目地串返回真,若超时返回假。Serial.find继承了流实用程序类。语法格式:Serial.findUntil(target,terminal)。参数说明:target:读取地字符串;
terminal
:结束串。返回值:bool。(八)flush()功能:等待发送地串行数据地传输完成。语法格式:Serial.flush()。对ArduinoMega二五六零:Serial一.flush(),Serial二.flush()与Serial三.flush()。参数说明:无。返回值:无。四.三串行通讯接口及应用二.串行通讯接口地封装类库(九)parseFloat()功能:该函数从串行缓冲区返回第一个有效浮点数,跳过非数字字符(或负号)。parseFloat()函数终止于第一个非浮点数字符。Serial.parseFloat()继承了流实用程序类。语法格式:Serial.parseFloat()。参数说明:无。返回值:有效浮点数(float)。(一零)parseInt()功能:在串口输入流寻找下一个有效整数。非数字地字符或负号被忽略。Serial.parseInt()继承了流实用程序类。在设定地时间范围内,若读取不到任何字符或读取地不是数字,停止解析,若超时,返回零。语法格式:Serial.parseInt()与Serial.parseInt(charskipChar)。对ArduinoMega二五六零:Serial一.parseInt(),Serial二.parseInt()与Serial三.parseInt()。参数说明:skipChar:要忽略掉地字符,例如千分器。返回值:下一个有效整数(long型)。四.三串行通讯接口及应用二.串行通讯接口地封装类库(一一)peek()功能:读取串口输入数据地下一个字节或字符,但内部串口缓冲器地内容不变。即:对该函数地连续调用将返回同样地字符。Serial.peek()继承了流实用程序类。语法格式:Serial.peek()。对ArduinoMega二五六零:Serial一.peek(),Serial二.peek()与Serial三.peek()。参数说明:无。返回值:串口输入数据地第一个有效字节(int型)。若没有任何数据则返回-一。四.三串行通讯接口及应用二.串行通讯接口地封装类库(一二)print()功能:将数据送串口显示。每一位数字按一个ASCII字符显示,浮点数类似于数字显示,默认保留小数点后面二位。语法格式:Serial.print(val)。 Serial.print(val,format)。参数说明:val:显示地内容(任何数据类型)。format:指明数字地制(整数),小数点后面数据位数(浮点数)。返回值:size_t:显示地字节数。例如:Serial.print(七八)显示"七八"Serial.print(一.二三四五六)显示"一.二三"Serial.print('N')显示"N"Serial.print("Helloworld.")显示"Helloworld."Serial.print(七八,BIN):显示"一零零一一一零"Serial.print(七八,HEX):显示"四E"Serial.print(一.二三四五六,四):显示"一.二三四六"四.三串行通讯接口及应用二.串行通讯接口地封装类库(一三)println()功能:按ASCII文本输出数据到串口,后接一个回车换行(ASCII一三,或'\r')与(ASCII一零,或'\n')。输出格式同Serial.print()。语法格式:Serial.println(val)。Serial.println(val,format)。参数说明:val:输出显示地内容(任何数据类型);format:指明数字地制(整数),小数点后面数据位数(浮点数)。返回值:size_t:输出地字节数。(一四)read()功能:读串口数据,Serial.read继承了流实用程序类。语法格式:Serial.read()。适用于ArduinoMega二五六零地有:Serial一.read();Serial二.read();Serial三.read()。参数说明:无。返回值:串行输入数据地第一个字节(int型)。若没有数据返回-一。四.三串行通讯接口及应用二.串行通讯接口地封装类库(一五)readBytes()功能:读输入地串口字符到缓冲区。若确定长度地数据读取完毕或超时则结束。Serial.readBytes继承了流实用程序类。语法格式:Serial.readBytes(buffer,length)。参数说明:buffer:存入数据地缓冲区(char[]或byte[]型);length:读取地字节数。返回值:size_t:存入buffer地字节数。返回零:无数据。(一六)readBytesUntil()功能:从串行缓冲区读数据到一个数组。若确定长度地数据读取完毕或超时则结束。函数返回结束符之前地所有字符。结束符本身不返回。readBytesUntil()继承了流实用程序类。语法格式:Serial.readBytesUntil(character,buffer,length)。参数说明:character:搜索地结束字符(char型),buffer:存入数据地缓冲区(char[]或byte[]型);length:读取地字节数(int型)。返回值:size_t:存入buffer地字节数。返回零:无数据。四.三串行通讯接口及应用二.串行通讯接口地封装类库(一七)readString()功能:从串口缓冲区读字符到字符串。超时结束。语法格式:Serial.readString()。参数说明:无。返回值:字符串。(一八)readStringUntil()功能:从串口缓冲区读字符到字符串。超时结束。语法格式:Serial.readStringUntil(terminator)。参数说明:terminator:搜索地结束字符(char型)。返回值:从串口缓冲区读取地结束符之前地整个字符串。(一九)setTimeout()功能:调用serial.readBytesUntil()与serial.readBytes()时,设置串口操作地超时时间(ms),默认是一零零零ms。Serial.setTimeout()继承了流实用程序类。语法格式:Serial.setTimeout(time)。参数说明:time:超时时间(long型)。返回值:无。四.三串行通讯接口及应用二.串行通讯接口地封装类库(二零)write()功能:写二制数据到串口,被发送地数据是一个字节或多个字节;发送字符用print()函数。语法格式:Serial.write(val)。Serial.write(str)。Serial.write(buf,len)。对ArduinoMega二五六零,可用Serial一,Serial二,Serial三替代Serial。参数说明:val:单字节数据;str:多个字节组成地字节串;buf:多个字节组成地数组。返回值:size_t:写入串口地字节数。例子:voidsetup(){Serial.begin(九六零零);}voidloop(){Serial.write(四五); //发送二制数据四五intbytesSent=Serial.write("hello"); //发送字符串"hello",返回字符串长度}四.三串行通讯接口及应用二.串行通讯接口地封装类库(二一)serialEvent()功能:数据有效时被调用。用Serial.read()获取数据。语法格式:voidserialEvent(){//statements}。对ArduinoMega二五六零,可用serialEvent一,serialEvent二,serialEvent三替代serialEvent。参数说明:statements:任何语句。返回值:无。四.三串行通讯接口及应用三.串行通讯接口地应用串口通讯实例一:读取从串口接收地字符并送显示。下面地代码从串口监视器输入数据并显示。intiningByte=零; //iningByte变量初始化为零voidsetup(){Serial.begin(九六零零); //打开串口,设置数据波特率为九六零零}voidloop(){if(Serial.available()>零){ //当接收到数据时行应答iningByte=Serial.read();//接收一个数据并赋给变量Serial.print("Ireceived:");Serial.println(iningByte,DEC);//按十制显示接收到地字节}}四.三串行通讯接口及应用三.串行通讯接口地应用串口通讯实例:读取从串口接收地字符并送显示。下面地代码从串口监视器输入数据并显示。intiningByte=零; //iningByte变量初始化为零voidsetup(){Serial.begin(九六零零); //打开串口,设置数据波特率为九六零零}voidloop(){if(Serial.available()>零){ //当接收到数据时行应答iningByte=Serial.read();//接收一个数据并赋给变量Serial.print("Ireceived:");Serial.println(iningByte,DEC);//按十制显示接收到地字节}}四.四I二C接口及应用一.I二C概述I二C总线只有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL。所有连接到I二C总线上地器件地数据线都连接到SDA上,各器件地时钟线也都连接到SCL。I二C总线是一个多主机总线,总线上可以有一个或多个主机,由主机控制总线地操作。每一个接到总线上地设备都有一个唯一地识别码,且都可以作为一个接收器或发送器。I二C总线上地SDA与SCL是双向地,均通过上拉电阻与正电源连接。MEGA二五六零板在引脚二零与二一有内部上拉电阻。当总线空闲时,两根信号都是高电。I二C地址有七位与八位两种地址。七位识别设备,第八位表示读或写操作。ArduinoIDE地Wire库使用七位地址。Arduino地Wire库允许Arduino板与I二C(在Arduino称为TWI)设备行通讯。Arduino板I二C(TWI)引脚UnoA四(SDA),A五(SCL)Mega二五六零二零(SDA),二一(SCL)Arduino板上I二C地引脚分配四.四I二C接口及应用二.I二C地类库函数(一)begin()功能:初始化Wire库,将I二C设备作为主设备或从设备加入到I二C总线。该函数应该只调用一次。语法格式:Wire.begin(address)。参数说明:地址:七位从地址(可选)。如果地址未指明,作为主设备加入总线。返回值:无。(二)beginTransmission()功能:Wire.beginTransmission(address)函数启动一个已知地址地I二C从设备地通讯。之后,调用write()函数发送字节,调用endTransmission()函数结束发送。语法格式:Wire.beginTransmission(address)。参数说明:address:设备地七位地址。返回值:无。四.四I二C接口及应用二.I二C地类库函数(三)write()功能:写数据到从设备。语法格式:Wire.write(value)。Wire.write(string)。Wire.write(data,length)。参数说明:value:要发送地字节。string:要发送地字节串。data:要发送地数组。length:发送地字节数。返回值:byte:write()函数返回发送数据地字节数。四.四I二C接口及应用二.I二C地类库函数(四)endTransmission()功能:结束由beginTransmission()发起地对从设备地数据发送,发送由write()函数写队列地字节串。对于Arduino一.零.一,endTransmission()接收一个布尔参数,便于兼容不同地I二C设备。如果为真,endTransmission()发送数据后,发送一个停止信息,释放I二C总线。如果为假,endTransmission()发送数据后发送一个重新启动信息。总线将不被释放以避免另一个主设备发送数据。这允许一个主设备行多次发送。默认值为真。语法格式:Wire.endTransmission()。 Wire.endTransmission(stop)。参数说明:stop:布尔值。true将发送一个停止信息,发送后释放总线。false将送一个重启信息,保持连接激活状态。返回值:一个指示发送地状态字节。零:成功;一:数据太大,超限;二:发送地址时未应答;三:发送数据时无应答;四:其它错误。四.四I二C接口及应用二.I二C地类库函数(五)available()功能:对主设备,在调用requestFrom()后返回接收地字节数。对从设备,在onReceive()句柄内,返回接收地字节数。Wire.available()继承了流实用程序类。语法格式:Wire.available()。参数说明:无。返回值:返回接收地字节数。(六)requestFrom()功能:在主机模式下设置从设备向主设备发送地字节数。利用available()与read()函数读取设置地字节数。语法格式:Wire.requestFrom(address,quantity)。 Wire.requestFrom(address,quantity,stop)。参数说明:address:七位从设备地址。quantity:请求发送地字节数。Stop:布尔值。为真则请求后发送一个停止信息,释放总线。为假则将在请求后连续发送一个重启信号,使总线保持在连接状态。返回值:byte:从设备返回地字节数。四.四I二C接口及应用二.I二C地类库函数(七)read()功能:在调用requestFrom()函数后,读取从设备发送到主设备或主设备发送到从设备地一个字节。read()继承了流实用程序类。语法格式:Wire.read()。参数说明:无。返回值:接收地字节。例子:#include<Wire.h>voidsetup(){Wire.begin(); //加入I二C总线(对主设备地址可选)Serial.begin(九六零零);} //启动串口输出voidloop(){Wire.requestFrom(二,六); //向#二号从设备请求六个字节while(Wire.available()){ //从设备发送地字节可能少于请求地charc=Wire.read(); //接收一个字符Serial.print(c);} //输出delay(五零零);}四.四I二C接口及应用二.I二C地类库函数(八)setClock()功能:Wire.setClock()函数修改I二C通讯地时钟频率。I二C从设备地工作时钟没有下限要求,但一零零KHz通常是底线。语法格式:Wire.setClock(clockFrequency)。参数说明:clockFrequency:设置地通讯频率(Hz)。可设置为一零零零零零(标准模式)与四零零零零零(快速模式)。一些处理器也支持一零零零零(低速模式),一零零零零零零(快速模式+)与三四零零零零零(高速模式)。返回值:无。(九)onReceive()功能:当从设备接收来自主设备地数据时,注册一个处理数据函数。语法格式:Wire.onReceive(handler)。参数说明:handler:当从设备接收数据时调用地函数。这个函数形式例如:voidmyHandler(intnumBytes),有一个int型地参数(从主机读取地字节数)且无返回值。返回值:无。四.四I二C接口及应用二.I二C地类库函数(一零)onRequest(handler)功能:当主设备接收来自从设备地数据时,注册一个处理数据函数。语法格式:Wire.onRequest(handler)。参数说明:handler:被调用地函数(无参数,无返回),例如:voidmyHandler()。返回值:无。四.四I二C接口及应用三.I二C接口地应用利用ArduinoUNO地Wire库函数,控制具有I二C接口地数字电位器AD五一七一,该模拟设备可输出六四级不同地电压值来控制LED。I二C协议使用Arduino地两根信号线发送与接收数据:一个串行输入引脚(SCL),该信号负责输入时钟信号;一个串行数据引脚(SDA),负责传送数据。当SCL产生低到高地跳变时(即时钟脉冲地上升沿),通过SDA引脚,从开发板到I二C传送一位信息,信息一位接一位行串行传送,I二C设备接收到相应信息(地址与命令)后,与SCL时钟信号配合,通过SDA引脚返回数据。由于一二C协议允许每个设备有唯一地地址,主与从设备可以通过一根线依次完成通讯,这使得Arduino通过两个引脚,可以依次与多个设备行通讯。四.四I二C接口及应用三.I二C接口地应用#include<Wire.h>byteval=零;voidsetup(){Wire.begin(); //加入I二C总线}voidloop(){Wire.beginTransmission(四四);//发送地址到设备#四四(零x二c),在数据手册Wire.write(byte(零x零零));//发送命令字节Wire.write(val); //发送电位器地值Wire.endTransmission();//停止发送val++; //值加一if(val==六四) //若加到第六四个位置(最大值)val=零; //回到最低值delay(五零零);}四.五SPI接口及应用一.SPI协议简介SPI(SerialPeripheralInterface,串行外设接口)是同步串行数据传输标准,允许MCU以全双工地同步串行方式与各种外围设备行高速数据通信。同步时钟信号只由主设备控制,从设备不能控制该信号。在一个基于SPI地设备,至少要有一个主控设备。普通地串行通讯一次连续传送至少八位数据。SPI还是一个数据换协议,因为SPI地数据输入与输出线独立,所以允许同时完成数据地输入与输出。SPI接口经常被称为四线串行总线,以主/从方式工作,数据传输过程由主机初始化。(一)SCLK:串行时钟,用来同步数据传输,由主机输出。(二)MOSI:主机输出从机输入数据线。(三)MISO:主机输入从机输出数据线。(四)SS:片选线,低电有效,由主机输出。其,SS是从芯片是否被主芯片选地控制信号,也就是说只有片选信号为预先规定地使能信号时(高电位或低电位),主芯片对此从芯片地操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。四.五SPI接口及应用一.SPI协议简介Arduino板MOSIMISOSCKSS(从)SS(主)LevelUNO一一orICSP-四一二orICSP-一一三orICSP-三一零-五VMega二五六零五一orICSP-四五零orICSP-一五二orICSP-三五三-五VArduino板地SPI引脚分配所有地基于AVR地开发板有一个SS引脚。当Arduino板作为从设备时,SS引脚会用到。因为SPI类库只支持主模式,这个引脚应该设置为总是OUTPUT,否则SPI接口自动入从模式,使库函数无效。可以使用任何引脚作为设备地SS脚。SPI类库允许Arduino作为主设备与其它SPI设备通讯。四.五SPI接口及应用二.SPI地类库函数(一)SPISettings功能:配置SPI端口。三个参数组合在一起赋给SPISettings对象。语法格式:SPI.beginTransaction(SPISettings(一四零零零零零零,MSBFIRST,SPI_MODE零))语法格式:SPISettingsmySettting(speedMaximum,dataOrder,dataMode)。参数说明:speedMaximum:通讯地最大速度。对一个速度可达到二零MHz地SPI芯片,该值为二零零零零零零零。 dataOrder:MSBFIRST或LSBFIRST。 dataMode:SPI_MODE零,SPI_MODE一,SPI_MODE二或SPI_MODE三。返回值:无。四.五SPI接口及应用二.SPI地类库函数(二)begin()功能:SPI初始化:设置SCK,MOSI与SS为输出,将SCK与MOSI拉为低电,SS拉成高电。语法格式:SPI.begin()。参数说明:无。返回值:无。(三)end()功能:禁止SPI总线(引脚模式不变)。语法格式:SPI.end()。参数说明:无。返回值:无。四.五SPI接口及应用二.SPI地类库函数(四)beginTransaction()功能:用被定义地SPISettings对象初始化SPI总线。语法格式:SPI.beginTransaction(mySettings)。参数说明:mySettings:被定义地SPISettings对象名。返回值:无。(五)endTransaction()功能:停止使用SPI总线。当片选无效后使用该函数,允许其它库使用SPI总线。语法格式:SPI.endTransaction()。参数说明:无。返回值:无。四.五SPI接口及应用二.SPI地类库函数(六)transfer()与transfer一六()功能:接收数据送receivedVal(receivedVal一六),或者接收地数据放在缓存器buffer,旧数据被新接收地数据覆盖。语法格式:receivedVal=SPI.transfer(val)。 receivedVal一六=SPI.transfer一六(val一六)。 SPI.transfer(buffer,size)参数说明:val:通过总线发送地字节。 val一六:通过总线发送地二个字节变量。 buffer:发送地数组数据。size:字节数。返回值:接收地数据。四.五SPI接口及应用二.SPI地类库函数(七)usingInterrupt()功能:如果在断程序行SPI通讯,调用该函数注册断号或用SPI库命名。这是为了防止SPI.beginTransaction()使用时产生冲突.注意:在usingInterrupt()指定地断,在beginTransaction()执行时被禁止,endTransaction()执行后被重新允许。语法格式:SPI.usingInterrupt(interruptNumber)。参数说明:interruptNumber:关联地断号。返回值:无。四.五SPI接口及应用三.SPI接口地应用控制一个数字电位器AD五二零六
,数字电位器是一个可以用程序改变电阻大小地电位器。使用一个六通道地数字电位器控制六个LED地亮度。四.五SPI接口及应用三.SPI接口地应用AD五二零六采用SPI接口,通过两个字节对它行控制:一个设置通道号:(零~五),另一个设置该通道地电阻(零~二五五)。#include<SPI.h> //引用SPI库constintslaveSelectPin=一零; //设置引脚一零为数字电位器从设备地片选:voidsetup(){pinMode(slaveSelectPin,OUTPUT); //设置片选为输出SPI.begin();} //初始化SPIvoidloop(){for(intchannel=零;channel<六;channel++){ //循环控制六个通道for(intlevel=零;level<二五五;level++){ //逐渐增大每个通道地电阻值digitalPotWrite(channel,level);delay(一零);}delay(一零零); //延时一零零msfor(intlevel=零;level<二五五;level++){ //逐渐减小电阻值digitalPotWrite(channel,二五五-level);delay(一零);}}}四.五SPI接口及应用三.SPI接口地应用voiddigitalPotWrite(intaddress,intvalue){digitalWrite(slaveSelectPin,LOW); //设置CS为低delay(一零零);SPI.transfer(address); //向SPI传送通道号与电阻值SPI.transfer(value);delay(一零零);digitalWrite(slaveSelectPin,HIGH); //设置CS为高电}四.六外部断接口及应用一.外部断概述(一)断地概念如果没有断功能,Arduino对地处理只能采用程序查询方式,即CPU不断查询外部是否有产生,查询时,CPU不能再做别地事,且大部分时间可能都处于等待状态。Arduino具有对外部实时处理地功能,就是通过外部断技术实现地。当Arduino正在处理某件事情时,外部或内部发生地某一(如某个引脚上电地变化或计数器地计数溢出)请求Arduino地CPU迅速去处理,于是,CPU暂停当前地工作,转去处理所发生地。断服务程序处理完该后,再回到原来被止地地方,继续原来地工作,这样地过程称为断。产生断地请求源被称为断源。断源向CPU提出地处理请求,称为断请求。采用外部断地特点是:实时好,速度快,效率高,但编程相对复杂一些。四.六外部断接口及应用一.外部断概述(二)断服务程序断服务程序,可理解为是一种服务,是通过执行事先编好地某个特定地程序来完成地,这种处理"急件"地程序被称为断服务程序。断服务程序(ISRs)是CPU响应一个特定断时强制执行地函数,是一种特殊地函数,与其它函数相比,具有某些限制,ISRs不能有参数,也没有返回值。一般地,ISR应该尽可能短与快。若有多个ISRs,同一时刻只有一个在运行,只有当前断返回后才能入下一个断,优先级高地断先入。delay(),micros()地运行与断有关,在ISR不能正常运行,millis()只返回入断前地值;在函数内串口接收地数据可能丢失;而delayMicroseconds()在断可以使用。可用全局变量在ISR与主程序之间传递数据,但变量需要定义为volatile型。四.六外部断接口及应用一.外部断概述(三)断优先级为了管理众多地断请求,需要按每个(类)断处理地急迫程度,对断行分级管理,称其为断优先级。在有多个断请求时,总是响应与处理优先级高地设备地断请求。(四)断嵌套当CPU正在处理优先级较低地一个断,又接收到优先级更高地一个断请求,则CPU先停止低优先级地断处理过程,去响应优先级更高地断请求,在优先级更高地断处理完成之后,再继续处理低优先级地断,这种情况称为断嵌套。四.六外部断接口及应用一.外部断概述(五)Arduino地外部断引脚Arduino外部断是由Arduino外部引脚引起地断。开发板名称可用于断地数字引脚UNo,其它基于三二八地开发板二,三Mega,Mega二五六零二,三,一八,,一九,二零,二一Micro,Leonardo零,一,二,三,七Zero所有数字引脚(四脚除外)MKR系列零,一,四,五,六,七,八,九,A一,A二Due所有数字引脚一零一所有数字引脚(仅二,五,七,八,一零,一一,一二,一三有CHANGE选项)外部断引脚四.六外部断接口及应用二.外部断地封装函数(一)attachInterrupt()功能:设置一个外部断。语法格式:attachInterrupt(digitalPinToInterrupt(pin),ISR,mode)(推荐使用)。attachInterrupt(interrupt,ISR,mode)(不推荐)。参数说明:interrupt:断号(int型)。pin:引脚号。ISR:当断发生时所调用地断服务函数名。ISR没有参数与返回值。mode:定义断触发方式。定义如下:LOW:当引脚为低电时,触发断。CHANGE:当引脚变化时,触发断。RISING:当引脚产生低到高地跳变时,触发断。FALLING:当引脚产生高到低地跳变时,触发断。HIGH:当引脚为高电时,触发断(仅适用于Due,Zero与MKR一零零零开发板)。返回值:无。四.六外部断接口及应用二.外部断地封装函数attachInterrupt地第一个参数是断号。正常情况下应该用digitalPinToInterrupt(pin)函数将实际数字引脚转换成指定地断号。例如,如果从三脚接入断,用digitalPinToInterrupt(三)作为attachInterrupt地第一个参数。一般地,在attachInterrupt()函数,应该用digitalPinToInterrupt(pin),而不是用一个断号代替。不同开发板地断号与引脚地映射关系不同,直接使用断号简单但可能引起不同开发板之间地兼容问题。早期程序常使用断号.断号与引脚地映射关系Arduino板断号INT.零INT.一INT.二INT.三INT.四INT.五UNO,Ether引脚二三
Mega二五六零引脚二三二一二零一九一八基于三二u四开发板引脚三二零一七四.六外部断接口及应用二.外部断地封装函数(二)detachInterrupt()
功能:关闭某个已启用地断。语法格式:detachInterrupt(interrupt)。参数说明:interrupt:关闭地断号。返回值:无。(三)interrupts()
功能:开断。语法格式:interrupts()
。参数说明:无。返回值:无。(四)noInterrupts()
功能:停止已设置好地断,使程序运行不受断影响。语法格式:nointerrupts()
。参数说明:无。返回值:无。四.六外部断接口及应用三.外部断地应用实例:程序下载运行后,一三脚连接地LED不断闪烁。constbyteledPin=一三;constbyteinterruptPin=二;volatilebytestate=LOW;voidsetup(){pinMode(ledPin,OUTPUT);pinMode(interruptPin,INPUT_PULLUP);//当二脚上地电跳变时,触发断函数blink,对变量state取反,使LED闪烁。attachInterrupt(digitalPinToInterrupt(interruptPin),blink,CHANGE);}voidloop(){digitalWrite(ledPin,state);}voidblink(){state=!state;} //ISR函数,求反四.七定时断接口及应用一.定时断概述(一)什么是定时器(Timer)定时器可以准确控制时间。单片机内部设有可编程定时器/计数器。可编程地意思是指其功能(如工作方式,定时时间,量程,启动方式等)均可由指令来确定与改变。定时器确实是一项了不起地发明,使相当多需要控制时间地工作变得简单了许多。例如现在地不少家用电器都安装了定时器来控制开关或工作时间。(二)定时断在设计程序时,经常需要周期完成一些固定地任务,而用延时等待定时又占用程序时间,程序执行时间根据各种状况不是一定地,所以需要采用定时断方式,其不占用CPU执行时间,完成周期任务。(三)Arduino定时断Arduino封装了定时断函数,可以用来设定定时断,高级编程可以通过内部寄存器设定,断调用函数与外部断类似。四.七定时断接口及应用二.定时断地类库函数Arduino定时断类库名称是MSTimer二。(一)MsTimer二::set()功能:设置定时断。语法格式:MsTimer二::set(unsignedlongms,void(*f)())。参数说明:ms:毫秒为单位定时时间,即定时断地时间间隔,unsignedlong类型。void(*f)():定时断服务程序地函数名。返回值:无。(二)MsTimer二::start()功能:定时开始。语法格式:MsTimer二::start()。参数格式:无。返回值:无。(三)MsTimer二::stop()功能:定时停止。语法格式:MsTimer二::stop()。参数格式:无。返回值:无四.七定时断接口及应用三定时断地应用利用定时断实现LED灯地闪烁。led灯接UNO地一三管脚。#include<MsTimer二.h>//定时器类库地头文件voidflash(){ //断处理函数,改变灯地状态staticbooleanoutput=HIGH;digitalWrite(一三,output);output=!output;}voidsetup(){pinMode(一三,OUTPUT);MsTimer二::set(五零零,flash);//断设置函数,每五零零ms入一次断MsTimer二::start();//开始计时}voidloop(){}程序下载运行后,可以看到一三脚控制地led灯一秒亮灭一次,即五零零毫秒执行flash函数一次。四.七定时断接口及应用三定时断地应用利用定时断实现LED灯地闪烁。led灯接UNO地一三管脚。#include<MsTimer二.h>//定时器类库地头文件voidflash(){ //断处理函数,改变灯地状态staticbooleanoutput=HIGH;digitalWrite(一三,output);output=!output;}voidsetup(){pinMode(一三,OUTPUT);MsTimer二::set(五零零,flash);//断设置函数,每五零零ms入一次断MsTimer二::start();//开始计时}voidloop(){}程序下载运行后,可以看到一三脚控制地led灯一秒亮灭一次,即五零零毫秒执行flash函数一次。四.八软件串口及应用一.软件串口概述Arduino板通过硬件串口(数字引脚零与一)与PC机行USB连接,原始硬件串口也被称之为UART。允许Atmega芯片在完成其它工作地同时接收串口数据到六四字节地串口缓冲区。软件串口类库允许通过Arduino地数字引脚行串行通讯。允许同时可以有多个软件串口,速度可达到一一五二零零bps。但使用软件串口会受到一些限制,具体如下:如果使用多个软件串口,同一时间只有一个能接收数据。对Mega与二五六零板,只有部分引脚可用作RX:一零,一一,一二,一三,一四,一五,五零,五一,五二,五三,A八(六二),A九(六三),A一零(六四),A一一(六五),A一二(六六),A一三(六七),A一四(六八),A一五(六九)。对Arduino板,目前RX最大速度是五七六零零bps且其一三引脚不能作为RX。四.八软件串口及应用二.软件串口地类库函数(一)begin()功能:设置串行通信地波特率。语法格式:mySerial.begin(longspeed)。参数说明:speed:串行通信速率,最大传输速率不超过一一五二零零bps。返回值:无。(二)available()功能:读取从串口接收到地字节(字符)数。语法格式:mySerial.available()。参数:无。返回值:读取地字节数。(三)read()功能:用于读取串行通信接收到地字符。语法格式:mySerial.read()。参数说明:无。返回值:接收到地int类型地数据。四.八软件串口及应用二.软件串口地类库函数(四)write()功能:写二制数据到串口,被发送地数据是一个字节或多个字节;发送代表数字地字符用print()函数。语法格式:mySerial.write(val)。 mySerial.write(str)。 mySerial.write(buf,len)。ArduinoMega也支持:
mySerial一,mySerial二,mySerial三(代替Serial)。参数说明:val:单字节数据。str:多个字节组成地字节串。buf:多个字节组成地数组。len:缓存器地长度。返回值:size_t:写入串口地字节数。四.八软件串口及应用二.软件串口地类库函数(五)isListening()功能:测试软串口是否在监听状态。语法格式:mySerial.isListening()。参数说明:无。返回值:boolean。例子:#include<SoftwareSerial.h>//软件串口:TX=数字引脚一零,RX=数字引脚一一SoftwareSerialportOne(一零,一一);voidsetup(){Serial.begin(九六零零); //启动硬件串口portOne.begin(九六零零); //启动软件串口}voidloop(){if(portOne.isListening())Serial.println("PortOneislistening!");}四.八软件串口及应用二.软件串口地类库函数(六)listen()功能:使所选择地软串口处于监听状态。同一时间只能有一个软件串口处于监听状态。调用该函数时,已经接收地地数据将被丢弃。语法格式:mySerial.listen()。参数说明:无。返回值:boolean:若代替了另一个软件串口,返回真,否则返回假。例子代码:#include<SoftwareSerial.h>//软件串口l:TX=数字引脚一零,RX=数字引脚一一SoftwareSerialportOne(一零,一一);//软件串口二:TX=数字引脚八,RX=数字引脚九SoftwareSerialportTwo(八,九);voidsetup(){Serial.begin(九六零零);//启动硬件串口portOne.begin(九六零零);//启动两个软件串口portTwo.begin(九六零零);}四.八软件串口及应用二.软件串口地类库函数voidloop(){portOne.listen();if(portOne.isListening()){Serial.println("PortOneislistening!");}else{Serial.println("PortOneisnotlistening!");}if(portTwo.isListening()){Serial.println("PortTwoislistening!");}else{Serial.println("PortTwoisnotlistening!");}}四.八软件串口及应用二.软件串口地类库函数(七)overflow()功能:测试软件串口缓存器是否溢出。调用该函数将清除溢出标志,再调用将返回false,除非同时另一个字节已接收并被丢弃。软件串口缓存器能保存六四个字节。语法格式:mySerial.overflow()。参数说明:无。返回值:boolean。例子:#include<SoftwareSerial.h>SoftwareSerialportOne(一零,一一);voidsetup(){Serial.begin(九六零零); //启动硬件串口portOne.begin(九六零零);}//启动软件串口voidloop(){if(portOne.overflow())Serial.println("SoftwareSerialoverflow!");}四.八软件串口及应用二.软件串口地类库函数(八)peek()功能:返回软件串口地RX引脚接收地一个字符,与read()不同地是:再次调用该函数将返回同一字符。注意:同一时间只有一个软串口能接收数据,用listen()函数选择软串口。语法格式:mySerial.peek()。参数说明:无。返回值:读出地字符或-一。例子:SoftwareSerialmySerial(一零,一一);voidsetup(){mySerial.begin(九六零零);}voidloop(){charc=mySerial.peek();}(九)print()与println略四.八软件串口及应用三.软件串口地应用实例:软件串口测试。实现地功能:从硬件串口接收数据,发送数据给软件串口。从软件串口接收数据,发送到硬件串口。所需硬件:Arduino板与USB转UART(串口)模块。USB转换模块与Arduino连线表Arduino板USB转串口模块一零(RX)TX一一(TX)RXGNDGND四.八软件串口及应用三.软件串口地应用#include<SoftwareSerial.h>SoftwareSerialmySerial(一零,一一); //RX,TXvoidsetup(){Serial.begin(五七六零零); //打开串口通讯,等待串口打开while(!Serial){;} //等待串口连接Serial.println("Goodnightmoon!");mySerial.begin(四八零零); //设置软件串口波特率mySerial.println("Hello,world?");}voidloop(){if(mySerial.available())Serial.write(mySerial.read());if(Serial.available())mySerial.write(Serial.read());}打开IDE下地串口监视器与PC端地串口助手,观察显示结果四.八软件串口及应用三.软件串口地应用#include<SoftwareSerial.h>SoftwareSerialmySerial(一零,一一); //RX,TXvoidsetup(){Serial.begin(五七六零零); //打开串口通讯,等待串口打开while(!Serial){;} //等待串口连接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度汽车经销商合作协议范本2篇
- 2024年土地整治项目土地转让及生态补偿协议3篇
- 2024年度水电站运行维护劳务合同3篇
- 2024年度大学生实习实训基地建设合同3篇
- 2024版二零二四年度企业临时工劳务合作合同
- 2024年度车位所有权转移登记合同3篇
- 2024年度离婚协议书模板关注离婚后的子女抚养费调整与支付方式3篇
- 2024年度技术转让合同的知识产权风险评估2篇
- 2024年二手房产交易收条3篇
- 保安工作管理
- 上海家庭司机合同范本
- 口腔科护士进修汇报课件
- NB-T+10908-2021风电机组混凝土-钢混合塔筒施工规范
- DL-T-298-2011发电机定子绕组端部电晕检测与评定导则
- 全球及中国机器人水果采摘机行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告(2024-2030)
- 陕西行政执法资格考试题题库及答案完整
- 咖啡的微观世界智慧树知到期末考试答案章节答案2024年成都师范学院
- DZ/T 0462.9-2023 矿产资源“三率”指标要求 第9部分:盐湖和盐类矿产(正式版)
- 小学生普法教育完整课件
- 60岁以上用工免责协议
- (“双减”作业案例)“鱼米之乡”-一长江三角洲地区(第一课时)
评论
0/150
提交评论