Chap2匯編語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
Chap2匯編語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
Chap2匯編語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
Chap2匯編語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
Chap2匯編語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

單片機(jī)及C51編程技術(shù)授課老師:劉建陽(yáng)

Email:ljy@Dept.:

機(jī)械工程系西南交通大學(xué)機(jī)械工程系QQ:1853103741主要內(nèi)容2014-9-62LJY80C51匯編語(yǔ)言語(yǔ)句結(jié)構(gòu)的基本格式偽指令匯編的概念程序設(shè)計(jì)的步驟和基本方法順序程序,分支程序,循環(huán)程序,查表程序,散轉(zhuǎn)程序匯編語(yǔ)言的基本知識(shí)

標(biāo)號(hào):操作碼

操作數(shù);

注釋

指令基本格式RED:

SETB

P1.2

;紅燈亮ORG:ORG2000HENDEQU:AAAEQU20HMOVA,20H(MOVA,AAA)DATA(可前可后)DB、DWBIT:A1BIT00H(MOVC,A1)

偽指令匯編程序偽指令在匯編時(shí)起控制作用,自身并不產(chǎn)生機(jī)器碼,而僅是為匯編服務(wù)的一些指令,稱為偽指令。偽指令不屬于80C51指令系統(tǒng)。常用的偽指令有以下幾種:⒈起始偽指令

ORG(Origin)

功能:規(guī)定ORG下面目標(biāo)程序的起始地址。格式:ORG16位地址功能:將一個(gè)數(shù)據(jù)或特定的匯編符號(hào)賦予規(guī)定 的字符名稱。⒉結(jié)束偽指令END功能:匯編語(yǔ)言源程序的結(jié)束標(biāo)志。在END后面的指令,匯編程序不再處理。格式:END⒊等值偽指令

EQU(Equate)格式:字符名稱EQU

數(shù)據(jù)或匯編符號(hào)⒋數(shù)據(jù)地址賦值偽指令

DATA格式:字符名稱DATA

表達(dá)式功能:將數(shù)據(jù)地址或代碼地址賦予規(guī)定的 字符名稱。⒌定義字節(jié)偽指令DB(DefineByte)格式:DB8位二進(jìn)制數(shù)表功能:從指定的地址單元開(kāi)始,定義若干 個(gè)8位內(nèi)存單元的數(shù)據(jù)。數(shù)據(jù)與數(shù)據(jù)之間用“,”分割。格式:字符名稱BIT

位地址⒍定義字偽指令DW(DefineWord)格式:DW16位二進(jìn)制數(shù)表功能:從指定的地址單元開(kāi)始,定義 若干個(gè)16位數(shù)據(jù)。⒎定義位地址偽指令BIT功能:將位地址賦予所規(guī)定的字符名稱。匯編語(yǔ)言基本概念將匯編語(yǔ)言源程序轉(zhuǎn)換為計(jì)算機(jī)所能識(shí)別的機(jī)器語(yǔ)言代碼程序的過(guò)程稱為匯編。

匯編可分為:⒈手工匯編(偽代碼)⒉計(jì)算機(jī)匯編(能編譯運(yùn)行代碼)⑷

調(diào)試程序設(shè)計(jì)的基本方法編寫(xiě)程序要求:不僅要完成規(guī)定的功能任務(wù),而且還要求:執(zhí)行速度快、占用內(nèi)存少、條理清晰、閱讀方便、便于移植、巧妙而實(shí)用。一般應(yīng)按以下幾個(gè)步驟進(jìn)行:⑴分析問(wèn)題,確定算法或解題思路⑵畫(huà)流程圖⑶編寫(xiě)源程序匯編程序設(shè)計(jì)流程明確要求和要達(dá)到的目的確定解決問(wèn)題的計(jì)算方法和步驟畫(huà)出流程圖分配內(nèi)存地址按流程圖編寫(xiě)程序上機(jī)匯編、調(diào)試、修改及最后確定源程序簡(jiǎn)單程序(順序結(jié)構(gòu))大量使用數(shù)據(jù)傳送類指令注意正確選擇指令以提高效率【例】已知16位二進(jìn)制負(fù)數(shù)存放在R1R0中,試求其補(bǔ)碼,并將結(jié)果存在R3R2中。解:二進(jìn)制負(fù)數(shù)的求補(bǔ)方法可歸結(jié)為“求反加1”,符號(hào)位不變。利用CPL指令實(shí)現(xiàn)求反;加1時(shí),則應(yīng)低8位先加1,高8位再加上低位的進(jìn)位。注意這里不能用INC指令,因?yàn)镮NC指令不影響標(biāo)志位。CONT:MOV A,R0 ;讀低8位

