單片機實驗----LED燈閃爍(彙編)
代碼如下:
ORG 0000H
MAIN: CLR P1.0 ;點亮LED
MOV R1,#200 ;LED電亮後延時一段時間
D1: MOV R2,#150
D2: DJNZ R2,D2
DJNZ R1,D1
SETB P1.0 ;熄滅LED燈
MOV R1,#200 ;LED電熄滅後延時一段時間
D1_1: MOV R2,#150
D2_2: DJNZ R2,D2_2
DJNZ R1,D1_1
LJMP MAIN ;跳回到MAIN
END
本程式需要的三個指令:
-
MOV :
MOV指令是資料傳送指令,也是最基本的程式設計指令,用于将一個資料從源位址傳送到目标位址(寄存器間的資料傳送本質上也是一樣的)。其特點是不破壞源位址單元的内容。
例如:
- MOV AX,2000H ;将16位資料2000H傳送到AX寄存器
- MOV AL,20H ; 将8位資料20H傳送到AL寄存器
- MOV AX,BX ; 将BX寄存器的16位資料傳送到AX寄存器
- MOV AL,[2000H] ;将2000H單元的内容傳送到AL寄存器
- DJNZ
- LJMP
本程式分四塊内容:
- 點亮LED:
CLR P1.0 ;點亮LED
- 熄滅LED:
SETB P1.0 ;熄滅LED燈
-
延時:
在本例中通過減1條件轉移指令DJNZ
格式:DJNZ 操作數,标号
功能:使得操作數-1,并判斷操作數是否等于0,如果不等于0,則跳轉到标号處;如果登入0,則順序執行。
MOV R1,#200 ;LED電亮後延時一段時間
D1: MOV R2,#150
D2: DJNZ R2,D2
DJNZ R1,D1
-
循環:
循環用到的是無條件轉移指令LJMP
格式:LJMP 标号
注意:這裡的無條件是指不規定條件
LJMP MAIN ;跳回到MAIN
時間:2018年9月26日15:54:01
這裡再補充點内容:怎麼做到延時時間的精準計算呢?
要精确計算時間,首先需要了解下面幾個概念:
時鐘周期(震蕩周期):就是晶體振蕩器CY的時鐘周期。對于單片機來說,標明了晶體振蕩器,時鐘周期也就确定了。
例如:12MHz的晶體振蕩器的時鐘周期為(1/12)us,對應的機器周期就是12X(1/12)us=1us。
機器周期:單片機在執行一條指令時,會将執行過程劃分為若幹個階段,每個階段完成一個基本操作,如取指令、都存儲器、寫存儲器等,完成一個基本操作的時間就是機器周期。
指令周期:從字面上就很好了解,指的是完成一條指令的時間,每條指令執行的時間是固定的,不同指令執行的時間可能不同。單片機有但機器周期指令、雙機器周期指令和四機器周期指令。
是以說要精确精算延時時間,你需要知道晶體振蕩器的頻率和指令周期。
時間:2018年9月27日13:15:57
-END-