版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式微处理器程序设计4.基于Arduino的应用开发
4.1
数字量输入/输出4.2模拟量输入/输出4.3
串行通信4.4
中断处理4.5
其他功能函数4.1
数字量输入/输出所谓数字量是指信号的幅值被限制在0和1两个数值上。因为数字量受噪声的影响较小,且易于数字电路进行处理,所以得到了广泛的应用。在Arduino中,具有数字量特点的通用输入/输出(GeneralPurposeInput/Output,GPIO)引脚被统称为数字引脚,它们分别实现数字输入和数字输出的功能。4.1
数字量输入/输出4.1.1
数字量输入/输出函数4.1.2
编程实例:键控流水灯4.1.1
数字量输入/输出函数ArduinoDue开发板提供了54个数字引脚,引脚编号为0~53,并以数字形式被标识在开发板上的“DIGITAL”区域。同时,为了方便使用数字引脚的功能,Arduino函数库提供了pinMode(pin,mode)、digitalWrite(pin,value)和digitalRead(pin)3种操作函数。1.pinMode(pin,mode)2.digitalWrite(pin,value)3.digitalRead(pin)4.1.2
编程实例:键控流水灯1.实验目的本实验设计一种键控流水灯电路,它通过按键来控制流水灯的流动方向。流水灯的实现原理是将若干个LED灯依次排列,编号顺序为LED1~LEDn;在每个显示周期中,每次仅点亮一盏LED灯。当按键K1按下时,首先点亮LED1,接着依次点亮LED2,LED3,直至点亮LEDn后再重新点亮LED1,依次循环。当按键K2按下时,首先点亮LEDn,依次点亮LEDn-1,LEDn-2,直至点亮LED1后再重新点亮LEDn,依次循环。4.1.2
编程实例:键控流水灯硬件电路本实验的电路连接如图所示。它使用4盏LED灯来实现流水灯,依次编号为LED1~LED4。每盏LED灯的正极首先连接330Ω限流电阻后,接着再分别与ArudinoDue开发板上数字引脚8-11号引脚相连,每盏LED灯的负极接到开发板GND引脚。4.1.2
编程实例:键控流水灯软件程序本实验首先通过digitalRead(pin)函数来查询按键K1和K2的状态,然后通过digitalWrite(pin,value)函数来控制LED的显示状态,从而实现LED灯的流水显示效果。4.1.2
编程实例:键控流水灯intK1Pin=6; //定义按键K1对应的数字引脚号6intK2Pin=7; //定义按键K2对应的数字引脚号7intLED1Pin=8; //定义LED1发光二极管对应的数字引脚号8intLED2Pin=9; //定义LED2发光二极管对应的数字引脚号9intLED3Pin=10; //定义LED3发光二极管对应的数字引脚号10intLED4Pin=11; //定义LED4发光二极管对应的数字引脚号11intLedDir=0; //定义LED灯的流水方向,默认为从右到左4.1.2
编程实例:键控流水灯voidsetup(){pinMode(K1Pin,INPUT); //设置K1为输入模式pinMode(K2Pin,INPUT); //设置K2为输入模式pinMode(LED1Pin,OUTPUT); //设置LED1为输出模式pinMode(LED2Pin,OUTPUT); //设置LED2为输出模式pinMode(LED3Pin,OUTPUT); //设置LED3为输出模式pinMode(LED4Pin,OUTPUT); //设置LED4为输出模式}4.1.2
编程实例:键控流水灯voidloop(){if(~digitalRead(K1Pin))LedDir=1;if(~digitalRead(K2Pin))LedDir=0;if(LedDir){digitalWrite(LED4Pin,LOW);digitalWrite(LED1Pin,HIGH); //LED1显示delay(1000); //延时1sdigitalWrite(LED1Pin,LOW);digitalWrite(LED2Pin,HIGH); //LED2显示delay(1000); //延时1sdigitalWrite(LED2Pin,LOW);digitalWrite(LED3Pin,HIGH); //LED3显示delay(1000); //延时1sdigitalWrite(LED3Pin,LOW);digitalWrite(LED4Pin,HIGH); //LED4显示delay(1000); //延时1s}else{digitalWrite(LED1Pin,LOW);digitalWrite(LED4Pin,HIGH); //LED4显示delay(1000); //延时1sdigitalWrite(LED4Pin,LOW);digitalWrite(LED3Pin,HIGH); //LED3显示delay(1000); //延时1sdigitalWrite(LED3Pin,LOW);digitalWrite(LED2Pin,HIGH); //LED2显示delay(1000); //延时1sdigitalWrite(LED2Pin,LOW);digitalWrite(LED1Pin,HIGH); //LED1显示delay(1000); //延时1s}}4.2
模拟量输入/输出4.2.1
模拟量输入函数4.2.2编程实例:光强度自动报警系统4.2.3
模拟量输出函数4.2.4
编程实例:简易调色LED灯4.2.5
编程实例:三角波发生器4.2.1
模拟量输入函数与数字引脚一样,Arduino将具有模拟信号输入功能的引脚被统称为模拟引脚,引脚编号为A0~A11,并标识在开发板的“ANALOG”区域。每个模拟引脚分别对应模数转换器的一条输入通道。为了方便使用模拟输入引脚的功能,Arduino核心函数库提供了analogReference(type)、analogReadResolution(bits)和analogRead(pin)3种操作函数。4.2.1
模拟量输入函数1.analogReference(type)analogReference(type)函数的功能是设置ADC的基准参考电压,它没有返回值。基准参考电压是ADC的一项技术指标,它与模数转换器输出的数据值呈现出一一对应的线性映射关系,反映了模拟信号的表示范围。4.2.1
模拟量输入函数2.analogReadResolution(bits)数据分辨率是ADC的一项技术指标,它反映了数据采用采样的精度。微处理器(SAM3X8E)芯片内部集成的ADC最高分辨率是12位,也就是说,输出数据的范围是0~4095。4.2.1
模拟量输入函数3.analogRead(pin)analogRead(pin)函数的功能是从指定的模拟输入引脚上读取电压值,它的返回值为整型,返回值的范围由analogReadResolution(bits)函数设定。4.2.2编程实例:光强度自动报警系统
实验目的本实验设计一种光强度自动报警系统,如果光强度超出设定阈值,报警器就会报警。其中,光强度的测量通过光敏电阻器实现,报警器通过有源蜂鸣器实现。4.2.2编程实例:光强度自动报警系统
硬件电路本实验的电路连接图所示。光敏电阻的一端直接与GND相连,另一端同时与10KΩ电阻和ArudinoDue开发板上模拟引脚A0号引脚相连,10K欧姆电阻的另一端与3.3V电源相连。有源蜂鸣器的一端与GND相连,另一端经过50Ω的限流电阻再与PNP型三极管的发射极相连。4.2.2编程实例:光强度自动报警系统
软件程序本实验首先通过analogRead(pin)函数来检测光敏电阻的电阻变化,当测量值达到指定的阀值时,就通过digitalWrite(pin,value)函数来控制有源蜂鸣器处于报警鸣叫状态。4.2.2编程实例:光强度自动报警系统
4.2.3
模拟量输出函数ArduinoDUE开发板提供了两种模拟信号输出方式:脉冲宽度调制(PWM)和数模转换器(DAC)。其中,输出PWM模拟信号通过微处理器芯片内部的定时/计数器来实现。4.2.3
模拟量输出函数1.analogWriteResolution(bits)analogWriteResolution(bits)函数的功能是用来设置数据输出的分辨率,它决定了analogWrite
(pin,value)函数中的参数数据的范围。该函数没有返回值,只有一个参数bits,参数bits的取值范围为1~32。在默认情况下,数据输出的分辨率是8位,数据范围为0~255。4.2.3
模拟量输出函数2.analogWrite(pin,value)analogWrite(pin,value)函数的功能是在指定引脚上输出一路模拟信号,其中,引脚既可以是来自具有PWM功能的数字引脚,也可以是DAC的输出引脚。analogWrite(pin,value)函数没有返回值。它有两个参数pin和value,其中参数pin是具有PWM功能的数字引脚编号,取值范围为2~13,并标识在开发板的PWM区域;或者是模数转换器的2路输出引脚编号,分别为66和67,别名分别为DAC0和DAC1。4.2.3
模拟量输出函数为了更好地匹配数据分辨率,Arduino提供了map(value,fromLow,fromHigh,toLow,toHigh)函数,它可以将数据转换为指定宽度的数据。例如,采集模拟引脚A0上的信号值,并将它的值输出到PWM的第11号引脚上,实现方法如下:intsensorVal=analogRead(A0); //默认情况下,sensorVal是10位analogWriteResolution(8); //设定输出数据分辨率为8位analogWrite(11,map(sensorVal,0,1023,0,255));//sensorVal转换为8位数据4.2.4
编程实例:简易调色LED灯实验目的本实验设计一种可以调色的LED灯,它通过监测调节电位器的电压变化来实现调节LED灯的光线色彩和强弱。电位器的电压值是由analogRead(pin)函数获取,其中电压值的最高3位代表红色,中间3位代表绿色,最低4位代表蓝色,它们用于控制LED灯对应3种色彩的引脚。4.2.4
编程实例:简易调色LED灯硬件电路本实验的电路连接如图4-5所示。5mm三色共阴极LED灯的公共端子连接到ArudinoDue开发板的GND引脚,三色LED灯的红色(R)、绿色(G)和蓝色(B)引脚分别与ArudinoDue开发板上6~8号数字引脚相连。3个电位器的一端连接到ArudinoDue开发板的GND引脚,另一端分别通过10KΩ上拉电阻与2~4号数字引脚相连。4.2.4
编程实例:简易调色LED灯4.2.4
编程实例:简易调色LED灯软件程序本实验首先通过analogRead(pin)函数获取电位器的电压状态,然后通过analogWrite(pin,value)函数输出PWM波形,分别控制LED的R、G和B的输出状态,实现LED灯的变幻效果。4.2.4
编程实例:简易调色LED灯intR_red=6; //电位器对应的数字引脚号6,用于控制LED灯的红色intR_green=7; //电位器对应的数字引脚号7,用于控制LED灯的绿色intR_blue=8; //电位器对应的数字引脚号8,用于控制LED灯的蓝色intLED_red=2; //LED灯的红色发光二极管对应的数字引脚号2intLED_green=3; //LED灯的绿色发光二极管对应的数字引脚号3intLED_blue=4; //LED灯的蓝色发光二极管对应的数字引脚号4voidsetup(){pinMode(R_red,INPUT); //设置R_red为输入模式pinMode(R_green,INPUT); //设置R_green为输入模式pinMode(R_blue,INPUT); //设置LED_green为输入模式pinMode(LED_red,OUTPUT); //设置LED_red为输出模式pinMode(LED_green,OUTPUT); //设置LED_green为输出模式pinMode(LED_blue,OUTPUT); //设置LED_blue为输出模式}voidloop(){intredVal=analogRead(R_red);//默认情况下redVal是10位数据analogWrite(LED_red,map(redVal,0,1023,0,255));//redVal转换为8位数据intgreenVal=analogRead(R_green);analogWrite(LED_green,map(greenVal,0,1023,0,255));intblueVal=analogRead(R_blue);analogWrite(LED_blue,map(blueVal,0,1023,0,255));}4.2.5
编程实例:三角波发生器实验目的本实验设计一种高精度三角波发生器,它通过数模转换器DAC,将一系列数字信号转化为一路模拟信号。三角波(TriangularWave)也被称为锯齿波,它的波形形状呈现为三角形。三角波发生器就是信号源的一种,能够给被测电路提供所需的波形。4.2.5
编程实例:三角波发生器软件程序本实验首先利用analogWrite(pin,value)函数使DAC0引脚输出一路模拟信号,通过不断地改变analogWrite(pin,value)函数中value的参数值,实现调节模拟信号波形的目的。4.2.5
编程实例:三角波发生器voidsetup(){analogWriteResolution(12); //设置DAC的分辨率为12位}voidloop(){intindex;for(index=0;index<4096;index++)analogWrite(DAC0,index); //输出三角波的上升沿for(;index>0;index--)analogWrite(DAC0,index); //输出三角波的下降沿}4.3
串行通信4.3.1
串行通信函数4.3.2
编程实例:回音壁4.3.1
串行通信函数ArduinoDue开发板提供了5个串行通信端口,实现开发板与计算机或其他控制板等设备之间的串行通信。为了方便使用串行通信功能,Arduino定义了5个串行通信端口对象:Serial、Serial1、Serial2、Serial3和serialUSB。4.3.1
串行通信函数4.3.1
串行通信函数1.if(Serial)2.Serial.available()3.Serial.availableForWrite()4.Serial.begin(speed)5.Serial.end()6.Serial.read()7.Serial.peek()8.Serial.readBytes(buffer,length)9.Serial.readBytesUntil(character,buffer,length)10.Serial.readString()4.3.1
串行通信函数11.Serial.readStringUntil(terminator)12.Serial.setTimeout(time)13.Serial.write()14.Serial.print()15.Serial.println()16.Serial.parseFloat()17.Serial.parseInt()18.Serial.find(target)19.Serial.findUntil()20.Serial.serialEvent()4.3.2
编程实例:回音壁实验目的本实验通过ArduinoDue开发板来实现回音壁功能,即ArduinoDue开发板与计算机进行串行通信。计算机通过“串口助手”或Arduino1.6.12自带的串口监控工具,向ArduinoDue开发板发送一个字符。4.3.2
编程实例:回音壁软件程序本实验仅需要使用USB数据线将ArduinoDue开发板与计算机的USBProgrammingPort端口连接起来即可。4.3.2
编程实例:回音壁voidsetup(){//设置串口1的波特率为9600Serial.begin(9600);}voidloop(){//串口1是否接收到字符while(Serial.available()){//获取新字符charinChar=(char)Serial.read();Serial.write(inChar);}}4.4.1
中断处理函数1.noInterrupts()noInterrupts()函数的功能是禁止全局中断。全局中断相当于所有中断的总开关。该函数既没有返回值,也没有参数。在默认情况下,Arduino已经启用了某些重要任务的中断功能,比如时间函数和串口接收数据等。一旦禁止全局中断,这些功能将无法正常工作。4.4.1
中断处理函数2.interrupts()interrupts()函数的功能是使能全局中断,它既没有返回值,也没有参数。使用noInterrupts()函数禁止全局中断以后,如果需要重新使能全局中断,就必须通过调用interrupts()函数来实现。该函数通常与noInterrupts()函数配合使用,主要用来保护关键代码区,使关键代码区不受其他中断事件的影响。4.4.1
中断处理函数3.attachInterrupt(pin,ISR,mode)attachInterrupt(pin,ISR,mode)函数的功能是设置I/O端口的外部中断功能。该函数没有返回值,它有3个参数:pin、ISR和mode。4.4.1
中断处理函数4.detachInterrupt(pin)detachInterrupt(pin)函数的功能是关闭指定引脚的外部中断功能。该函数没有返回值,只有一个参数pin。参数pin表示引脚编号,它是整型。4.4.2
编程实例:键控LED灯实验目的在前面的编程实例中,已经实现了用按键控制LED。处理器通过不断地查询按键端口的状态来实现控制LED灯的目的。这种方式耗费处理器的处理时间,在有些应用场合不太实用。在下面的例子中,通过按键中断的方式来控制LED灯。4.4.2
编程实例:键控LED灯软件程序本实验首先在初始化函数setup()中使用中断注册函数attachInterrupt(pin,ISR,mode)声明外部中断的中断号(引脚号)、中断服务程序和中断模式。然后定义一个全局变量state,state是一个信号标志,表示按键的状态。接着实现中断服务程序blink()函数,blink()函数是一个没有参数和返回值的普通函数,主要用来修改全局变量state的值。最后,在loop()函数中根据全局变量state的值来控制输出电平,从而达到控制LED灯的目的。4.4.2
编程实例:键控LED灯//LED灯对应的引脚号intLED_pin=13;//按键对应的引脚号IntKEY_pin=6;//按键的状态变量volatileintstate=LOW;voidsetup(){//设置LED的控制引脚为输出模式pinMode(LED_pin,OUTPUT);//设置按键的中断方式attachInterrupt(pin,blink,CHANGE);}voidloop(){//通过全局变量state控制LED灯digitalWrite(pin,state);}voidblink(){//更改按键的状态值state=!state;}4.4.3编程实例:中断方式的回音壁实验目的在前面的编程实例中,已经实现了串口通信功能。它的实现原理是首先通过中断方式接收串口数据,并将它存放到缓存队列中;然后判断队列是否为空,再实现相应的功能处理。但在某些应用场合需要对接收的数据进行及时地预处理,因此,上面的方法不适合这种应用需求。这里需要实现自定义的中断接收函数,这种自定义的中断接收函数与键控LED灯的中断处理函数blink()类似。4.4.3编程实例:中断方式的回音壁//接收数据字符串StringinputString="";//接收新行标志booleanstringComplete=false;voidsetup(){//初始化串口,波特率为9600Serial.begin(9600);//接收数据字符的存储空间为200byteinputString.reserve(200);}voidloop(){//判断是否接收到新行if(stringComplete){//输出接收字符串Serial.println(inputString);//清空接收数据字符串inputString="";//设置接收新行标志为假stringComplete=false;}}4.4.3编程实例:中断方式的回音壁voidserialEvent(){while(Serial.available()){//获取新字符charinChar=(char)Serial.read();//将接收字符保存到接收字符串inputString+=inChar;//若新字符为新行符号,设置接收新行标志为真if(inChar=='\n')stringComplete=true;}}4.4.4编程实例:控制中断实验目的在某些应用场合,当一些条件满足之后,外部中断才能执行响应中断操作。一旦失去某些条件,外部中断就停止响应中断操作。在本实验中,通过按键KEY0来控制LED灯,KEY0发生变化产生一次中断。这部分内容与4.4.2小节中编程实例相同。在此基础上,使用拨动开关SW0用来控制按键KEY0中断的使用。当SW0为高电平时,允许按键KEY0中断;当SW0为低电平时,允许按键KEY0中断。同时使用拨动开关SW1来控制总中断的开关。4.4.4编程实例:控制中断硬件电路本实验的电路连接如图所示。LED灯的正极首先连接330Ω限流电阻后,接着再与ArudinoDue开发板上数字引脚7号引脚相连。4.4.4编程实例:控制中断软件程序在本实验中,拨动开关SW1利用interrupts()函数和noInterrupts()函数分别使能和禁止总中断。拨动开关SW1利用attachInterrupt()函数和detachInterrupt()函数,分别开启和关闭指定引脚的中断功能。4.4.4编程实例:控制中断SW1=1、SW0=1(使能总中断、允许KEY0中断)按KEY0按钮,LED灯会发生变化SW1=1、SW0=0(使能总中断、禁止KEY0中断)按KEY0按钮,LED灯不会发生变化SW1=0、SW0=1(禁止总中断、允许KEY0中断)按KEY0按钮,LED灯不会发生变化SW1=0、SW0=1(禁止总中断、允许KEY0中断)按KEY0按钮,LED灯不会发生变化4.4.4编程实例:控制中断//LED灯对应的引脚号7intLED_pin=7;//KEY0_pin按键对应的引脚号intKEY0_pin=43;//拨动开关SW0_pin对应的引脚号intSW0_pin=15;//拨动开关SW1_pin对应的引脚号intSW1_pin=20;//按键的状态变量volatileintstate=LOW;voidsetup(){//设置LED_pin输出pinMode(LED_pin,OUTPUT);//设置SW0_pin为输入pinMode(SW0_pin,INPUT);//设置SW1_pin为输入pinMode(SW1_pin,INPUT);//设置KEY0_pin所生变化产生中断,中断服务函数是blink()attachInterrupt(KEY0_pin,blink,CHANGE);swstate=HIGH;}4.4.4编程实例:控制中断voidloop(){if(digitalRead(SW1_pin))interrupts();//SW1_pin=1时,开总中断elsenoInterrupts();//SW1_pin=0时,关总中断if(digitalRead(SW0_pin)==HIGH)//SW0_pin=1时允许KEY0_pin中断attachInterrupt(KEY0_pin,blink,CHANGE);else//SW0_pin=0时禁止KEY0_pin中断detachInterrupt(KEY0_pin);//控制LED灯digitalWrite(LED_pin,state);}//按键KEY0中断服务函数voidblink(){state=!state;}4.5
其他功能函数4.5.1
时间函数4.5.2
高级IO操作函数4.5.3
编程实例:测量程序的执行时间4.5.4
编程实例:74HC595芯片控制器4.5.1
时间函数millis()micros()delay(ms)delayMicroseconds(us)4.5.2
高级IO操作函数shiftOut()shiftIn()4.5.3
编程实例:测量程序的执行时间实验目的在某些应用中,经常需要判断程序的执行时间是否超过了设定的时间。也就是说,需要测量程序的执行时间。在嵌入式系统中,通常采用定时/计数器来描述时间的流逝程度。定时/计数器的实现机制是周期性地中断处理器,可通过调用中断服务函数来实现。在Arduino程序中,micros()函数与millis()函数具有这种功能。4.5.3
编程实例:测量程序的执行时间unsignedlongstart_time; //开始时间变量unsignedlongstop_time; //停止时间变量unsignedlongtime; //时间间隔voidsetup(){Serial.begin(9600);}voidloop(){Serial.println("本程序用来测量计算机的执行时间!");Serial.println("程序开始执行!");start_time=micros(); //记录程序开始执行时间test
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 子女租房合同范例
- 临时材料购买合同范例
- 创业工位租赁合同范例
- 仓储场地使用合同模板
- 单位用房转让合同范例
- 公益捐款合同范例
- 供求买卖合同范例
- 学校清理垃圾合同范例
- 公司进货合同范例
- 家具购合同范例
- 高中英语外研版高中选修7Scopeandsequence-英语长难句教学反思
- 科技金融项目银行工作总结汇报PPT模板
- 品质异常升级管理规定
- 实验室ISO17025认证推进计划表
- 1.春夏秋冬 教案(两课时)+说课稿+练习(含答案)+素材
- GB 31652-2021 食品安全国家标准 即食鲜切果蔬加工卫生规范
- DBJ41∕T 188-2017 城市轨道交通工程安全监测技术规程
- 新企业会计准则2022年(原文+指南+说明)企业会计准则指南2022
- 29 名著阅读 《西游记》 2022暑假小升初衔接精品导学导练(原卷版+解析版)
- 颅内压增高的临床表现PPT课件
- 接待与会务工作礼仪培训及规范-PPT课件
评论
0/150
提交评论