CPL A ;取反

ADD A,#1 ;加1

MOV R2,A ;存低8位

MOV A,R1 ;讀高8位

CPL A ;取反

ADDC A,#80H

;加進(jìn)位及符號(hào)位

MOVR3,A

;存高8位

RET

;#80H:10000000B負(fù)數(shù)記得加符號(hào)位!分支程序根據(jù)程序要求無(wú)條件或有條件改變程序執(zhí)行執(zhí)行的順序,選擇程序的流向.特點(diǎn):程序中含有轉(zhuǎn)移類指令關(guān)鍵:正確選用轉(zhuǎn)移指令80C51指令系統(tǒng)中的條件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令、位轉(zhuǎn)移指令,可以實(shí)現(xiàn)分支程序。正確運(yùn)用轉(zhuǎn)移指令無(wú)條件分支程序LJMP、AJMP、SJMP有條件分支程序根據(jù)已經(jīng)執(zhí)行的程序?qū)?biāo)志位、ACC或內(nèi)部RAM的某些位的影響結(jié)果決定程序的流向JZ/JNZ、CJNE、DJNZ、位控制轉(zhuǎn)移類指令注意:使用條件轉(zhuǎn)移指令形成分支前一定安排可供條件轉(zhuǎn)移指令進(jìn)行判別的條件。JCLOOP正確選定所用的轉(zhuǎn)移條件及轉(zhuǎn)移目標(biāo)地址①S0單獨(dú)按下,

紅燈亮,其余燈滅;②S1單獨(dú)按下,

綠燈亮,其余燈滅;③其余情況,黃燈亮。【例】已知電路如圖所示,要求實(shí)現(xiàn):解:程序如下SGNL:ANLP1,#11100011B;紅綠黃燈滅

ORLP1,#00000011B;置P1.0、P1.1輸入態(tài),

P1.5~P1.7狀態(tài)不變SL0:JNBP1.0,SL1 ;P1.0=0,S0未按下,轉(zhuǎn)判SL1

JNBP1.1,RED ;P1.0=1,S0按下;且P1.1=0,S1未按下,轉(zhuǎn)紅燈亮YELW:SETBP1.4 ;黃燈亮

CLRP1.2 ;紅燈滅

CLRP1.3 ;綠燈滅

SJMPSL0 ;轉(zhuǎn)循環(huán)SL1:JNBP1.1,YELW;P1.0=0,S0未按下;P1.1=0,S1未按下,轉(zhuǎn)黃燈亮GREN:SETBP1.3 ;綠燈亮

CLRP1.2 ;紅燈滅

CLRP1.4 ;黃燈滅

SJMPSL0 ;轉(zhuǎn)循環(huán)RED:SETBP1.2 ;紅燈亮

CLRP1.3 ;綠燈滅

CLRP1.4 ;黃燈滅

SJMPSL0 ;轉(zhuǎn)循環(huán)

循環(huán)程序循環(huán)初始化循環(huán)次數(shù)計(jì)數(shù)器,工作寄存器設(shè)初值等循環(huán)體盡量簡(jiǎn)練;注意地址指針的修改循環(huán)控制檢查結(jié)束條件,及時(shí)退出循環(huán)允許外重循環(huán)嵌套內(nèi)重循環(huán)循環(huán)體不能交叉不能從循環(huán)程序外部跳入循環(huán)程序內(nèi)部注意循環(huán)嵌套循環(huán)程序流程圖【例】設(shè)Xi均為單字節(jié)數(shù),并按順序存放在以50H為首地址的內(nèi)RAM存儲(chǔ)單元中,數(shù)據(jù)長(zhǎng)度(個(gè)數(shù))N存在R2中,試編程求和S=X1+X2+‥‥+XN,并將S(雙字節(jié))存放在R3R4中,(設(shè)S<65536)。解:程序如下:SXN:MOVR2,#N ;置數(shù)據(jù)長(zhǎng)度(循環(huán)次數(shù))MOVR3,#00H;和單元(高8位)清0MOVR4,#00H;和單元(低8位)清0MOVR0,#50H;求和數(shù)據(jù)區(qū)首址LOOP:MOVA,R4 ;讀前次低8位和

