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