目的:該專案的目的是使用彙編程序,將其嵌入到 Arduino C 環境中,同時也將介紹如何從 Arduino 板輸入和輸出。輸入將是一個開關,用於透過上拉或下拉電阻啟動程序,輸出將驅動 LED 閃爍摩爾斯電碼的 SOS 訊號。看起來很複雜,但每一步都會給你線索。並且可以使用先前的實驗延遲函數和R16來實現不同的延遲時間。
在電報和無線電報時代,在語音編碼之前甚至之後,通信手段是使用摩爾斯電碼使用“敲擊器”或外觀奇特的開關,發送者可以使用長和短敲擊出訊息持續時間或“點擊” 。接收端將有一個中繼器或一個音調,它會重複敲擊,以便人們可以聽到它並將其翻譯回單字。在莫爾斯電碼中,字母 S 以 3 個短點或持續時間進行編碼,而 O 則以三個長破折號或持續時間進行編碼。求救或求救的莫爾斯電碼是 SOS,看起來像……………………等等。
當開關打開時,本實驗室將用莫爾斯電碼向 LED 發送 SOS,當開關關閉時,它將在發送完整的 SOS 後停止。
以下是聽起來應該是什麼樣的例子:https://www.youtube.com/watch?v=Zsb7stKelq4
為開關建立輸入。這種看似簡單的操作在微處理器上執行時需要一些思考。
以下是進行輸入的一些一般步驟:
有關 I/O 端口,請參閱 AVR 資料表第 14 節。請注意下面 AVR 中一個 I/O 引腳的硬體。
AVR 中 I/O 引腳的內部硬件
所有這些硬體都需要能夠將引腳配置為輸入或輸出,以及一些其他功能,例如內部上拉電阻、睡眠模式和與時脈同步。顯然,I/O 引腳並不簡單,但我們只關心本實驗中的簡單輸入或輸出。為此,我們需要 DDR 暫存器和我們將使用的輸入或輸出連接埠。
之前我們了解如何配置輸出以使 PORTB 位元 5 上的 LED 閃爍。
您可以選擇 Arduino 上可用的任何連接埠引腳,但您必須確定其連接埠和位元。
輸出:PORTB,暫存器 5,位元 5,在內部用於 LED,也被引出到連接器(UNO 上的引腳 13),但不要在外部使用它 - 它沒有足夠的電流能力來驅動兩個 LED。
• 建議:使用 PORTB、暫存器 5 位元 4(UNO 上的接腳 12)作為輸出
輸入:您可以使用許多其他選擇(除了不要使用 I/O 引腳 0 或 1,因為這些引腳需要與電腦通訊)。 • 建議:PORTB、暫存器5 位元3(UNO 上的接腳11)可用作輸入。
典型設定:您選擇輸入和輸出的引腳。
讀取輸入:若要讀取已知連接埠的輸入,您可以使用如下所示的 IN 指令以及您正在使用的連接埠的引腳位址。例如,要讀取 PORTB 位元 4(UNO 的引腳 18),您可以使用此指令來讀取連接埠。
環形:
在r17,0x03; //將PORTB引腳讀入暫存器17
現在,您需要透過與 0x10 進行「與」運算來選出第 4 位,以屏蔽所有其他位。此後,這取決於您的輸入配置以及您使用的是上拉還是下拉。這裡我們使用一個下拉電阻。
如果您使用上拉電阻,開關閉合將導致 0,否則為 1,因此您可以執行 AND 指令,然後如果為零則分支。
安迪 r17,0x08; //將r17與08h
BRNE 出發; //如果開關沒有關閉(即1)則返回並循環
如果使用下拉電阻,開關閉合將導致 1,否則為 0:
安迪 r17,0x08; //將r16與08h
BREQ開始; //如果開關沒有關閉(即0)則返回並循環
創建輸出與創建輸入非常相似。您必須將連接埠引腳設定為輸出。然後您可以使用 CBI 或 SBI 將其設為 0 或 1。
以下是產生輸出的一些一般步驟:
設計程序 本實驗與先前 LED 閃爍的實驗非常相似。該草圖作為您開始使用的基礎而附上。您只需更改結構即可根據上述規則建立 SOS,並使用開關的輸入來運行 SOS 和輸出來驅動 LED。使用延遲子程式為點、破折號等設定不同的延遲,如下框所示。
請參閱定義時序關係的文檔,並在設計 SOS 莫爾斯電碼程序時遵循這些規則。