日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【单片机】Arduino(以UNO R3为例)

發布時間:2024/3/12 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【单片机】Arduino(以UNO R3为例) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 單片機是什么?
  • 如何學習單片機
  • Arduino系列單片機介紹
    • 官網文件
    • 其他問題匯總 /* 2021.10.24更新 */
  • Arduino語言
    • 1. C語言基礎
    • 2. 數據類型
      • (1)各數據類型占用字節數
      • (2)Arduino中特有的數據類型
        • ?? i) boolean ··· 布爾類型
        • ?? ii) byte ··· 字節類型
        • ?? iii) word ··· 字類型
        • ?? iv) String ··· 特殊的字符串
    • 3. 程序結構
    • 4. 函數總結
      • (1)數字 I/O(GPIO)
        • pinMode()
        • digitalWrite()
        • digitalRead()
      • (2)模擬 I/O(ADC & Timer)
        • analogRead()
        • analogWrite()
      • (3)高級 I/O(Soft USART)
        • shiftOut()
        • shiftIn()
        • pulseIn()
        • tone()
        • noTone()
      • (4)時間函數(Timer)
        • millis()
        • micros()
        • delay()
        • delayMicroseconds()
      • (5)數學函數
        • min()
        • max()
        • constrain()
        • map()
        • pow()
        • sqrt()
        • 三角函數
      • (6)字符判斷函數
      • (7)隨機函數
        • random()
        • randomSeed()
      • (8)字節函數
      • (9)外部中斷函數(GPIO Interrupt)
        • interrupts()
        • noInterrupts()
        • attachInterrupt()
        • detachInterrupt()
  • 串行通訊(Hardware)
    • UART
      • if (Serial)
      • available()
      • availableForWrite()
      • begin()
      • end()
      • write()
      • read()
      • peek()
      • print()
      • println()(ln為"line"的縮寫)
      • readBytes()
      • readBytesUntil()
      • readString()
      • readStringUntil()
      • find()
      • findUntil()
      • flush()
      • setTimeout()
      • parseFloat()
      • parseInt()
    • SPI
    • I2C
  • 高級應用:用AVR開發Arduino
  • 其他操作
    • 1. Arduino IDE的“高級用法”——串口繪圖器
    • 2. Arduino IDE的替代編輯器——Visual Studio Code
    • 3. Arduino IDE v2.0 Beta版本
    • 4. 記錄兩個寫得非常好的教程

單片機是什么?

??單片機,全稱單片微型計算機(英語:Single-chip Microcomputer),又稱微控制器單元(Microcontroller Unit),是把中央處理器存儲器定時/計數器(timer/counter)、各種輸入輸出接口等都集成在一塊集成電路芯片上的微型計算機。與應用在個人電腦中的通用型微處理器相比,它更強調自供應(不用外接硬件)和節約成本。它的最大優點是體積小,可放在儀表內部,但存儲量小,輸入輸出接口簡單,功能較低。由于其發展非常迅速,舊的定義已不能滿足,所以在很多應用場合被稱為微控制器,中文翻譯為“單片機”,英文縮寫為MCU

參考: 單片機-維基百科

如何學習單片機

??在經過電賽那段時間的培訓之后,我突然覺得,想要真正掌握一款單片機,首先是要理解單片機的原理,這也是最重要的,不理解單片機的工作原理只是不斷地套代碼,確實也可以做成一些項目,但如果遇到比較底層的問題想要解決可能就會很困難。
??其次的話,我覺得就是要學會看官方手冊,和真正理解示例代碼。很多人包括我,在入門的時候往往會被官方手冊中大段的英文以及示例中幾百行代碼(或注釋)嚇得有點怕,但后來我的老師告訴了我一個很簡單但卻被忽略的方法:根據自己學過的知識抓住關鍵,不求全部看懂,先理解框架。所以:先求完成,再求完美,切勿好高騖遠。 與君共勉!

Arduino系列單片機介紹

官網文件


??注:Arduino主要編寫語言為C/C++。
??為了詳細了解Arduino單片機的信息,我們需要到官網去查找更詳細的資料,首先打開官網:https://www.arduino.cc/,在搜索欄中搜索對應的型號,這里以UNO R3這個型號為例(其他型號類似)進入詳情頁面:

??這里截取官網提供的引腳圖,建議一定要保存一份!!!


??繼續往下翻,可以看到Features(UNO的特性介紹)板塊:

