美文网首页
No.001 Arduino 基础语法

No.001 Arduino 基础语法

作者: 彩虹直至黑白_Joon | 来源:发表于2021-08-20 20:53 被阅读0次

    0 |前言

    Arduino编程语言是建立在C/C++语言基础上的,即以C/C++语言为基础,把AVR单片机(微控制器)相关的一些寄存器参数设置等进行函数化,以利于开发者更加快速地使用。其主要使用的函数包括数字I/O引脚操作函数、模拟I/O引脚操作函数、高级I/O引脚操作函数、时间函数、中断函数、通信函数和数学库等。

    1| Arduino 基础语法

    关键字:if、if…else、for、switch、case、while、do…while、break、continue、return、goto。

    语法符号:每条语句以“;”结尾,每段程序以“{}”括起来。

    数据类型:boolean、char、int、unsigned int、long、unsigned long、float、double、string、array、void。

    常量:HIGH或者LOW,表示数字I/O引脚的电平,
    HIGH表示高电平(1),LOW表示低电平(0);
    INPUT或者OUTPUT,表示数字I/O引脚的方向,
    INPUT表示输入(高阻态),OUTPUT表示输出(AVR能提供5V电压,40mA电流);
    TRUE或者FALSE,TRUE表示真(1),FALSE表示假(0)。

    程序结构:主要包括两部分,即void setup()和void loop()。
    其中,前者是声明变量及引脚名称(如int val;int ledPin = 13 ) ,在程序开始时使用,初始化变量和引脚模式,调用库函数如pinMode(ledPin,OUTPUT)等,而void loop()用在setup()函数之后,不断地循环执行,是Arduino的主体。

    2.| 数字I/O 引脚的操作函数

    1. pinMode(pin, mode)
      pinMode函数用于配置引脚以及设置输出或输入模式,是一个无返回值函数。该函数有两个参数:pin和mode。pin参数表示要配置的引脚;mode参数表示设置该引脚的模式为INPUT(输入)或OUTPUT(输出)。

    INPUT用于读取信号,OUTPUT用于输出控制信号。pin的范围是数字引脚013,也可以把模拟引脚(A0A5)作为数字引脚使用,此时编号为14的引脚对应模拟引脚0,编号为19的引脚对应模拟引脚5。该函数一般会放在setup()里,先设置再使用。

    1. digitalWrite(pin, value)
      该函数的作用是设置引脚的输出电压为高电平或低电平,也是一个无返回值的函数。
      pin参数表示所要设置的引脚;value参数表示输出的电压为HIGH(高电平)或LOW(低电平)。
      注意:使用前必须先用pinMode设置。

    3)digitalRead(pin)
    该函数在引脚设置为输入的情况下,可以获取引脚的电压情况:HIGH(高电平)或者LOW(低电平)。

    数字I/O引脚操作使用例程:

    int button = 9;       // 设置引脚9为按钮输入引脚
    int LED=13;           // 设置引脚13为LED输出引脚,内部连接开发板上的LED
    
    void setup(){
     pinMode(LED, OUTPUT);      // 设置为输出模式 
     pinMode(button, INPUT);     // 设置为输入模式
    }
    
    void loop(){
     if(digitalRead(button) == Low)    // 判断按钮引脚是否为低电平
         digitalWrite(LED, HIGH);        // 引脚13为高电平,LED灯亮
    else
       digitalWrite(LED, LOW);        //    否则输出为低电平
    }
    
    

    3. 模拟I/O引脚的操作函数

    1. analogReference(type)
      该函数用于配置模拟引脚的参考电压。
      它有三种类型:
      DEFAULT是默认模式,参考电压是5V;
      INTERNAL是低电压模式,使用片内基准电压源2.56V;
      EXTERNAL是扩展模式,通过AREF引脚获取参考电压。

    注意:若不使用本函数,默认是参考电压5V。若使用AREF作为参考电压,需接一个5kΩ的上拉电阻。

    1. analogRead(pin)

    用于读取引脚的模拟量电压值,每读取一次需要花100μs的时间。参数pin表示所要获取模拟量电压值的引脚,返回为int型。它的精度为10位,返回值为0~1023。

    注意:函数参数pin的取值范围是05,对应开发板上的模拟引脚A0A5。

    1. analogWrite(pin,value)
      该函数是通过PWM(Pulse-Width Modulation,脉冲宽度调制)的方式在引脚上输出一个模拟量。PWM输出的一般形式,也就是在一个脉冲的周期内高电平所占的比例。它主要应用于LED亮度控制、直流电机转速控制等方面。

    Arduino中的PWM的频率大约为490Hz,Arduino UNO开发板支持以下数字引脚(不是模拟输入引脚)作为PWM模拟输出:3、5、6、9、10、11。开发板带PWM输出的都有“~”号。

    注意:PWM输出位数为8位,即0~255。

    模拟I/O引脚的操作函数例程如下:

    int sensor = A0;      //  规定传感器引脚
    int LED=11;            //   规定输出引脚
    
    void setup(){
      Serial.begin(9600);   //  设置采样频率
    }
    void loop(){
      int v;
      v = analogRead(sensor);    // 读取模拟量引脚的数据, 值域[0,1023]
      Serial.println(v, DEC);      // 打印数字
      analogWriter(LED,  v/4);     //  写入的值域[0,255]
    }
    

    4| 高级I/O 引脚的操作函数

    PulseIn(pin,state,timeout)函数用于读取引脚脉冲的时间长度,脉冲可以是HIGH或者LOW。如果是HIGH,该函数首先等待引脚变为高电平,然后开始计时,直到变为低电平停止计时。返回脉冲持续的时间,单位为毫秒,如果超时没有读到时间,则返回0。

    例程说明:做一个按钮脉冲计时器,测量按钮的持续时间,谁的反应最快,即谁按按钮时间最短。按钮接在引脚3。程序如下:

    int button = 3;
    int count;
    void setup(){
    pinMode(button, INPUT);
    }
    void loop(){
    cout = pulseIn(button, HIGH);
      if(count !=0){
        Serial.println(count,DEC);
          count = 0;
    }
    }
    

    5| 时间函数

    1. delay()
      该函数是延时函数,参数是延时的时长,单位是ms(毫秒)。应用延时函数的典型例程是跑马灯的应用,使用Arduino开发板控制4个LED依次点亮。程序如下:
    void setup(){
    pinMode(6,OUTPUT);    // 定义引脚
    pinMode(7,OUTPUT);
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);
    }
    void loop(){
    int i;
    for(i =6; i<=9; i++){
    digitalWrite(i,HIGH);     //设置数字信号量为高电平
    delay(1000);                    //持续为1s
    digitalWrite(i, LOW);   // 设置数字信号量为低电平
    delay(1000);                   // 持续1s
    }
    }
    
    1. delayMicroseconds()

    delayMicroseconds()也是延时函数,不过单位是μs(微秒),1ms=1000μs。该函数可以产生更短的延时。

    1. millis()
      millis()为计时函数,应用该函数可以获取单片机通电到现在运行的时间长度,单位是ms。系统最长的记录时间为9h22min,超出则从0开始。返回值是unsigned long型。

    该函数适合作为定时器使用,不影响单片机的其他工作(而使用delay函数期间无法进行其他工作)。计时时间函数使用示例(延时10s后自动点亮LED)程序如下:

    int LED=13;
    unsigned long i,j;
    void setup(){
    pinMode(LED,OUTPUT);
    i = millis();                       // 读入初始值
    }
    void loop(){
    j = milis();                        // 不断读入当前时间值
      if((j-i) > 10000){           // 如果延时超过10s,点亮LED
    digitWrite(LED, HIGH);
    }
      else digitalWrite(LED, LOW);
    }
    
    1. micros()
      micros() 也是计时函数,该函数返回开机到现在运行的时间长度,单位为μs。返回值是unsigned long型,70min溢出。程序如下:
    unsigned long time;
    void setup(){
    Serial.begin(9600);
    }
    void loop(){
    Serial.print("Time:");
    time = micros();
    Serial.println(time);
    delay(1000);
    }
    

    以下例程为跑马灯的另一种实现方式:

    int LED=13;
    unsigned long i,j;
    void setup(){
    pinMode(LED, OUTPUT);
    i = micros();
    }
    void loop(){
    j = micros();
        if((j-i)>10000){       、// 如果延时超过10s,点亮LED
      digitalWrite(LED, HIGH);
    }
    else digitalWrite(LED, LOW);
    }
    

    6| 中断函数

    什么是中断?实际上在人们的日常生活中,中断很常见,如图1所示。


    图1 中断程序

    你在看书,电话铃响,于是在书上做个记号,去接电话,与对方通话;门铃响了,有人敲门,你让打电话的对方稍等一下,去开门,并在门旁与来访者交谈,谈话结束,关好门;回到电话机旁,继续通话,接完电话再回来从做记号的地方接着看书。

    同样的道理,在单片机中也存在中断概念,如图2所示。在计算机或者单片机中中断是由于某个随机事件的发生,计算机暂停主程序的运行,转去执行另一程序(随机事件),处理完毕又自动返回主程序继续运行的过程。也就是说,高优先级的任务中断了低优先级的任务。在计算机中中断包括如下几部分:


    图2

    ①中断源——引起中断的原因,或能发生中断申请的来源;
    ②主程序——计算机现行运行的程序;
    ③中断服务子程序——处理突发事件的程序。

    1. attachinterrupt(interrupt, function, mode)
      该函数用于设置中断,函数有3个参数,分别表示中断源、中断处理函数和触发模式。中断源可选0或者1,对应2或者3号数字引脚。中断处理函数是一段子程序,当中断发生时执行该子程序部分。
      触发模式有四种类型:LOW(低电平触发)、CHANGE(变化时触发)、RISING(低电平变为高电平触发)、FALLING(高电平变为低电平触发)。
      例程功能如下:
    volatile int state1 = LOW, state2= LOW;
    int LED1 =4 ;
    int LED2=5;
    int LED3=13;
    void setup(){
      pinMode(LED1,OUTPUT);
      pinMode(LED2, OUTPUT);
      pinMoed(LED3, OUTPUT);
    }
    void loop(){
    digitalWrite(LED3,HIGH);
    delay(500);
    digitalWrite(LED3, LOW);
    delay(500);
    attachInterrupt(0, LED1_Change, LOW); //低电平触发
    attachInterrupt(1, LED2_Change, CHANGE); //任意电平变化触发
    }
    void LED1_Change(){
    state1 = !state1;
    digitalWrite(LED1, state1);
    delay(100);
    }
    void LED2_Change(){
    state2 = !sate2;
    digitalWrite(LED2, state2);
    delay(100);
    }
    

    例程2:

    volatile int state1=LOW, state2=LOW;
    int LED1 = 4;
    int LED2 = 5;
    int LED3 = 13;
    void setup(){
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    attachInterrupt(0, LED1_Change, ROSING);     //电平上升沿触发
    attachInterrupt(1, LED2_Change,FALLING);     //电平下降沿触发
    }
    void loop(){
    digitalWrite(LED3, HIGH);
    delay(500);
    digitalWrite(LED3, LOW);
    delay(500);
    }
    
    void LED1_Change(){
    state1 = !state1;
    digitalWrite(LED1, state1);
    delay(100);
    }
    
    void LED2_Change(){
    state2 =!state2;
    digitalWrite(LED2, state2);
    delay(500);
    }
    
    1. detachInterrupt(interrupt)
      该函数用于取消中断,参数interrupt表示所要取消的中断源。

    7| 串口通信函数

    串行通信接口(serial interface)使数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信的接口,如图3所示。


    串行通信接口

    串行通信接口出现在1980年前后,数据传输率是115~230Kb/s。串行通信接口出现的初期是为了实现计算机外设的通信,初期串口一般用来连接鼠标和外置Modem、老式摄像头和写字板等设备。由于串行通信接口(COM)不支持热插拔及传输速率较低,因此目前部分新主板和大部分便携计算机已开始取消该接口,串口多用于工控和测量设备以及部分通信设备中,包括各种传感器采集装置、GPS信号采集装置、多个单片机通信系统、门禁刷卡系统的数据传输、机械手控制和操纵面板控制直流电机等,特别是广泛应用于低速数据传输的工程应用,主要函数如下:

    1. Serial.begin()

    该函数用于设置串口的波特率,即数据的传输速率,指每秒钟传输的符号个数。一般的波特率有9600、19200、57600、115200等。例如:Serial.begin(57600)

    1. Serial.available()
      该函数用来判断串口是否收到数据,函数的返回值为int型,不带参数。

    2. Serial.read()
      该函数不带参数,只将串口数据读入。返回值为串口数据,int型。

    3. Serial.print()
      该函数向串口发送数据。可以发送变量,也可以发送字符串。

    Serial.print("Hello world");
    Serial.print(x, DEC);     // 以十进制发送变量x
    Serial.print(x, HEX);    //以十六进制发送变量x
    
    1. Serial.println()
      该函数与Serial.print()类似,只是多了换行功能。

    串口通信函数使用例程:

    int x=0;
    void setup(){
    Serial.begin(9600);
    }
    void loop(){
      if(Serial.available()){
          x = Serial.read();
          Serial.print("I have received:");
          Serial.println(x, DEC);
    }
    delay(200);
    }
    

    相关文章

      网友评论

          本文标题:No.001 Arduino 基础语法

          本文链接:https://www.haomeiwen.com/subject/olstiltx.html