ADDA,@R0 ;低8位累加

MOVR4,A ;存低8位和

CLRA;

ADDCA,R3;高8位加進(jìn)位

MOVR3,A;存高8位和

INCR0;指向下一數(shù)據(jù)循環(huán)修改

DJNZR2,LOOP;判N個(gè)數(shù)據(jù)累加完否?循環(huán)控制

RET;退出循環(huán)退出循環(huán)

置循環(huán)初值循環(huán)體【例】編寫(xiě)延時(shí)10ms子程序,fosc=12MHz。

解:fosc=12MHz,一個(gè)機(jī)器周期為1s。DY10ms:MOVR6,#20;置外循環(huán)次數(shù)DLP1:MOVR7,#250;置內(nèi)循環(huán)次數(shù)DLP2:DJNZR7,DLP2;2機(jī)周×250=500機(jī)周

DJNZR6,DLP1;500機(jī)周×20=10000機(jī)周

RET;說(shuō)明:MOVRn指令為1個(gè)機(jī)器周期;DJNZ指令為2個(gè)機(jī)器周期;RET指令為2個(gè)機(jī)器周期;{[(2機(jī)周×250)+1+2]×20+1+2}×1s/機(jī)周=10063s≈10ms2014-9-6LJY21【課堂練習(xí)題】

按下列要求編寫(xiě)延時(shí)子程序:(1)延時(shí)2ms,fosc=6MHz;(2)延時(shí)10s,fosc=12MHz;設(shè)80C51單片機(jī)的P1口作為輸出口,經(jīng)驅(qū)動(dòng)電路74LS240(8反相三態(tài)緩沖/驅(qū)動(dòng)器)接8只發(fā)光二極管,如下圖所示。當(dāng)輸出位為“1”時(shí),發(fā)光二極管點(diǎn)亮,輸出位為“0”時(shí)為暗。試編程實(shí)現(xiàn):每個(gè)燈閃爍點(diǎn)亮10次,再轉(zhuǎn)移到下一個(gè)燈閃爍點(diǎn)亮10次,循環(huán)不止?!纠烤幹埔粋€(gè)循環(huán)閃爍燈的程序。FLASH:MOVA,#01H ;置燈亮初值FSH0:MOVR2,#0AH ;置閃爍次數(shù)FLOP:MOVP1,A ;點(diǎn)亮

LCALLDY1s ;延時(shí)1sMOVP1,#00H ;熄滅

LCALLDY1s ;延時(shí)1sDJNZR2,FLOP ;閃爍10次

RL A ;左移一位

SJMPFSH0 ;循環(huán)

RET 解:程序如下:延時(shí)子程序可根據(jù)延時(shí)長(zhǎng)短,自行編寫(xiě)。

【課堂練習(xí)題】

根據(jù)上圖電路,設(shè)計(jì)燈亮移位程序,要求8只發(fā)光二極管每次點(diǎn)亮一個(gè),點(diǎn)亮?xí)r間為250ms,順序是從下到上一個(gè)一個(gè)地循環(huán)點(diǎn)亮。設(shè)fosc=6MHz。查表程序

主要用于:復(fù)雜代碼轉(zhuǎn)換顯示數(shù)據(jù)補(bǔ)償:傳感器補(bǔ)償復(fù)雜函數(shù)計(jì)算:Y=SIN(X)查表指令用于查表的指令有兩條:⑴MOVCA,@A+DPTR⑵MOVCA,@A+PC當(dāng)用DPTR作基址寄存器時(shí),查表的步驟分三步:①基址值(表格首地址)→DPTR;②變址值(表中要查的項(xiàng)與表格首地址之間的間隔字節(jié)數(shù))→A;③執(zhí)行MOVCA,@A+DPTR。

