我們要想使單片機工作,就需要編寫程序,再將程序寫入單片機,單片機在程序的控制下工作以完成指定的任務。沒有程序的控制,單片機就無法工作。那么如何編寫單片機程序呢?
1.從一個實例初步了解編程

上面這張圖所示是一個邊長為100m的正方形跑道,有一個人(稱作甲)處于A點,如果要讓甲到達B點,可以執(zhí)行如下的程序:
?起點 前進 50m
左轉
前進 100m
左轉
前進 50m
結束
甲逐條執(zhí)行程序中的命令:先前進 50m,左轉,然后前進100m,左轉,再前進50m,結束,就可以到達B點。如果將上述程序改成:
起點 前進 50m
左轉
前進 100m
左轉
前進 50m
返回到 起點
結束
甲執(zhí)行上述程序中的命令時會怎樣呢?當他執(zhí)行到第5行命令時,會到達B點,接著執(zhí)行第6行命令,該命令使他又返回到起點(標號),甲于是又會執(zhí)行第1行指令……由于執(zhí)行到第6行的指令時又會返回執(zhí)行第1行的命令,永遠執(zhí)行不到結束命令,所以,如果甲執(zhí)行上述程序,就會不斷在A、B點之間反復運動,不會停止。如果只要求甲在A、B點之間往返3次,上述程序應如何編寫呢?讀者可以思考一下,在后面的章節(jié)將會講到這個問題。
2.分析一個單片機匯編語言程序

從前面的介紹初步了解了編程思想后,再來分析用到的匯編語言程序,程序如下:
MAIN: MOV P3,#0FFH
LOOP: MOV P1,P3
LJMP LOOP
END
為了更好地理解上面的程序,下面對照圖所示的單片機應用電路來進行講解。

第1 行指令“MAIN:MOV P3,#0FFH”的含義是將數(shù)據(jù)11111111(0FFH)送到P3 端口的8個寄存器,讓P3端口的P3.0~P3.7這8個引腳全部為高電平。
“MAIN:”為標號,表示該行為主程序開始,這里也可省略,并不影響程序的運行;“MOV”為數(shù)據(jù)傳送指令;“P3”表示單片機P3端口內(nèi)部的8個寄存器;“#0FFH”中的“#”號表示它后面的“0FFH”是一個數(shù)據(jù),而不是地址編號,“0FFH”是一個十六進制數(shù),轉換成二進制數(shù)就是11111111。
該行指令運行后,圖中的單片機P3.0~P3.7這8個引腳內(nèi)部的寄存器全部為高電平,相應的這8個引腳也為高電平。
第2行指令“LOOP:MOV P1,P3”的含義是將P3端口8個寄存器中的數(shù)據(jù)送到P1端口的8個寄存器中。
“LOOP:”為標號,用來標識指令“MOV P1,P3”,由于該標號后面的指令會被調(diào)用,所以不能省略。
由于第1行指令已經(jīng)讓P3端口8個寄存器內(nèi)的數(shù)據(jù)全部為“1”,執(zhí)行“MOV P1,P3 ”指令后,P1端口8個寄存器內(nèi)的數(shù)據(jù)也全部為“1”,單片機的P1.0~P1.7這8個引腳全部為高電平,故發(fā)光二極管VD1~VD4全部不亮。
第 3 行指令“LJMP LOOP”的含義是返回執(zhí)行標號LOOP所在行的指令。也就是說,當執(zhí)行到該行指令后,又會返回去執(zhí)行第2行指令“MOV P1,P3”,即不斷將 P3 端口 8 個寄存器中的數(shù)據(jù)送到P1端口的8個寄存器中。
第4行指令“END”的含義是程序結束。由于執(zhí)行到第 3 行指令時會自動返回執(zhí)行第 2行指令,所以無法執(zhí)行到第4行指令,即程序無法結束。
將上面的匯編語言程序匯編成機器語言程序并寫入單片機后,在程序的控制下,單片機內(nèi)部電路不斷將P3端口8個寄存器中的數(shù)據(jù)送給P1端口的8個寄存器。
圖示的單片機應用電路的工作過程分析如下。
在沒有按下任何按鍵時,P3端口8個寄存器的數(shù)據(jù)都為“1”,所以P1端口8個寄存器的數(shù)據(jù)也為“1”,P1.0~P1.7這8個引腳都為高電平,發(fā)光二極管VD1~VD4全部不亮。
若按下S1按鍵,P3.2引腳變?yōu)榈碗娖剑琍3.2端口內(nèi)部寄存器的數(shù)據(jù)變?yōu)?ldquo;0”,P3.7~P3.0端口的數(shù)據(jù)分別為11111011,在第2條指令的控制下,這些數(shù)據(jù)被送到P1端口,P1.7~P1.0端口的數(shù)據(jù)分別為11111011,其中P1.2端口的數(shù)據(jù)為“0”,P1.2引腳為低電平,于是它外接的發(fā)光二極管VD1有電流通過而發(fā)光。
如果松開S1按鍵,P3.2引腳變?yōu)楦唠娖剑琍3.2端口的“1”送到P1.2端口,P1.2引腳為高電平,其外接的發(fā)光二極管VD1截止而不亮。