弄完上個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"
接下來是構造函數
明天再說啦