注:當(dāng)用PC作基址寄存器時(shí),其表格首地址與PC值間距不能超過(guò)256字節(jié),且編程要事先計(jì)算好偏移量,比較麻煩。因此,一般情況下用DPTR作基址寄存器。解:編程如下:TEST: MOVDPTR,#TAB;置平方表首址

MOVA,30H ;讀數(shù)據(jù)序號(hào)

MOVCA,@A+DPTR;讀對(duì)應(yīng)平方數(shù)據(jù)

MOV31H,A ;存平方數(shù)據(jù)

RET;TAB:DB0,1,4,9,16,25,36,49,64,81,100;0~10平方表【例】用查表程序求0~10之間整數(shù)的平方。已知該整數(shù)存在內(nèi)RAM30H中,查得平方數(shù)存內(nèi)RAM31H。已知平方表首地址為TAB。解:編程如下:CHAG:MOVDPTR,#TABD;置共陰字段碼表首址

MOVA,30H;讀顯示數(shù)字

MOVCA,@A+DPTR;查表,轉(zhuǎn)換為顯示字段碼

MOV30H,A;存顯示字段碼

RET;TABD:DB3FH,06H,5BH,4FH,66H;0~4共陰字段碼表

DB6DH,7DH,07H,7FH,6FH;5~9共陰字段碼表【例】在單片機(jī)應(yīng)用系統(tǒng)中,常用LED數(shù)碼管顯示數(shù)碼,但顯示數(shù)字(≤9)與顯示數(shù)字編碼并不相同,需要將顯示數(shù)字轉(zhuǎn)換為顯示字段碼,通常是用查表的方法?,F(xiàn)要求將30H中的顯示數(shù)字轉(zhuǎn)換為顯示字段碼并存入30H。已知共陰字段碼表首址為TABD。散轉(zhuǎn)程序設(shè)計(jì)

JMP@A+DPTR

轉(zhuǎn)移指令表地址偏移量采用”RET”指令進(jìn)行散轉(zhuǎn)

散轉(zhuǎn)程序是一種并行多分支程序。

在單片機(jī)系統(tǒng)中設(shè)置+、、、四個(gè)運(yùn)算命令鍵,它們的鍵號(hào)分別為0、1、2、3。當(dāng)其中一個(gè)鍵按下時(shí),進(jìn)行相應(yīng)的運(yùn)算。操作數(shù)由P1口和P3口輸入,運(yùn)算結(jié)果仍由P1口和P3口輸出。具體如下:P1口輸入被加數(shù)、被減數(shù)、被乘數(shù)和被除數(shù),輸出運(yùn)算結(jié)果的低8位或商;P3口輸入加數(shù)、減數(shù)、乘數(shù)和除數(shù),輸出進(jìn)位(借位)、運(yùn)算結(jié)果的高8位或余數(shù)。鍵盤號(hào)已存放在30H中?!纠繂纹瑱C(jī)四則運(yùn)算解:程序如下:PRGM:MOVP1,#0FFH;P1口置輸入態(tài)

MOVP3,#0FFH;P3口置輸入態(tài)

MOVDPTR,#TBJ;置“+-×÷”表首地址

MOVA,30H;讀鍵號(hào)

RLA;鍵號(hào)2→A ADDA,30H;鍵號(hào)3→A JMP@A+DPTR;散轉(zhuǎn)TBJ:LJMPPRGM0

;轉(zhuǎn)PRGM0(加法)LJMPPRGM1

;轉(zhuǎn)PRGM1(減法)LJMPPRGM3

;轉(zhuǎn)PRGM3(除法)LJMPPRGM2

;轉(zhuǎn)PRGM2(乘法)PRGM0:MOVA,P1;讀加數(shù)

ADDA,P3;P1+P3MOVP1,A;和→P1CLRA;ADDCA,#00H;進(jìn)位→AMOVP3,A;進(jìn)位→P3RET;

PRGM1:MOVA,P1;讀被減數(shù)

CLRC;SUBBA,P3;P1-P3MOVP1,A;差→P1CLRA;RLCA;借位→AMOVP3,A;借位→P3RET;PRGM2:MOVA,P

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論