??在最后的Resource板塊還可以下載Arduino相關的資料及集成開發環境,這里方便起見,匯總一下:

  • DataSheet:數據手冊
  • Arduino IDE:集成開發環境
  • Full PinOUT:引腳圖(一共3張,比上面的引腳圖更加全面)
  • Schematics:原理圖(不可編輯)
  • Eagle Files:原理圖和PCB,Eagle格式,可編輯,如果不想裝Eagle也對PCB沒有興趣的可以不下
  • ??到此,官方的相關文件初步下載完畢了,IDE也安裝完畢,現在就可以開始學習Arduino的語言了。

    其他問題匯總 /* 2021.10.24更新 */

    ??之前一直以為這篇教程寫得非常完善了,但還有一些電氣特性沒有交代好,下面補充一下。

    • Arduino數字引腳是TTL電平,這個在使用的時候還是需要注意一下。具體可以參考這篇鏈接。
    • Arduino一共有3種供電方案,相信這也是很多人開始使用Arduino時非常關注的點。第一種是最常見的,也就是用USB供電,比如插在電腦上或者充電寶等。第二種是使用直流穩壓5V供電,方法是接入5V和GND,這種一定要保證電源電壓的穩定性。第三種是Vin輸入,輸入7-12V,如果低于7V,可能會導致Arduino工作不穩定。第四種是黑色端子輸入電壓,要求輸入電壓為9-12V,如果低于9V,可能會導致Arduino工作不穩。具體可以參考這篇文章。
    • 這里有一個比較完整的介紹文件,可以參考一下,鏈接。

    Arduino語言

    1. C語言基礎

    ??此處一些C語言的基本用法(包括基本數據變量,基本程序結構等)就不再介紹了,如果有需求的可以去網上找一些資料復習一下,也可以看看這個鏈接。

    2. 數據類型

    (1)各數據類型占用字節數


    ??注意:在單片機的程序中,很多時候只會關注數據的字節數,而不關心它到底是什么類型的。另外,數據類型占用的字節數與單片機的位數無關!!!而是與編譯器的類型有關,詳情可以參見這篇博客:int字節問題說明

    (2)Arduino中特有的數據類型

    ?? i) boolean ··· 布爾類型

    ???布爾類型占用1個字節,其值只能為1(true)或 0(false)。關于bool和boolean可以參考這篇文章。

    ?? ii) byte ··· 字節類型

    ???儲存的數值范圍為0到255占用1個字節

    ?? iii) word ··· 字類型

    ???在UNO等基于ATMEGA芯片的板子上,word為無符號16位整數,其他型號為無符號32位整數。

    ?? iv) String ··· 特殊的字符串

    ???String類型(首字母為大寫)本質上為一個類,允許以比字符數組更復雜的方式使用和操作文本字符串。 可以連接字符串、附加、搜索和替換子字符串等。 它比簡單的字符數組需要更多的內存,但也更有用
    ???另外需要注意的是,雙引號內的一個字符串會被看作字符數組,而不是String類的實例。

    ???構建一個String類有很多種方法,如下所示:

    String stringOne = "Hello String"; // using a constant String String stringOne = String('a'); // converting a constant char into a String String stringTwo = String("This is a string"); // converting a constant string into a String object String stringOne = String(stringTwo + " with more"); // concatenating two strings String stringOne = String(13); // using a constant integer String stringOne = String(analogRead(0), DEC); // using an int and a base String stringOne = String(45, HEX); // using an int and a base (hexadecimal) String stringOne = String(255, BIN); // using an int and a base (binary) String stringOne = String(millis(), DEC); // using a long and a base String stringOne = String(5.698, 3); // using a float and the decimal places(保留3位小數)

    ???String類相關操作函數總結

    string.charAt(n); //訪問第n+1個字符,返回該字符 string.setCharAt(index, c); //將string中的index位置的字符設為c string.compareTo(string2); //按字母比較兩個字符串,如果string > string2,返回正值,如果 //string < string2,返回負值,如果相等,返回0。另外,string這種類型可以用運算符進行比較和運算 //比如 ==, !=,>, < ,>=, <= string.equals(string2); //判斷string和string2是否相等,相當于 string == string2 string.equalsIgnoreCase(string2); //忽略字符大小寫的比較,返回一個布爾值 string3 = string.concat(string, string2); //string3 = string + string2; string.concat(string2); //string += string2; /*string類型還可以加上字符(常、變)、整數(常、變)、字符串(常),但要注意不能混用: stringThree = stringOne + 123456789; stringThree = stringOne + 'A'; stringThree = stringOne + "abc"; */ string.c_str();//將string轉換成C風格的無終止符的字符串,返回的是字符串首地址,一個指針。 string.endsWith(string2);//判斷string是否以string2中的字符結尾,返回一個布爾值 string.startsWith(string2, n);//判斷從第n+1個字符開始,string是不是以string2開頭,n默認為0,返回一個布爾值 string.getBytes(buf, len);//將string存入len長度的緩存區buf中。string.indexOf(val); //在string中搜索字符或字符串val,默認從頭開始搜索 string.indexOf(val, from);//如果加上了from,則從from處開始檢索,返回val所在的位置,如果沒找到,返回-1 string.lastIndexOf(val);//和上面一樣,只是從后開始檢索 string.lastIndexOf(val, from);string.length();//求字符串的長度 string.remove(index); //移除從index開始后的count個數的字符,若沒有count,則默認到末尾 string.remove(index, count); //就地轉換,無返回值 string.replace(substring1, substring2);//將string中的子字符串substring1替換為substring2,返回新的字符串 string.reserve(size);//給string申請size大小的存儲空間 string.substring(from); //截取string的子字符串,從from(包含)到to(不包含), string.substring(from, to); //如果沒有to,則默認到末尾,返回子字符串 string.toCharArray(buf, len); //將字符串由String類型轉換成char[]類型,其中buf為轉換后的字符數組,len為buf的長度 string.toInt(); //將字符串轉換為整型,要求string第一個字符必須為數字,如果遇到非數字字符,轉換將停止,函數返回一個long類型,如果字符串開頭不是數字,則返回0 string.toFloat(); //將字符串轉換為浮點型,和上面一樣,要求字符串第一個字符為數字,如果遇到非字符數字或小數點,轉換將停止,如果只有整數,后面默認加上“.00”,返回一個浮點數,注意數字有效數字為6-7位 string.toLowerCase(); //將字符串轉換為小寫字母,就地轉換,無返回值 string.toUpperCase(); //將字符串轉換為大寫字母,就地轉換,無返回值 string.trim(); //獲取刪除開頭和結尾whitespace的字符串版本,就地轉換,無返回值 char thisChar = string1[n]; //用[]訪問特定位置的元素

    3. 程序結構

    ??每次新建一個uno程序時,都可以看到如下這個界面,

    ??由此可知,程序預置了兩個函數,分別是setup()和loop()。

    • setup() :每次Arduino上電或按下reset按鈕時,程序會 執行一遍 setup中的內容,因此一般用來初始化變量(不能聲明變量!),設置引腳模式,開始使用庫等操作。
    • loop() :運行完setup函數后,程序會 反復執行 loop中的內容,所以如果在loop程序中放置死循環(比如while(1)),那么死循環前的程序只會執行一次。

    ??注意:uno程序中沒有main函數

    4. 函數總結

    (1)數字 I/O(GPIO)

    pinMode()

    a. 功能
    設置 數字引腳(GPIO) 的輸入輸出模式
    b. 語法

    pinMode(pin, mode);

    c. 參數解釋
    pin:GPIO引腳號(參考上文中的引腳圖 D開頭的引腳)
    mode:輸入輸出模式,有以下選項:

    • INPUT:輸入模式,禁用上拉電阻
    • INPUT_PULLUP:輸入模式,使能上拉電阻
    • OUTPUT:輸出模式

    d. 返回值

    e. 說明

  • 雖然這個函數的針對對象是數字引腳,但其實模擬引腳也可以使用,觀察引腳圖即可知,模擬引腳A0 ~ A5分別對應D14 ~ D19(也可以直接寫“A0”)
  • 數字引腳13(D13) 因為在板子上連接了一個電阻和LED,因此如果要設置為輸入引腳,上拉電阻需要另外接入,不能用內部上拉電阻(否則5V會變成1.7V左右—二極管的電壓鉗位作用)
  • 如果GPIO設置為輸出模式,其輸出電流最大為 ±40 mA(拉電流或灌電流負載) 可以直接連接LED(要串聯電阻)或連接傳感器,但不足以驅動繼電器,螺線管線圈,電機等。
  • 以上參考鏈接:Digital Pins

  • digitalWrite()

    a. 功能
    設置GPIO引腳的輸出電平(高低)
    b. 語法

    digitalWrite(pin, value);

    c. 參數解釋
    pin:GPIO引腳號(參考上文中的引腳圖 D開頭的引腳)
    value:電平值,有以下選項:

    • HIGH:輸出高電平,5V(如果是3.3V的板子則是3.3V)
    • LOW:輸出低電平(0V,ground)

    d. 返回值

    e. 說明

  • 調用該函數前一定要調用pinMode函數,即必須確定輸入輸出模式,否則可能會得到錯誤電平
  • 如果設置為輸入模式,則調用該函數可以使能上拉電阻——HIGH為enable,LOW為disable,不過不推薦這樣寫,建議調用pinMode函數時使用INPUTINPUT_PULLUP

  • digitalRead()

    a. 功能
    讀取GPIO引腳電平
    b. 語法

    digitalRead(pin);

    c. 參數解釋
    pin:GPIO引腳號(參考上文中的引腳圖 D開頭的引腳)
    d. 返回值
    引腳電平值,為HIGH(對應高電平)或LOW(對應低電平)
    e. 說明
    如果該引腳為空,則返回值是隨機的,HIGH或LOW。


    (2)模擬 I/O(ADC & Timer)

    analogRead()

    a. 功能
    讀取引腳模擬值
    b. 語法

    analogRead(pin);

    c. 參數解釋
    pin:模擬引腳號(0 ~ 5或A0 ~ A5
    d. 返回值
    一個整型數,0 ~ 1023,對應電壓值為0 ~ 5V,每增加4.88mV,返回值增加1。
    e. 說明

  • Arduino上帶有6通道10位ADC(有些板子通道數更多),每次DA轉換耗時約0.1ms,即ADC頻率最高為10,000HZ
  • 若引腳為空,返回值為0 ~ 1023中的隨機值(用法見后面)
  • 返回值計算公式
    NADC=1023?VinVrefN_{ADC}=1023\cdot \frac{V_{in}}{V_{ref}} NADC?=1023?Vref?Vin??
    其中參考電壓Vref默認值為5V,如果需要設置其他的參考電壓,可以使用 analogReference(type) 函數,其參數type如下所示
      • DEFAULT:默認參考電壓值
      • INTERNAL:一個內置的參考電壓,ATmega168和ATmega328為1.1V;ATmega8為2.56V(Mega不適用)
      • INTERNAL1V1:內置的1.1V參考電壓(只有Mega適用)
      • INTERNAL2V56:內置的2.56V參考電壓(只有Mega適用)
      • EXTERNAL:外接參考電壓(AREF引腳),但電壓范圍必須在 0 ~ 5V之間!

    analogWrite()

    a. 功能
    特定的數字引腳輸出PWM波
    b. 語法

    analogWrite(pin, value);

    c. 參數解釋
    pin:特定的數字引腳,在Arduino UNO中只有引腳3、5、6、9、10、11支持PWM輸出(即引腳數字前有波浪線的引腳)。
    value:PWM占空比(the duty cycle),一個整型數,范圍在0 ~ 255之間。
    d. 返回值

    e. 說明

    • PWM輸出其本質是調用定時器的比較模塊,而Arduino UNO中內置了三個定時器,分別是Timer0,Timer1、Timer2。
      • Timer08位定時器,對應引腳5和6,其產生的PWM頻率為490HZ
      • Timer116位定時器,對應引腳9和10,其產生的PWM的頻率為980HZ
      • Timer28位定時器,對應引腳3和11,其產生的PWM頻率為490HZ
    • 此外,由于delay()、millis()、delayMicroseconds() 等函數依賴于定時器Timer0,因此5、6引腳輸出的PWM波的占空比可能會高于預期值(higher-than-expected)
    • 調用analogWrite()函數前可以不調用pinMode()函數。
    • analogWrite()函數雖然和analogRead()函數很相近,但二者沒有任何關系,一個是定時器的比較模塊,一個是ADC模塊。

    (3)高級 I/O(Soft USART)

    shiftOut()

    a. 功能
    串行輸出數據,一次一位(one bit a time)
    b. 語法

    shiftOut(dataPin, clockPin, bitOrder, value);

    c. 參數解釋
    dataPin: 串行輸出數據的引腳號(int)
    clockPin: 時鐘引腳號(int)
    bitOrder: 串行傳輸數據的順序,有以下選項:

    • MSBFIRST(Most Significant Bit First):從左往右傳輸,大數優先
    • LSBFIRST(Least Significant Bit First):從右往左傳輸,小數優先

    value: 需要傳輸的數據(byte)
    d. 返回值

    e. 說明

  • dataPin和clockPin必須用pinMode函數設置為輸出模式。
  • value值只能是一個字節,如果需要傳輸多字節數據,需要考慮分字節傳輸。
  • 傳輸數據的步驟:clockPin來一個脈沖(低-高-低),傳輸一位數據。因此如果連接的外設是上升沿觸發,則在調用該函數前最好手動將clockPin置低。

  • shiftIn()

    a. 功能
    串行讀取數據,一次一位(one bit a time)
    b. 語法

    byte_incoming = shiftIn(dataPin, clockPin, bitOrder);

    c. 參數解釋
    dataPin: 串行輸出數據的引腳號(int)
    clockPin: 時鐘引腳號(int)
    bitOrder: 串行傳輸數據的順序,有以下選項:

    • MSBFIRST(Most Significant Bit First):從左往右傳輸,最高位優先
    • LSBFIRST(Least Significant Bit First):從右往左傳輸,最低位優先

    d. 返回值
    讀取的數據(byte)
    e. 說明
    參考shiftOut


    pulseIn()

    a. 功能
    讀取脈沖(高脈沖或低脈沖)的時間寬度
    b. 語法

    pulseIn(pin, value); pulseIn(pin, value, timeout);

    c. 參數解釋
    pin:脈沖讀取引腳;
    value:讀取脈沖的形式(高脈沖、低脈沖):

    • HIGH:讀取高脈沖(高電平持續時間)
    • LOW:讀取低脈沖(低電平持續時間)

    timeout(optional):等待時間(unsigned long,單位:μs)
    d. 返回值
    脈沖的時間寬度(單位:μs),如果在timeout時間內沒有讀取到脈沖則返回0.
    e. 說明
    脈沖長度讀取范圍為 10μs~3min,超過這個范圍讀取值會發生錯誤

    tone()

    a. 功能
    產生特定頻率的方波(即音調)
    b. 語法

    tone(pin, frequency); tone(pin, frequency, duration);

    c. 參數解釋
    pin:產生音調的引腳
    frequency:音調的頻率(單位:Hz)
    duration(optional):持續時間(單位:μs),如果沒有則音調直到調用noTone函數時停止。
    d. 返回值

    e. 說明

  • 該函數是調用定時器Timer2,因此使用該函數會影響引腳3和11的PWM輸出
  • 頻率不能低于31HZ
  • 該函數用法:連接無源蜂鳴器時輸出音頻。
  • 若該引腳已經在輸出音頻,那么調用該函數只能改變音調的頻率,如果其他引腳正在輸出音頻,調用該函數無效,只能先調用noTone函數停止其他引腳的音頻,再調用該引腳上的tone函數。

  • noTone()

    a. 功能
    停止引腳上的音頻輸出
    b. 語法

    noTone(pin);

    c. 參數解釋
    pin:需要停止輸出音頻的引腳。
    d. 返回值


    (4)時間函數(Timer)

    millis()

    a. 功能
    返回定時器的計數值(單位:ms)——自程序運行開始計時,大約50天溢出 (根據unsigned long數據大小算出來的,因此返回值必須用unsigned long類型接收
    b. 語法

    nowTime_ms = millis();

    c. 參數解釋

    d. 返回值
    定時器的計數值(單位:ms,unsigned long)


    micros()

    a. 功能
    返回定時器的計數值(單位:μs)——自程序運行開始計時,大約70min溢出 (根據unsigned long數據大小算出來的,因此返回值必須用unsigned long類型接收
    b. 語法

    nowTime_us = micros();

    c. 參數解釋

    d. 返回值
    定時器的計數值(單位:μs,unsigned long)


    delay()

    a. 功能
    延時(ms級)
    b. 語法

    delay(ms);

    c. 參數解釋
    ms:延時時間,單位為ms(unsigned long)
    d. 返回值


    delayMicroseconds()

    a. 功能
    延時(μs級)
    b. 語法

    delayMicroseconds(us);

    c. 參數解釋
    us:延時的微秒數(unsigned long)
    d. 返回值

    e. 說明

  • 目前的Arduino版本只支持 <16383的微秒延時,如果需要更長的延時時間,需要調用delay函數;而且延時時間最好大于3μs,這樣的延時更加精確。
  • 新版本(0018)的Arduino中,調用該函數不會禁用中斷(表明這個函數不是用定時器中斷寫的)

  • (5)數學函數

    min()

    a. 功能
    取兩個數中的較小值
    b. 語法

    z = min(x, y);

    c. 參數解釋
    x,y:需要比較的數,數據類型任意
    d. 返回值
    兩個數中的較小值。


    max()

    a. 功能
    取兩個數中的較大值
    b. 語法

    z = max(x, y)

    c. 參數解釋
    x,y:需要比較的數,數據類型任意
    d. 返回值
    兩個數中的較大值。
    e. 說明

  • 也許與直覺相反,max() 通常用于限制變量范圍的下限,而 min() 用于限制范圍的上限。
  • 參數x,y不能用表達式代替,比如 x++y- - 等。

  • constrain()

    a. 功能
    限制數據的范圍。
    b. 語法

    constrain(x, a, b);

    c. 參數解釋
    x:需要限制的范圍,任意數據類型;
    a:限制下限,任意數據類型;
    b:限制上限,任意數據類型。
    d. 返回值

    • 如果a<=x<=b,返回x
    • 如果x>b,返回b
    • 如果x<a,返回a

    map()

    a. 功能
    將一個整數從一個范圍映射到另一個范圍。
    b. 語法

    map(value, fromLow, fromHigh, toLow, toHigh);

    c. 參數解釋
    value:需要映射的值,long類型
    fromLow:原范圍下限,long類型
    fromHigh:原范圍上限,long類型
    toLow:映射的范圍下限,long類型
    toHigh:映射范圍上限,long類型
    d. 返回值
    映射后的值(long)
    e. 說明

  • 鑒于這個函數表述不夠明白,這里給出定義,非常簡單:
  • long map(long x, long in_min, long in_max, long out_min, long out_max) {return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
  • 根據定義可知,上下限可以顛倒;可以是負數;如果出現分數會自動取整(不會四舍五入)

  • pow()

    a. 功能
    指數運算函數
    b. 語法

    pow(base, exponent);

    c. 參數解釋
    base:底數(float)
    exponent:指數(float)
    d. 返回值
    運算結果(double)


    sqrt()

    a. 功能
    求平方根
    b. 語法

    sqrt(x);

    c. 參數解釋
    x:需要求平方根的數,任意數據類型
    d. 返回值
    運算結果(double)
    e. 說明
    注意與 sq(x) 函數進行區分,sq(x) 是求x的平方,x為任意數據類型。


    三角函數

    sin(rad); //rad為弧度,float類型,計算結果為double類型 cos(rad); //rad為弧度,float類型,計算結果為double類型 tan(rad); //rad為弧度,float類型,計算結果為double類型

    (6)字符判斷函數

    ??字符判斷函數取自C語言的庫<ctype.h>,函數格式相同:

    bool fun_name(char c)

    即參數都是char類型,返回值均為布爾型,注意:Arduino中的char類型默認是unsigned char!,參考鏈接

    isAlphaNumeric(thisChar); //判斷字符是否為數字或字母('0'~'9','A'~'Z','a'~'z') isAlpha(thisChar); //判斷字符是否為字母Alphabetical('A'~'Z','a'~'z') isLowerCase(thisChar); //判斷字符是否為小寫字母 isUpperCase(thisChar); //判斷字符是否為大寫字母 isSpace(thisChar); //判斷字符是否為空格 isAscii(thisChar); //判斷字符是否為ASCII字符(0~127) isWhitespace(thisChar); //判斷字符是否為whitespace isControl(thisChar); //判斷字符是否為控制字符 isDigit(thisChar); //判斷字符是否為數字 isGraph(thisChar); //判斷字符是否為可打印字符 isPrintable(thisChar); //判斷字符是否為可打印字符 isPunct(thisChar); //判斷字符是否為標點符號 isHexadecimalDigit(thisChar); //判斷字符是否為有效的十六進制數字

    (7)隨機函數

    random()

    a. 功能
    生成一定范圍內的隨機數(整數
    b. 語法

    random(max); random(min, max);

    c. 參數解釋
    max:隨機數的上限,不包含(long)
    min(optional):隨機數的下限,包含在內,沒有默認為0
    d. 返回值
    一個隨機數(long),范圍 [min, max-1]
    e. 說明
    這個函數產生的隨機數確實是符合隨機分布,但每次產生的隨機數的序列都是一樣的,所以本質上是一個偽隨機函數,如果需要產生真隨機函數,就需要改變隨機數的序列,方法就是利用 randomSeed() 生成一個隨機“種子”,或者叫隨機源,詳情見后面。


    randomSeed()

    a. 功能
    初始化隨機數源
    b. 語法

    randomSeed(seed);

    c. 參數解釋
    seed:為一個整形數(long or int),但為了保持隨機性,一般設置為空引腳的analogRead值,比如analogRead(A0)
    d. 返回值


    (8)字節函數

    ??在單片機中傳輸數據時,往往最關心的就是數據的字節數,因此掌握字節操作函數對傳輸數據處理有很大幫助。

    lowByte(x); //獲取x的最低字節,x為任意數據類型,返回一個字節 highByte(x); //獲取x的最低字節,x為任意數據類型,返回一個字節 bitRead(x, n); //讀取x的第n-1位,最低位為0,從右至左依次增加。返回1或0 bitWrite(x, n, b); //將x的第n-1位寫為b,b為0或1,無返回值 bitSet(x, n); //將x的第n-1位置1 bitClear(x, n); //將x的第n-1位清0

    (9)外部中斷函數(GPIO Interrupt)

    interrupts()

    a. 功能
    打開總中斷
    b. 語法

    interrupts();

    c. 參數解釋

    d. 返回值

    e. 說明
    Arduino的中斷默認是打開的,只有當中斷被關閉時才會使用該函數重新打開。


    noInterrupts()

    a. 功能
    關閉總中斷
    b. 語法

    noInterrupts();

    c. 參數解釋

    d. 返回值


    attachInterrupt()

    a. 功能
    設置中斷服務程序(Interrupt Service Routine,簡稱ISR)
    b. 語法

    attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended) /*digitalPinToInterrupt(pin)是將實際的引腳號轉換為中斷對應的引腳號*/ attachInterrupt(interrupt, ISR, mode); (not recommended) attachInterrupt(pin, ISR, mode) ; (not recommended Arduino Due, Zero only)

    c. 參數解釋
    pin:中斷引腳,在UNO型號中,只支持2、3引腳
    ISR:中斷服務程序(一個無參數無返回值的函數)
    mode:中斷模式,有以下選項:

    • LOW:在引腳為低電平時,產生中斷
    • CHANGE:引腳電平改變時(上升沿或下降沿),產生中斷
    • RISING:上升沿中斷
    • FALLING:下降沿中斷
    • HIGH:引腳為高電平時,發生中斷 (只支持Due,Zero)

    interrupt:或者叫interrupt number,與引腳號一一對應但不相同,如下圖所示:

    d. 返回值

    e. 說明
    ??中斷服務程序(ISR)是一種特殊的函數沒有參數,沒有返回值,當程序進入中斷服務程序時,總中斷會關閉,只有在執行完畢當前的ISR才能去執行下一個ISR,因此一次只能執行一個ISR,且ISR內不能再嵌套ISR。因此,需要依賴中斷的函數在ISR內將失效,比如delay(), millis(), micros() ,而函數delayMicroseconds() 仍然有效。
    ??當程序有多個中斷時,且執行頻率較高的話,就需要將ISR寫得盡可能簡潔。由于ISR沒有參數,如果需要傳遞變量,需要將變量定義為全局變量,且要加上volatile 關鍵字,表明在ISR中可以進行修改。


    detachInterrupt()

    a. 功能
    關閉特定的中斷
    b. 語法

    detachInterrupt(interrupt); detachInterrupt(digitalPinToInterrupt(pin)); detachInterrupt(pin); (Arduino Due, Zero only)

    c. 參數解釋
    pin:中斷引腳
    interrupt:中斷數字,參見上面的解釋
    d. 返回值

    e. 說明
    注意和noInterrupt() 函數區分,后者是關閉總中斷,而該函數是關閉某個外部中斷。


    串行通訊(Hardware)

    UART

    ??在Arduino UNO中,只有一個UART模塊,對應數字引腳0和1,程序中,用Serial這個類表示串口,其內部預置了很多函數,用來實現串口通訊的各種功能。以下將一一介紹

    if (Serial)

    a. 功能
    指示某個串口是否連接(比如打開電腦上的串口)(但只適用于Leonardo, Yun中連接USB的端口)
    b. 語法

    if (Serial){}

    c. 參數解釋

    d. 返回值
    一個布爾值,連接為true,未連接為false。


    available()

    a. 功能
    返回到達 串行緩存區(64 byte) 中但未被讀取的字節的個數
    b. 語法

    Serial.available()Serial1.available() // Arduino Mega only Serial2.available() Serial3.available()

    c. 參數解釋

    d. 返回值
    未被讀取的字節數


    availableForWrite()

    a. 功能
    在不阻塞寫操作的情況下獲取可用于寫入串行緩沖區的字節數。
    b. 語法

    Serial.availableForWrite();

    c. 參數解釋

    d. 返回值
    待寫字節數。


    begin()

    a. 功能
    串口初始化設置(波特率,數據傳輸格式)
    b. 語法

    Serial.begin(speed) Serial.begin(speed, config)

    c. 參數解釋
    speed:波特率(1s傳輸多少位)與電腦的連接一般是300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, or 115200中的一種,在引腳0和1連接時可以根據外設任意設置。
    config:數據傳輸格式:數據位(7位,8位或其他),校驗位(奇校驗Odd,偶校驗Even,無校驗None),停止位(1位或2位),一般有如下選項:

    • SERIAL_5N1
    • SERIAL_6N1
    • SERIAL_7N1
    • SERIAL_8N1 (the default)
    • SERIAL_5N2
    • SERIAL_6N2
    • SERIAL_7N2
    • SERIAL_8N2
    • SERIAL_5E1
    • SERIAL_6E1
    • SERIAL_7E1
    • SERIAL_8E1
    • SERIAL_5E2
    • SERIAL_6E2
    • SERIAL_7E2
    • SERIAL_8E2
    • SERIAL_5O1
    • SERIAL_6O1
    • SERIAL_7O1
    • SERIAL_8O1
    • SERIAL_5O2
    • SERIAL_6O2
    • SERIAL_7O2
    • SERIAL_8O2

    d. 返回值


    end()

    a. 功能
    禁用串口
    b. 語法

    Serial.end();

    c. 參數解釋

    d. 返回值


    write()

    a. 功能
    將二進制數據寫入串口。
    b. 語法

    Serial.write(val); Serial.write(str); Serial.write(buf, len);

    c. 參數解釋
    val:單字節數據(char, byte)
    str:字符數組, 字符串(char[], byte[] )
    buf:字符數組
    len:buf的長度
    d. 返回值
    被寫入的字節數(char)


    read()

    a. 功能
    讀取緩存區中第一個字節,并在緩存區中刪除
    b. 語法

    Serial.read();

    c. 參數解釋

    d. 返回值
    第一個字節或-1(未讀到數據)


    peek()

    a. 功能
    讀取緩存區中第一個字節,但不在緩存區中刪除
    b. 語法

    Serial.peek();

    c. 參數解釋

    d. 返回值
    第一個字節或-1(未讀到數據)如果反復調用該函數,讀取到的數據是一樣的


    print()

    a. 功能
    按格式輸出各種類型的數據,將各種數據輸出為可見的ASCII碼格式
    b. 語法

    Serial.print(val); Serial.print(val, format);

    c. 參數解釋
    val:需要輸出的數據(多種格式)
    format(optional):數據輸出格式(或小數點位數)詳情參照以下實例:

    Serial.print(78); // "78" Serial.print(1.23456); // "1.23" Serial.print('N'); // "N" Serial.print("Hello world."); // "Hello world."Serial.print(78, BIN); // "1001110" Serial.print(78, OCT); // "116" Serial.print(78, DEC); // "78" Serial.print(78, HEX); // "4E" Serial.println(1.23456, 0); // "1" Serial.println(1.23456, 2); // "1.23" Serial.println(1.23456, 4); // "1.2346"Serial.print(F(“Hello World”)); //利用F()將基于flash的字符串輸出

    d. 返回值
    返回輸出字節的個數(可以不讀取)


    println()(ln為"line"的縮寫)

    a. 功能
    和print函數一樣,但輸出的內容自帶換行符( ‘\r’ 和 ‘\n’ )
    b. 語法

    Serial.println(val); Serial.println(val, format);

    c. 參數解釋
    參考print函數
    d. 返回值
    返回輸出字節的個數(可以不讀取)


    readBytes()

    a. 功能
    讀取緩存區中的字符并放在設定長度的緩存區中,當buffer裝滿或超時,則函數終止。
    b. 語法

    Serial.readBytes(buffer, length);

    c. 參數解釋
    buffer:用來儲存字符的緩存區(char[],or byte[])
    length:buffer的長度(int)
    d. 返回值
    放入buffer的字節數(char),如果沒有合法字符,返回 A0


    readBytesUntil()

    a. 功能
    和readBytes函數一樣,讀取緩存區中的字符并放在設定長度的緩存區中,但終止條件多了一個——檢測到終止字符character。
    b. 語法

    Serial.readBytesUntil(character, buffer, length);

    c. 參數解釋
    character:終止字符(char)
    buffer:緩存區(char[] or byte[] )
    length:buffer的長度
    d. 返回值
    放入buffer的字節數,如果沒有合法字符,返回 A0


    readString()

    a. 功能
    讀取緩存區中的字符串,直到時間times out才停止
    b. 語法

    Serial.readString();

    c. 參數解釋

    d. 返回值
    讀取到的字符串(char[] )


    readStringUntil()

    a. 功能
    讀取緩存區的字符串,直到終止符出現或時間到才停止
    b. 語法

    Serial.readStringUntil(terminator);

    c. 參數解釋
    terminator:終止字符
    d. 返回值
    整個字符串(char[] )


    find()

    a. 功能
    在串行緩存區中查找對應的字符
    b. 語法

    Serial.find(target);

    c. 參數解釋
    target:需要查找的字符(char)
    d. 返回值
    布爾值,找到為true,未找到為false。


    findUntil()

    a. 功能
    在串行緩存區中查找字符直到設定的終止字符被找到
    b. 語法

    Serial.findUntil(target, terminal);

    c. 參數解釋
    target:目標字符
    terminal:終止字符
    d. 返回值
    布爾值,找到為true,沒找到或超時為false。


    flush()

    a. 功能
    等待串口傳輸完成
    b. 語法

    Serial.flush();

    c. 參數解釋

    d. 返回值


    setTimeout()

    a. 功能
    設置超時時間(單位為ms),默認為1000ms
    b. 語法

    Serial.setTimeout(time);

    c. 參數解釋
    time:時間值,單位為ms。
    d. 返回值


    parseFloat()

    a. 功能
    讀取緩存區中第一個浮點數(終止于第一個非浮點數)
    b. 語法

    Serial.parseFloat();

    c. 參數解釋

    d. 返回值
    讀取到的浮點數(float)


    parseInt()

    a. 功能
    在緩存區中查找下一個有效整數。
    b. 語法

    Serial.parseInt(); Serial.parseInt(char skipChar);

    c. 參數解釋
    skipChar:用于跳過搜索中指定的字符。 例如用于跳過千位分隔符。
    d. 返回值
    下一個有效整數(long類型)


    SPI

    (有緣再寫)

    I2C

    (有緣再寫)


    注:以上內容主要參考自官方的手冊,介紹兩種方法尋找該文件:

    • 方法一:到IDE安裝根目錄下找。參考:C:/Program Files (x86)/Arduino/reference/www.arduino.cc/en/Reference/PulseIn.html
    • 方法二:打開IDE寫一個常用的函數,然后右鍵,選擇在參考文件中查找

    高級應用:用AVR開發Arduino

    ??我們都知道,單片機的程序,本質上就是對內置的寄存器的讀和寫,雖然Arduino的集成度很高,但是仍然可以用寄存器的方法來開發,但程序的麻煩程度將陡增。
    ??很多人一想到用寄存器開發,第一反應就是:太麻煩。確實,用寄存器開發在初始階段確實很麻煩,需要去了解某個模塊是由哪些寄存器控制的,這是一個需要花費較多時間精力去熟悉的過程,但是如果熟悉了寄存器,也積累了一些自己寫的庫之后,其實和用庫函數開發是差不多的。但是用寄存器寫,可以讓你最大程度了解該單片機的各種模塊。
    ??對于Arduino來說,一般的開發確實沒有必要,只要大致理解函數用的是哪些模塊即可,但是如果想要編寫自己的庫(比如Timer庫)或者查看函數源碼,就必須要懂寄存器語言了。


    附:

    • AVR開發 Arduino方法(一) 端口子系統
    • AVR開發 Arduino方法(二) 中斷子系統
    • AVR開發 Arduino方法(三) 定時/計數器子系統
    • AVR開發 Arduino方法(四) 串行通信子系統
    • AVR開發 Arduino方法(五) 模數轉換子系統
    • AVR開發 Arduino方法(六) 內存子系統
    • AVR開發 Arduino方法(七) 嵌入式操作系統FreeRTOS
    • AVR開發 Arduino方法(附一) 工具鏈與調試技術
    • AVR開發 Arduino方法(附二) 故障排除:燒錄引導程序
    • AVR開發 Arduino方法(附三) 附件列表
    • AVR開發 Arduino方法(附四) 參考文獻與網址

    • arduino 定時器、定時中斷與PWM使用以及注意事項

    其他操作

    1. Arduino IDE的“高級用法”——串口繪圖器

    ??談到Arduino的串口,我們第一時間想到的就是IDE右上角的那個串口圖標,但其實Arduino還有一個串口繪圖器的功能,也在工具菜單欄里面。

    ??使用的方法也很簡單,和串口輸出一樣,使用Serial.println() 函數即可。有其他繪圖需求的可以參考這篇文章。

    2. Arduino IDE的替代編輯器——Visual Studio Code

    ??Arduino IDE缺少一個很重要的功能,那就是代碼補全的功能,這嚴重降低了寫代碼的效率,而且Arduino IDE的UI也差強人意,因此很多人都不用Arduino IDE編程,轉而尋找替代品,而用得最多的,就是VS Code 。這個網上有很多配置方法,也比較簡單,可以參考這個鏈接,如果遇到什么問題,可以在瀏覽器點對點搜索,不再贅述。

    ??其他教程:

    • VScode配置Arduino開發環境 保姆級教程 - CSDN
    • Arduino頭文件在VS code中提示錯誤紅色波浪線的解決辦法 - CSDN

    3. Arduino IDE v2.0 Beta版本

    ??最近才知道Arduino IDE出2.0版本了,據說增加了代碼補全和代碼高亮 的功能。附: 下載鏈接

    4. 記錄兩個寫得非常好的教程

    • 極速入門教程(上)
    • 極速入門教程(下)

    總結

    以上是生活随笔為你收集整理的【单片机】Arduino(以UNO R3为例)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。