單片機原理與應用技術實驗報告
實驗題目:
Keil軟件使用及匯編語言編程
姓名:
*
*
*
學號:
********
實驗日期:
2017
指導教師:
1.Keil軟件的簡介和使用
1.1
Keil
uVision4的簡介
最新的Keil
uVision4
IDE,旨在提高開發人員的生產力,實現更快,更有效的程序開發。
uVision4引入了靈活的窗口管理系統,能夠拖放到視圖內的任何地方,包括支持多顯示器窗口。
uVision4在μVision3
IDE的基礎上,增加了更多大眾化的功能:
·
多顯示器和靈活的窗口管理系統
·
系統瀏覽器窗口的顯示設備外設寄存器信息
·
調試還原視圖創建并保存多個調試窗口布局
·
多項目工作區簡化與眾多的項目
1.2
Keil
uVision4的使用
①,打開Keil
4應用軟件,其初始界面如下:
②、點擊菜單項“Project”下的“New
uVisionProject”,如下圖所示。
③、選擇文件夾,并輸入工程名。
④、輸入工程名并保存后會彈出選擇芯片界面
⑤、這里我們選擇Atmel公司的AT89S51單片機,選擇后,點擊“OK”,即創建完工程。
⑥、單擊點擊下圖所示圓圈圈起的部分建立一個文件。也可以點擊菜單“File”下面的“NEW”來新建一個文件。
⑦、之后輸入程序的代碼后,單擊File—Save
as,根據代碼語言的格類型,可保存為后綴為.asm(匯編語言)和.c(C語言)的文件。
⑧、單擊“Target1”前面的“+”號,并用鼠標右鍵點擊“SourceGroup1”,界面如圖10所示。在用鼠標左鍵點擊“Add
Files
to
Group
Source
Group1...”即可把剛剛的代碼文件添加到工程。最后點擊左上角的編譯按鈕即可完成編譯。之后即可進行程序的調試了。
2.實驗內容
使用匯編語言完成課本P95的(2)、(5)、(8)三道題以及一個跑馬燈程序。
2.1
P95-(2)
設內部RAM
5AH單元中有一個變量X,請編寫計算下述函數式的程序,結果存入5BH。
設計思路:顯然本題要使用分支語句,不妨使用JZ,JNB等,并通過X-10,X-15綜合判斷X處于哪個區間。
代碼如下:
ORG
0000H
JMP
START
ORG
1000H
START:
MOV
A,5AH
;直接尋址,將5AH地址上的數據X存入寄存器A
MOV
B,5AH
;直接尋址,將5AH地址上的數據X再一次存入寄存器B
SUBB
A,#0FH
;將A中數據X先減去15,初步判斷X所屬區間
JNB
ACC.7,DO3
;若A的第7位不為1(X>=15)則程序跳到DO3,否則順序執行
MOV
A,5AH
;若X比15小,再次將X存入累加器A中
CLR
C
;清零進位C
SUBB
A,#0AH
;將X減去10
JNB
ACC.7,DO1
;若A的第7位不為1,(X>=10),跳到DO1
JMP
DO2
;剩下的情況就是:X<10,跳到DO2
DO1:MOV
A,5AH
;10<=X<=15
MUL
AB
;相當于X*X,結果的低八位存入A
ADD
A,#08H
;即X*X+8→A
MOV
5BH,A
;即X*X+8→B
JMP
DONE
;跳到程序結束段
DO2:MOV
A,5AH
;X<10
MUL
AB
;X*X→A
CLR
C
;進位C清零
SUBB
A,#01H
;
X*X-1→A
MOV
5BH,A
;
X*X-1→B
JMP
DONE
;跳到程序結束段
DO3:MOV
A,#29H
;41→A
MOV
5BH,A
;41→B
JMP
DONE
;跳到程序結束段
DONE:SJMP
$
END
程序截圖:
程序結果:
①、當X=12時,Y=12*12+8=152
②、當X=8時,Y=8*8-1=63
③、當X=18時,Y=41
2.2
P95-(5)
設有兩個長度均為15的數組,分別存放在以2000H和2100H為首的存儲區中,試編程求其對應項之和,結果存放到以2200H為首的存儲區中。
設計思路:本題需要用到LOOP進行15次的求和及存放。并且由于地址過高,應采用DPTR進行訪問。
代碼如下:
ORG
0000H
JMP
START
ORG
1000H
START:
MOV
R1,#00H
;求和寄存器,初始清零
MOV
R2,#0FH
;循環次數為15次
MOV
DPL,#00H
;類似段內偏移地址地址
LOOP:
MOV
DPH,#20H
;DPTR的高八位,可理解為段地址,這里先指向第一個數組的首
;地址2000H
MOVX
A,@DPTR
;A←((DPTR))
MOV
R1,A
;R1←(A)
INC
DPH
;DPH改成指向高8位是21H的存儲區
MOVX
A,@DPTR
;A←((DPTR))
ADD
A,R1
;兩數組對應項求和
INC
DPH
;DPH改成指向高8位是22H的存儲區
MOVX
@DPTR,A
;求和結果送入上述地址區
INC
DPL
;低8位地址自增
DJNZ
R2,LOOP
;若循環次數-1后不為0,則跳轉到LOOP處進行循環
END
程序截圖:
程序結果:
首先分別在2000H和2100H存入15數,這里我都存入了1,2,3,…,14,15。
結果得到:
2.3
P95-(8)
將片外數據存儲器地址為1000H~1030H的數據塊,全部搬遷到片內RAM
30H~60H中,并將原數據塊區域全部清零。
設計思路:顯然還是得用LOOP進行搬遷,且每搬完一個就得清零原地址數據,并用DPTR訪問片外存儲器。
代碼如下:
ORG
0000H
JMP
START
ORG
1000H
START:
MOV
R1,#30
;用R1保存循環次數
30次
MOV
R0,#30H
;將地址30H存入R0中
MOV
DPTR,#1000H
;將1000H這個地址存入DPTR中
LOOP:
MOVX
A,@DPTR
;寄存器間接尋址。A←((DPTR))
MOV
@R0,A
;(R0)←A
CLR
A
;A←0
MOVX
@DPTR,A
;原地址數據清零
INC
R0
;數據的寫入地址
自增
INC
DPTR
;數據的讀取地址
自增
DJNZ
R1,LOOP
;若循環次數-1不為0,則跳轉到LOOP處進行循環
END
程序截圖:
程序結果:
先在片外存儲器1000H開始存入數據
接下來開始將數據搬遷到片內30H開始的區域中
且原地址數據依次被清零
2.4
P95-(8)
題目:設計一個6+50=56ms跑馬燈,并在P1端口顯示。
設計思路:首先我得設計一個56ms的延遲。這里已知當單片機系統的振蕩頻率為fosc=12MHz時,一個機器周期為1T=1us;執行一條DJNZ指令需要2個機器周期,執行一條NOP需要一個機器周期,執行一條MOV也是一個機器周期。
接著,再通過循環左移指令RL
A實現跑馬等效果。
代碼如下:
ORG
0000H
JMP
START
ORG
0800H
START:MOV
A,#01H
;即將0000
0001存入A,后面會將最右邊1循環左移。
SJMP
DELAY
;進入延時段起點
LOOP:
RL
A
;從此處開始跑馬燈模塊。先將A循環左移
MOV
P1,A
;將A的值賦給端口P1的8位
SJMP
DELAY
;從56ms的延遲程序段再跑一遍
DELAY:
MOV
R7,#224
;設置外循環次數224次
DLY1:
MOV
R6,#123
;設置內循環次數123次
DLY2:
DJNZ
R6,DLY2
NOP
DJNZ
R7,DLY1
;延時程序段結束,總用時(123*2+2+1+1)T*224T+2T+1T=56ms
SJMP
LOOP
SJMP
END
程序截圖:
程序結果:
初始狀態
執行一次56ms延遲后左移
再一次56ms延遲后左移
Proteus仿真截圖:
3.實驗心得
通過以上4個實驗,我學會了KEIL軟件的使用,即創建工程,創建并添加項目,編譯與調試等等。更重要的是學習了很多單片機編程方面的只是。比如用匯編語言實現數據的傳送、運算、移位等,同時還有一些簡單的程序設計,如分支程序、循環程序等等。
這些實驗使我更好的從底層了解單片機系統的運行機制,尤其的匯編語言的使用更是提高了我對各類端口、存儲器的運用水平。另一方面我也感受到匯編語言雖然十分直接,但面對大型的程序項目就顯得力不從心,所以這就體現了后期實驗使用C語言編寫的簡便性。
我想,通過更多的運用各類指令及對更多端口、元件的綜合使用,我會對變得越來越熟練,且能不斷地提升自己的邏輯思維。