Arduino库基础函数 | 您所在的位置:网站首页 › arduinoloop函数 › Arduino库基础函数 |
文章目录
前言一、程序结构1.setup()2.loop()
二、常量宏定义三、数字 I/O1.pinMode()2.digitalWrite()3.digitalRead()
四、模拟 I/O1.analogRead()2.analogReference()3.analogWrite()
五、高级 I/O1.shiftOut()2.pulseIn()
六、时间函数1.millis()2.delay()3.delayMicroseconds()
七、中断函数1.attachInterrupt()2.detachInterrupt()3.interrupts()4.noInterrupts()
八、串口通讯1.begin()2.available()3.read()4.flush()5.print()6.println()7.write()8.peak()9.serialEvent()
总结
前言
提示:以下是本篇文章正文内容 一、程序结构在 Arduino 中, 标准的程序入口 main 函数在内部被定义, 用户只需要关心以下两个函数: loop() 和setup() 1.setup()当 Arduino 板起动时 setup()函数会被调用。用它来初始化变量,引脚模式,开始使用某个库。该函数在 Arduino 板的每次上电和复位时只运行一次 2.loop()在创建 setup 函数,该函数初始化和设置初始值, loop()函数所做的事,连续循环,允许你的程序改变状态和响应事件。可以用它来实时控制 arduino 板 二、常量宏定义#define HIGH 0x1 高电平 #define LOW 0x0 低电平 #define INPUT 0x0 输入 #define OUTPUT 0x1 输出 #define true 0x1 真 #define false 0x0 假 #define PI 3.14159265 PI. #define HALF_PI 1.57079 二分之一 PI #define TWO_PI 6.283185 二倍 PI #define DEG_TO_RAD 0.01745329 弧度转角度 #define RAD_TO_DEG 57.2957786 角度转弧度 三、数字 I/O 1.pinMode()void pinMode (uint8_t pin, uint8_t mode) 设置引脚模式,配置引脚为输出或输出模式 pin:引脚编号 mode: INPUT, OUTPUT, 或 INPUT_PULLUP 点亮LED,连接到13引脚 int ledPin = 13; // LED connected to digital pin 13 void setup() { pinMode(ledPin, OUTPUT); // sets the digital pin as output } void loop() { digitalWrite(ledPin, HIGH); // sets the LED on delay(1000); // waits for a second digitalWrite(ledPin, LOW); // sets the LED off delay(1000); // waits for a second }注:模拟引脚也可以当作数字引脚使用, 编号为 14(对应模拟引脚 0)到 19(对应模拟引脚 5) 2.digitalWrite()void digitalWrite (uint8_t pin, uint8_t value) 设置引脚的高低电平, 在写引脚之前, 需要将引脚设置为 OUTPUT模式 value :HIGH 或 LOW 3.digitalRead()int digitalRead (uint8_t pin) 读取引脚的高低电平,在读引脚之前, 需要将引脚设置为INPUT模式 注:如果引脚没有链接到任何地方, 那么将随机返回 HIGH 或 LOW 通过7号引脚的高低电平控制LED的亮灭 int ledPin = 13; // LED connected to digital pin 13 int inPin = 7; // pushbutton connected to digital pin 7 int val = 0; // variable to store the read value void setup() { pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output pinMode(inPin, INPUT); // sets the digital pin 7 as input } void loop() { val = digitalRead(inPin); // read the input pin digitalWrite(ledPin, val); // sets the LED to the button's value } 四、模拟 I/O 1.analogRead()int analogRead (uint8_t pin) 读模拟引脚, 返回[0-1023]之间的值. 每读一次需要花 1 微妙的时间 2.analogReference()void analogReference (uint8_t type) 配置模式引脚的参考电压,可通过 AREF 引脚获取参考电压 函数 analogRead 在读取模拟值之后, 将根据参考电压将 模拟值转换到[0,1023]区间 type: 参考类型(DEFAULT/INTERNAL/EXTERNAL) DEFAULT : 默认 5V INTERNAL: 低功耗模式 ATmega168:1.1V ATmega8 :2.56V EXTERNAL: 扩展模式 3.analogWrite()void analogWrite (uint8_t pin, int value) 设置模拟引脚的值 value 0 到 255 之间的值, 0 对应 off, 255 对应 on 用模拟中(PWM)写一个呼吸灯 int ledPin = 9; // LED connected to digital pin 9 int analogPin = 3; // potentiometer connected to analog pin 3 int val = 0; // variable to store the read value void setup() { pinMode(ledPin, OUTPUT); // sets the pin as output } void loop() { val = analogRead(analogPin); // read the input pin analogWrite(ledPin, val / 4); } 五、高级 I/O 1.shiftOut()void shiftOut (uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val) 位移输出函数 输入 value 数据后 Arduino 会自动把数据移动分配到 8 个并行输出端. 其中dataPin 为连接 DS 的引脚号, clockPin 为连接 SH_CP 的引脚号, bitOrder 为设置数据位移顺序, 分别为高位先入MSBFIRST或者低位先入LSBFIRST dataPin :数据引脚 clockPin: 时钟引脚 bitOrder :移位顺序 ( MSBFIRST 或 LSBFIRST) val :数据 shiftOut函数主要作用于74HC595 通过十进制数字 0~255 对于与8位二进制的数,从而来控制各个引脚的高低电平,一次性向位移寄存器写入一个字节,若没有这个函数我们需要把一个字节8位拆开,一位一位的配置 一般到0-255 ,大于分两次 MSBFIRST serial int data = 500; // shift out highbyte 高8位 shiftOut(dataPin, clock, MSBFIRST, (data >> 8)); // shift out lowbyte 低9位 shiftOut(dataPin, clock, MSBFIRST, data); 2.pulseIn()unsigned long pulseIn (uint8_t pin, uint8_t state, unsigned long timeout) 读取高低电平持续的时间 state :脉冲状态 timeout :超时时间 读引脚的脉冲, 脉冲可以是 HIGH 或 LOW. 如果是 HIGH, 函数将先等引脚变为高电平, 然后开始计时, 一直到变为低电平为止. 返回脉冲持续的时间长短,单位为毫秒. 如果超时还没有读到的话, 将返回 0 六、时间函数 1.millis()unsigned long millis (void) 获取机器运行的时间长度, 单位毫秒 注:系统最长的记录时间为 9 小时 22 分, 如果超出时间将从 0 开始; 时间为 unsigned long 类型, 如果用 int 保存时间将得到错误结果 2.delay()void delay (unsigned long ms) 毫秒延时 3.delayMicroseconds()void delayMicroseconds (unsigned int us) 微妙延时函数 七、中断函数 1.attachInterrupt()void attachInterrupt (uint8_t interruptNum, void(*)(void)userFunc, int mode) 为中断发生时指定特定名称的中断服务程序. 外部中断有 0 和 1 两种, 一般对应 2 号和 3 号数字引脚 interrupt :中断类型, 0 或 1 fun :中断服务函数 mode :触发方式 ▪ LOW 低电平触发中断 ▪ CHANGE 变化时触发中断 ▪ RISING 低电平变为高电平触发中断 ▪ FALLING 高电平变为低电平触发中断 注: 1.在中断函数中 delay 函数不能使用, millis 始终返回进入中断前的值. 读串口数据的话, 可能会丢失 2.中断函数中使用的变量需要定义为 volatile 类型 通过外部引脚触发中断函数, 然后控制 LED 的闪烁 int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; } 2.detachInterrupt()void detachInterrupt (uint8_t interruptNum) 取消指定类型的中断 3.interrupts()#define interrupts() sei() 开中断 4.noInterrupts()#define noInterrupts() cli() 关中断 这两个作用保护临界区代码和操作系统的临界区保护一样的原理 void setup() {} void loop() { noInterrupts(); // critical, time-sensitive code here interrupts(); // other code here } 八、串口通讯 1.begin()void HardwareSerial::begin (long speed) 打开串口 speed 波特率 2.available()Serial.available() 获取串口上可读取的数据的字节数 该数据是指已经到达并存储在接收缓存(共有 64 字节)中。 available()继承自 Stream 实用类 两个串口通信 void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { // read from port 0, send to port 1: if (Serial.available()) { int inByte = Serial.read(); Serial1.print(inByte, BYTE); } // read from port 1, send to port 0: if (Serial1.available()) { int inByte = Serial1.read(); Serial.print(inByte, BYTE); } } 3.read()Serial.read() 读串口数据, read()继承自 Stream 实用类 注:串口上第一个可读取的字节,如果没有可读取的数据则返回-1 4.flush()刷新串口数据 5.print()Serial.print(val, format) val: 要发送的数据 format:可选,相当于格式化数据 返回的是发送的字节数 往串口发数据,无换行 注:浮点数默认发送两位小数 可选的第二个参数用于指定数据的格式 Serial.print(78, BIN) gives "1001110" Serial.print(78, OCT) gives "116" Serial.print(78, DEC) gives "78" Serial.print(78, HEX) gives "4E" Serial.println(1.23456, 0) gives "1" Serial.println(1.23456, 2) gives "1.23" Serial.println(1.23456, 4) gives "1.2346"用 F()把待发送的字符串包装到 flash 存储器 Serial.print(F(“Hello World” ))要发送单个字节数据,使用 Serial.write() 6.println()往串口发数据,类似 Serial.print(),但有换行 7.write()Serial.write(buf, len) buf: 发送的数据 len:发送数据长度 返回值发送数据的长度 写二进制数据到串口,数据是一个字节一个字节地发送的,若以字符形式发送数字请使用 print()代替 void setup() { Serial.begin(9600); } void loop() { Serial.write(45); //以二进制形式发送数字 45 int bytesSent = Serial.write(“hello” ); //发送字符串“hello” 并返回该字符串的长度。 } 8.peak()返回收到的串口数据的下一个字节(字符),但是并不把该数据从串口数据缓存中清除。每次成功调用 peak()将返回相同的字符。与 read()一样语法 9.serialEvent()当串口有数据到达时调用该函数,然后使用 Serial.read()捕获该数据 总结提示:这里对文章进行总结: |
CopyRight 2018-2019 实验室设备网 版权所有 |