我們要想使單片機工作,就需要編寫程序,再将程序寫入單片機,單片機在程序的控制下工作以完成指定的任務。沒有程序的控制,單片機就無法工作。那麼如何編寫單片機程序呢?
1.從一個實例初步了解編程
上面這張圖所示是一個邊長為100m的正方形跑道,有一個人(稱作甲)處于A點,如果要讓甲到達B點,可以執行如下的程序:
起點 前進 50m
左轉
前進 100m
左轉
前進 50m
結束
甲逐條執行程序中的命令:先前進 50m,左轉,然後前進100m,左轉,再前進50m,結束,就可以到達B點。如果将上述程序改成:
起點 前進 50m
左轉
前進 100m
左轉
前進 50m
返回到 起點
結束
甲執行上述程序中的命令時會怎樣呢?當他執行到第5行命令時,會到達B點,接着執行第6行命令,該命令使他又返回到起點(标号),甲于是又會執行第1行指令……由于執行到第6行的指令時又會返回執行第1行的命令,永遠執行不到結束命令,所以,如果甲執行上述程序,就會不斷在A、B點之間反複運動,不會停止。如果隻要求甲在A、B點之間往返3次,上述程序應如何編寫呢?讀者可以思考一下,在後面的章節将會講到這個問題。
2.分析一個單片機彙編語言程序
從前面的介紹初步了解了編程思想後,再來分析用到的彙編語言程序,程序如下:
MAIN: MOV P3,#0FFH
LOOP: MOV P1,P3
LJMP LOOP
END
為了更好地理解上面的程序,下面對照圖所示的單片機應用電路來進行講解。
第1 行指令“MAIN:MOV P3,#0FFH”的含義是将數據11111111(0FFH)送到P3 端口的8個寄存器,讓P3端口的P3.0~P3.7這8個引腳全部為高電平。
“MAIN:”為标号,表示該行為主程序開始,這裡也可省略,并不影響程序的運行;“MOV”為數據傳送指令;“P3”表示單片機P3端口内部的8個寄存器;“#0FFH”中的“#”号表示它後面的“0FFH”是一個數據,而不是地址編号,“0FFH”是一個十六進制數,轉換成二進制數就是11111111。
該行指令運行後,圖中的單片機P3.0~P3.7這8個引腳内部的寄存器全部為高電平,相應的這8個引腳也為高電平。
第2行指令“LOOP:MOV P1,P3”的含義是将P3端口8個寄存器中的數據送到P1端口的8個寄存器中。
“LOOP:”為标号,用來标識指令“MOV P1,P3”,由于該标号後面的指令會被調用,所以不能省略。
由于第1行指令已經讓P3端口8個寄存器内的數據全部為“1”,執行“MOV P1,P3 ”指令後,P1端口8個寄存器内的數據也全部為“1”,單片機的P1.0~P1.7這8個引腳全部為高電平,故發光二極管VD1~VD4全部不亮。
第 3 行指令“LJMP LOOP”的含義是返回執行标号LOOP所在行的指令。也就是說,當執行到該行指令後,又會返回去執行第2行指令“MOV P1,P3”,即不斷将 P3 端口 8 個寄存器中的數據送到P1端口的8個寄存器中。
第4行指令“END”的含義是程序結束。由于執行到第 3 行指令時會自動返回執行第 2行指令,所以無法執行到第4行指令,即程序無法結束。
将上面的彙編語言程序彙編成機器語言程序并寫入單片機後,在程序的控制下,單片機内部電路不斷将P3端口8個寄存器中的數據送給P1端口的8個寄存器。
圖示的單片機應用電路的工作過程分析如下。
在沒有按下任何按鍵時,P3端口8個寄存器的數據都為“1”,所以P1端口8個寄存器的數據也為“1”,P1.0~P1.7這8個引腳都為高電平,發光二極管VD1~VD4全部不亮。
若按下S1按鍵,P3.2引腳變為低電平,P3.2端口内部寄存器的數據變為“0”,P3.7~P3.0端口的數據分别為11111011,在第2條指令的控制下,這些數據被送到P1端口,P1.7~P1.0端口的數據分别為11111011,其中P1.2端口的數據為“0”,P1.2引腳為低電平,于是它外接的發光二極管VD1有電流通過而發光。
如果松開S1按鍵,P3.2引腳變為高電平,P3.2端口的“1”送到P1.2端口,P1.2引腳為高電平,其外接的發光二極管VD1截止而不亮。
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!