2、Arduino開發語言

弄完上個20天后,突然懈怠了,今天開始重新20天

Arduino使用的語言就是C語言

以下內容是建立在學過一定的C語言的基礎上,我們只是用來學習Arduino的函數與C語言的不同之處,還有和89C51不同的地方

1、程序結構

Arduino程序最基本結構必要代碼如下:、

在這裏插入圖片描述

這段程序我們可以看做兩部分,由兩個void函數組成,分別稱爲“初始化”和“循環體”。當我們在Arduino中運行程序時,我們先運行初始化部分,然後運行循環體部分,之後便一直在循環體中重複運行。

也就是說,我們在編程過程中,可以把需要運行一次的程序放入初始化部分,把需要循環運行的代碼放入循環體部分

舉例:LED閃爍示例

void setup() {
  pinMode(13,OUTPUT);     //將數字輸出口13設置爲電平輸出模式,執行一次即可完成設置 
}

void loop() {
  digitalWrite(13,HIGH);  //將數字輸出口13設置爲高電平,LED將會亮起
  delay(1000);            //等待一段時間
  digitalWrite(13,LOW);   //將數字輸出口13設置爲低電平,LED將會熄滅
  delay(1000);            //等待一段時間
}

注意:初始化和循環體部分即使不需要用到其中的功能,也不能將其刪去,可以在大括號內留空。循環體部分雖然可以一直重複運行,但也可以通過代碼停止運行

2、變量定義

上面的例子中,我們對輸出口13進行了多次操作,在編程中一般會把需要重複使用多次的內容用變量來定義,使用的時候在需要的地方用變量名錶示,適當使用變量能讓程序更簡便和靈活。

把上面的例子改一下,把13放入名爲“n”的變量中

int n =13;                //定義變量,並將數字輸出口的值“13”放入變量
void setup() {
  pinMode(n,OUTPUT);     //將數字輸出口13設置爲電平輸出模式,執行一次即可完成設置 
}

void loop() {
  digitalWrite(n,HIGH);  //將數字輸出口13設置爲高電平,LED將會亮起
  delay(1000);            //等待一段時間
  digitalWrite(n,LOW);   //將數字輸出口13設置爲低電平,LED將會熄滅
  delay(1000);            //等待一段時間
}

這個地方和C語言的一模一樣,就不再贅述了

3、 函數和類庫

pinMode():設置某個數字輸出口的電平模式;

digitalWrite():設置某個數字輸出口的電平;

digitalWrite(參數pin,參數value),pin:設置一個引腳;value:電平,常量爲HIGH或者LOW;

delay():讓程序暫停一段時間,單位爲ms;

Serial類庫函數begin():設置串口通信的波特率;

Serial類庫函數println():通過串口發送一行字符;

例如

void setup(){
    Serial.begin(9600);              //設置通信波特率
}
void loop(){
    Serial.println("Hello,PC!");     //發送“Hello,PC!”
    delay(1000);
}

這類函數在名稱中間有“.”號分隔,點號前面表示一個對象(這裏是默認的串口對象Serial),後面表示一個函數(也稱爲“方法”)。Serial對象是由Serial類庫創建的,由於這個類庫是被Arduino默認添加包含的,在編譯過程中會自動加入,所以不需要用語句在程序中指定加入哪個類庫。

4、自定義函數

函數和變量一樣,程序編寫者可以自定義需要的函數。雖然Arduino語言中已經有了基本能解決大部分需要的函數,但對於特殊的實例,有可能需要用到能達到特定功能的函數。

例如,有一套裝置如圖4-5所示,6個LED從左至右接7~2號引腳。其程序在執行開始,會得到3個變量LED1、LED2、LED3,爲1~6之間的數字,現在需要編寫程序的主要部分,將所給變量值對應序號的LED點亮。

在這裏插入圖片描述
我們只需要switch語句或者數組就可以解決,但是在Arduino中並沒有適合的函數,那麼我們只能自定義了。

定義這個函數的代碼如下:

void LED(int one,int two,int thr){
    int leds[]={0,7,6,5,4,3,2}   //數組下標1~6分別對應7~2,用於序號值對應引腳值
    pinMode(7,OUTPUT);
    pinMode(6,OUTPUT);
    pinMode(5,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(3,OUTPUT);
    pinMode(2,OUTPUT);           //以上代碼設置2~7號因及哦啊爲電平輸出模式
    digitalWrite(leds[one],HIGH);
    digitalWrite(leds[two],HIGH);
    digitalWrite(leds[two],HIGH);//設置各個要亮的LED對應引腳爲高電平
} 

將這段函數的代碼放入程序後,在程序初始化或循環體部分使用這個函數

LED (LED1,LED2,LED3);便可以實現點亮對應小燈的效果

自定義函數的代碼要注意以下兩點:

  • 不能放在初始化或循環體部分內
  • 只能與初始化或循環體部分並列放置,一般是後面

大致如下

void setup(){
}
void loop(){
}
void LED(int one,int two,int thr){
}

自定義函數在程序中可以按需要定義,沒有定義數量限制,其定義語法如下:

數值類型  函數名(參數類型 參數名,參數類型 參數名······){
函數內部代碼
}
  • 數值類型可以設置函數輸出值類型,void表示沒有輸出值。
  • 函數名命名規則同變量名命名一致。
  • 參數可以按需要設置,可以設置多個或者不設置,設置參數規則同變量設置語法,但參數之間不能用分號分隔,要用逗號分隔。

學了自定義函數後,我們可以發現,初始化和循環體兩部分的語法和自定義函數的語法是一致的。其實,初始化部分和循環體部分就是定義兩個類型爲void的並且沒有參數的函數,也可以分別稱二者爲:

  • setup()函數;
  • loop()函數;

Arduino運行時其實就是運行一遍setup函數和其他的自定義函數,然後循環運行loop函數,編寫Arduino程序的過程就是把一系列語句整合入setup函數和loop函數中。

前面的函數都是沒有輸出值,也就是C語言中所謂的返回值,這裏的輸出值使用方法和C語言中一樣

return 輸出的數據;

這個語句可以在函數中的任意位置使用,但使用後意味着這個函數運行結束了。

例如下面的自定義函數的輸出數據會在串口監視器中顯示

void setup(){
    Serial.begin(9600);                  //設置通行波特率
}
void loop(){
    int value=myfuction();
    Serial.println(value);
    delay(1000);
}    
int myfuction(){
    int val=9;
    return val;
}

5、 自定義類庫

類庫是由一系列變量和函數構成的集合,用於將複雜的功能封裝成能簡單調用的對象。類庫初始化後叫做實例,編程中操作的各種實例稱爲對象。爲了方便區分類庫內的變量和函數與類庫外的,我們把類庫中的變量叫做屬性,函數稱爲方法

類庫封裝了一系列方法或者一些底層編程,所以使用起來非常簡便且容易移植。IDE自帶類庫不需要安裝即可調用,如果要用第三方的類庫,則需要導入纔可以使用。

導入流程:

  • 獲得類庫大包文件
  • 在IDE界面Sketch(草圖)菜單下展開“導入庫”子菜單
  • 單機“添加庫”選項,然後在彈出的窗口中選擇類庫安裝。

以下爲一個簡單的摩斯電碼程序

int pin=13;

void setup ()
{
    pinMode(pin,OUTPUT);
}

void loop()
{
    dot();dot();dot();
    dash();dash();dash();
    dot();dot();dot();
    delay(3000);
}

void dot()
{
    digitalWrite(pin,HIGH);
    delay(250);
    digitalWrite(pin,LOW);
    delay(250);
}

void dash()
{
    digitalWrite(pin,HIGH);
    delay(100);
    digitalWrite(pin,LOW);
    delay(250);
}

該代碼中的以下部分可以整理到類庫:

  • 用於閃爍的dot()和dash()兩個功能函數;
  • 用於指定使用哪個管腳的燈的pin變量;
  • 初始化管腳的pinMode()函數調用。

一個類庫至少包含兩個文件:頭文件(擴展名爲“.h”)和源代碼文件(擴展名爲“.cpp”)。頭文件包含類庫的聲明,即類庫的功能說明列表,源代碼文件包含類庫的實際實現。

我們不妨給上面的類庫起一個類庫名Morse,那麼需要在代碼庫目錄裏(項目文件下的libraries目錄),創建一個名爲“Morse”的子目錄用於放置類庫文件。新建頭文件命名爲“Morse.h”

1.頭文件

頭文件核心內筒,是一個封裝了成員函數相關變量的類聲明:

class Morse                              //聲明類和類名
{
  public;                                //表明以下爲類庫內、外部方可調用的公共成分
    Morse(int pin);                      //構造函數
    void dot();                          
    void dash();
  private;                               //表明以下爲類庫內部方可調用的私有成分
    int _pin;
};                                       //注意分好“:”不能忽略

類裏的函數與變量,其訪問權限可以使public,也可以是private。類有個特殊的函數——構造函數,用於類實例化時執行一些工作,如不需要可以省略。構造函數的數據類型與類相同,且沒有返回值

頭文件裏還有些其他雜項。

如,爲了使用標準類型和Arduino語言的常量,編寫庫時需要include導入這些類庫(IDE會在編譯時自動爲ino格式程序文件加上這些#include語句,類庫等文件則需要手動編寫#include語句)例如

#include "Arduino.h"

這裏和89c52那邊有點不一樣,那邊是#include<reg.h>,注意一下就好。

最後,爲了防止多次引用頭文件造成的各種問題,還需要封裝整個頭文件結構:

#ifndef Morse_h
#define Morse_h
       //類庫聲明主題
#endif

最終完成的頭文件內容如下:

#ifndef Morse_h
#define Morse_h

#include "Arduino.h"

class Morse                              
{
  public;                            
    Morse(int pin);                    
    void dot();                          
    void dash();
  private;                            
    int _pin;
};    

#endif

2. 源代碼文件Mrose.cpp

開頭仍是一些#include語句。這些語句讓下面的程序能夠使用Arduino的標準函數和剛纔在Morse.h中聲明的類。

#include "Arduino.h"
#include "Morse.h"

接下來是構造函數
明天再說啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章