《單片機(jī)原理及應(yīng)用》課件-第5章 MCS-51單片機(jī)的程序設(shè)計(jì)_第1頁(yè)
《單片機(jī)原理及應(yīng)用》課件-第5章 MCS-51單片機(jī)的程序設(shè)計(jì)_第2頁(yè)
《單片機(jī)原理及應(yīng)用》課件-第5章 MCS-51單片機(jī)的程序設(shè)計(jì)_第3頁(yè)
《單片機(jī)原理及應(yīng)用》課件-第5章 MCS-51單片機(jī)的程序設(shè)計(jì)_第4頁(yè)
《單片機(jī)原理及應(yīng)用》課件-第5章 MCS-51單片機(jī)的程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩34頁(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)介

Chapter

FiveMCS-51單片機(jī)的程序設(shè)計(jì)目錄CONTENT5.1.1單片機(jī)程序設(shè)計(jì)語(yǔ)言5.1.2程序設(shè)計(jì)步驟5.1.3程序流程圖5.1程序設(shè)計(jì)基本方法5.2.1MCS-51偽指令5.2.2匯編語(yǔ)言程序的格式5.2.3匯編語(yǔ)言程序的匯編5.2匯編語(yǔ)言程序設(shè)計(jì)的基本概念

5.3單片機(jī)匯編語(yǔ)言與C51語(yǔ)言的程序設(shè)計(jì)5.1程序設(shè)計(jì)基本方法5.1.1單片機(jī)程序設(shè)計(jì)語(yǔ)言設(shè)計(jì)語(yǔ)言基本分類:機(jī)器語(yǔ)言匯編語(yǔ)言高級(jí)語(yǔ)言MCS-51系列單片機(jī)的匯編語(yǔ)言和C51程序設(shè)計(jì)。5.1.2程序設(shè)計(jì)步驟(1)分析題意,明確要求;(2)建立思路,確定算法;(3)編制框圖,繪出流程;(4)分配內(nèi)存工作區(qū)及相關(guān)端口地址。(5)編寫(xiě)源程序及相關(guān)注釋,上機(jī)調(diào)試;(6)固化程序。5.1.3程序流程圖畫(huà)流程圖是指用各種圖形、符號(hào)、指向線等來(lái)說(shuō)明程序設(shè)計(jì)的過(guò)程。橢圓框:起止框,在程序的開(kāi)始和結(jié)束時(shí)使用。矩形框:處理框,表示要進(jìn)行的各種操作。菱形框:判斷框,表示條件判斷,以決定程序的流向。根據(jù)條件在兩個(gè)可供選擇的程序處理流程中做出判斷,選擇其中的一條程序處理流程。指向線:流程線,表示程序執(zhí)行的流向。圓圈:連接符,表示不同頁(yè)之間的流程連接。與程序流程圖的其它部分相連結(jié)的入口或出口。5.2匯編語(yǔ)言程序設(shè)計(jì)的基本概念5.2.1MCS-51偽指令偽指令是不能執(zhí)行的指令,在匯編時(shí)起控制作用。(1)匯編起始命令格式:ORG16位地址(2)匯編結(jié)束命令格式:ENDEND是匯編語(yǔ)言源程序的結(jié)束標(biāo)志。(3)等值命令格式:字符名稱EQU數(shù)或匯編符號(hào)5.2匯編語(yǔ)言程序設(shè)計(jì)的基本概念5.2.1MCS-51偽指令

ORG1000HSTART:MOV R0,2FH MOV R2,#00H MOV A,@R0 MOV R3,A INC R3 SJMP NEXTLOOP:INC R0 CJNE @R0,#44H,NEXT INC R2NEXT: DJNZ R3,LOOP MOV 2AH,R2 SJMP $

END

ORG1000H

XEQU2FHSTART:MOV R0,2FH MOV R2,#00H MOV A,@R0 MOV R3,A INC R3 SJMP NEXTLOOP:INC R0 CJNE @R0,#44H,NEXT INC R2NEXT: DJNZ R3,LOOP MOV 2AH,R2 SJMP $ENDX5.2匯編語(yǔ)言程序設(shè)計(jì)的基本概念

(4)數(shù)據(jù)地址賦值命令格式:字符名稱DATA表達(dá)式

(5)定義字節(jié)指令格式:[標(biāo)號(hào):]DB8位二進(jìn)制數(shù)表

(6)定義字命令格式:[標(biāo)號(hào):]DW16位二進(jìn)制數(shù)表

(7)定義空間命令格式:[標(biāo)號(hào):]DS表達(dá)式

(8)位地址符號(hào)命令格式:字符名稱BIT位地址5.2.2匯編語(yǔ)言程序的格式格式:

標(biāo)號(hào): 操作數(shù)

;注釋匯編語(yǔ)言程序的每一句程序一般由四部分組成,即標(biāo)號(hào)、操作碼、操作數(shù)和注釋。B3,4A,DC,DELY,ADD

,LOOP,A+B,ad,END√×

√×

√√×

√×

課堂知識(shí)鞏固:標(biāo)號(hào)判斷:5.2.3匯編語(yǔ)言程序的匯編人工匯編機(jī)器匯編5.3.116位加減法程序已知兩個(gè)16位二進(jìn)制數(shù)分別存放在R1R0和R3R2中,試求其和,并將結(jié)果存入R1R0中。

加數(shù): R1R0被加數(shù): R3R2結(jié)果: R1R0

匯編語(yǔ)言程序:ORG 0000HCLR CMOV A,R2ADD A,R0MOV R0,AMOV A,R3ADDC A,R1MOV R1,ASJMP $ENDvoidmain(void){ intdatax,y; x=x+y;}分析:C51語(yǔ)言程序:5.3.2順序程序特點(diǎn):按指令的排列順序一條條地執(zhí)行,直到全部指令執(zhí)行完畢為止。例5-4:編寫(xiě)邏輯運(yùn)算程序,功能為F=X(Y+Z)。其中F、X、Y、Z均為位變量,依次存在以30H為首址的位尋址區(qū)中。

F BIT 30H X BIT 31H Y BIT 32H Z BIT 33H ORG 0000H SJMP MAIN ORG 0040HMAIN: MOV C,Y ;Y→C ORL C,Z ;Y+Z→C ANL C,X ;X(Y+Z)→C MOV F,C ;C→F SJMP $ ENDvoidmain(void){ bitF,X,Y,Z; F=X&&(Y||Z);}5.3.2順序程序例5-5:編寫(xiě)邏輯運(yùn)算程序,功能為 ORG 0000H SJMP MAIN ORG 0040HMAIN:

MOV C,P2.0 ;P2.0→C ORL C,P1.0 ;P2.0+P1.0→C ANL C,P1.1 ;(P2.0+P1.0)·P1.1→C MOV P2.0,C ;C→P2.0 SJMP $ END5.3.2順序程序例5-5:編寫(xiě)邏輯運(yùn)算程序,功能為sbit P1_0=P1^0; /*定義P1.0、P1.1、P2.0*/sbit P1_1=P1^1;sbit P2_0=P2^0;voidmain(void){ P2_0=P1_1&&(P2_0||P1_0);}5.3.2順序程序例5-6某設(shè)備計(jì)數(shù)器數(shù)值(0~255)存放在內(nèi)部RAM30H單元中,試將其數(shù)據(jù)十進(jìn)制形式的個(gè)位、十位、百位數(shù)據(jù)分別存放于31H、32H和33H單元中。ORG 0100HMOV A,30HMOV B,#10DIV AB

MOV 31H,BMOV B,#10DIV AB

MOV 32H,B MOV 33H,A ENDvoidmain(void){unsignedcharcounter,unit,decade,hundred; hundred=counter/100;decade=counter/10%10;unit=counter%10;

}5.3.3分支程序根據(jù)不同條件轉(zhuǎn)向不同的處理程序,這種結(jié)構(gòu)的程序稱為分支程序。執(zhí)行一條判斷指令時(shí),只能形成兩路分支。!例5-7:假設(shè)內(nèi)部RAM40H與41H單元中有兩個(gè)無(wú)符號(hào)數(shù),現(xiàn)要求找出其中的較大者,并將其存入40H單元中,較小者存入41H單元。 ORG 0000H MOV A,40H CLR C SUBB A,41H JNC EXIT MOV A,40H XCH A,41H MOV 40H,AEXIT: SJMP EXIT ENDvoidmain(void){ unsignedchardata*x1,*x2; unsignedchardatatemp; x1=0x40; x2=0x41; if(*x1<*x2){ temp=*x2;*x2=*x1;*x1=temp; }}5.3.3分支程序應(yīng)用C語(yǔ)言程序設(shè)計(jì)時(shí),一般程序不會(huì)直接管理內(nèi)存,具體變量的存放位置由編譯系統(tǒng)給定。兩個(gè)無(wú)符號(hào)數(shù)x1,x2用unsignedchar字符型數(shù)定義,定位于片內(nèi)RAM中。找出其中的較大者,存到x1中,用C51編程。voidmain(void){unsignedcharx1,x2,temp;/*x1,x2被定義為無(wú)符號(hào)數(shù),temp存放臨時(shí)數(shù)據(jù)*/if(x1<x2){ temp=x2;x2=x1;x1=temp;}}5.3.3分支程序例5-8:已知30H單元中有一變量X,要求編寫(xiě)一程序按下述要求給Y賦值,結(jié)果存入31H單元。三分支程序5.3.3分支程序ORG0000HMOVA,30HJZLP1 ;X=0,轉(zhuǎn)LP1處理JNBACC.7,LP2 ;X>0,轉(zhuǎn)LP2處理MOVA,#0FFH ;X<0,則Y=–1SJMPLP1LP2:ADDA,#01 ;X>0,Y=X+1LP1:MOV31H,A ;存結(jié)果SJMP$

;循環(huán)等待,$表示轉(zhuǎn)至本地址END采用C51語(yǔ)言程序設(shè)計(jì)如下:根據(jù)C51的數(shù)據(jù)類型規(guī)定,使用char字符類型定義x,y,定位于片內(nèi)RAM中。voidmain(void){chardatax,y; /*x,y被定義為兩個(gè)指向DATA存儲(chǔ)器空間的指針*/if(x>0){ y=x+1;}elseif(x==0){ y=0;}else{ y=-1;}}5.3.4循環(huán)程序循環(huán)程序一般由如下四部分組成:初始化部分:用來(lái)設(shè)置循環(huán)初值,包括預(yù)置變量、計(jì)數(shù)器和數(shù)據(jù)指針初值,為實(shí)現(xiàn)循環(huán)做準(zhǔn)備。循環(huán)處理部分:要求重復(fù)執(zhí)行的程序段,是程序的主體,稱為循環(huán)體。循環(huán)體既可以是單個(gè)指令,也可以是復(fù)雜的程序段,通過(guò)它可完成對(duì)數(shù)據(jù)進(jìn)行實(shí)際處理的任務(wù)。循環(huán)控制部分:控制循環(huán)次數(shù),為進(jìn)行下一次循環(huán)而修改計(jì)數(shù)器和指針的值,并檢查該循環(huán)是否已執(zhí)行了足夠的次數(shù)。也就是說(shuō),該部分用條件轉(zhuǎn)移采控制循環(huán)次數(shù)和判斷循環(huán)是否結(jié)束。循環(huán)結(jié)束部分:分析和存放結(jié)果。12345.3.4循環(huán)程序①初始化部分②循環(huán)處理部分③循環(huán)控制部分④循環(huán)結(jié)束部分例5-9試編寫(xiě)統(tǒng)計(jì)數(shù)據(jù)區(qū)長(zhǎng)度的程序。設(shè)數(shù)據(jù)區(qū)從外部RAM1000H單元開(kāi)始,該數(shù)據(jù)區(qū)以0結(jié)束,統(tǒng)計(jì)結(jié)果送入外部RAM1100H單元。題意:根據(jù)題目要求,編寫(xiě)統(tǒng)計(jì)數(shù)據(jù)長(zhǎng)度子程序ADUP,同時(shí)編寫(xiě)主程序,調(diào)用ADUP子程序。統(tǒng)計(jì)數(shù)據(jù)長(zhǎng)度子程序如下:

ORG 0400HADUP: MOV 2FH,#00H ;數(shù)據(jù)長(zhǎng)度清零

MOV DPTR,#1000H ;置數(shù)據(jù)區(qū)首址ALOP: MOVXA,@DPTR ;取數(shù)據(jù)內(nèi)容

JZ LP1 ;判斷是否為結(jié)束標(biāo)志0,若數(shù)據(jù)區(qū)結(jié)束,則跳轉(zhuǎn)到LP1 INC 2FH ;數(shù)據(jù)區(qū)未統(tǒng)計(jì)完畢,長(zhǎng)度加一

INC DPTR ;修改數(shù)據(jù)區(qū)地址

SJMP ALOPLP1: MOV DPTR,#1100H ;數(shù)據(jù)長(zhǎng)度存放單元地址

MOV A,2FH MOVX@DPTR,A ;將統(tǒng)計(jì)數(shù)據(jù)區(qū)長(zhǎng)度數(shù)送入外部RAM1100單元

RET ;子程序返回例5-9試編寫(xiě)統(tǒng)計(jì)數(shù)據(jù)區(qū)長(zhǎng)度的程序。設(shè)數(shù)據(jù)區(qū)從外部RAM1000H單元開(kāi)始,該數(shù)據(jù)區(qū)以0結(jié)束,統(tǒng)計(jì)結(jié)果送入外部RAM1100H單元。接上頁(yè)主程序如下:ORG 0000HSJMP MAIN ;單片機(jī)程序復(fù)位地址,程序無(wú)條件跳轉(zhuǎn)到MAINORG 0040HMAIN: ;主程序入口地址……LCALL ADUP ;調(diào)用子程序SJMP $ ;原地等待END例5-9試編寫(xiě)統(tǒng)計(jì)數(shù)據(jù)區(qū)長(zhǎng)度的程序。設(shè)數(shù)據(jù)區(qū)從外部RAM1000H單元開(kāi)始,該數(shù)據(jù)區(qū)以0結(jié)束,統(tǒng)計(jì)結(jié)果送入外部RAM1100H單元。采用C51語(yǔ)言程序設(shè)計(jì)如下:unsignedcharxdataptr;//指向外部RAM數(shù)據(jù)區(qū)的指針unsignedcharxdatadata_len_at_0x1100; //數(shù)據(jù)長(zhǎng)度存放單元地址voidmain(void){data_len=0;ptr=0x1000;while(*ptr!=0){ ptr++; data_len++;}}5.3.4循環(huán)程序例5-10:編寫(xiě)延時(shí)10ms子程序,fosc=12MHz。根據(jù)題目要求,編寫(xiě)延時(shí)程序首先必須要知道晶振的頻率,然后計(jì)算機(jī)器周期?!遞osc=12MHz∴T機(jī)器=121/fosc=1usMCS-51單片機(jī)對(duì)每一條指令都給出了它的指令周期數(shù)。

DY10ms: MOV R6,#20 ;置外循環(huán)次數(shù)DLP1: MOV R7,#250 ;置內(nèi)循環(huán)次數(shù)DLP2: DJNZ R7,DLP2 ;2機(jī)周×250=500機(jī)周

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

RET{1+[1+(2機(jī)周×250)+2]×20+2}×1s/機(jī)周=10063s≈10ms

MOVRn指令為1個(gè)機(jī)器周期; DJNZ指令為2個(gè)機(jī)器周期; RET指令為2個(gè)機(jī)器周期;循環(huán)程序設(shè)計(jì)延時(shí)程序中延時(shí)時(shí)間的設(shè)定:源程序:指令周期DELAY:MOVR6,#(X)H2個(gè)T機(jī)器

DEL2:MOVR7,#(Y)H2個(gè)T機(jī)器

DEL1:

DJNZR7,DEL12個(gè)T機(jī)器

DJNZR6,DEL22個(gè)T機(jī)器

RET#200#125指令周期、機(jī)器周期T機(jī)器與時(shí)鐘周期T時(shí)鐘的關(guān)系:T機(jī)器=12T時(shí)鐘=121/fosc=1us(假設(shè)晶振頻率fosc為12MHz)延時(shí)時(shí)間的簡(jiǎn)化計(jì)算結(jié)果:2xXxY若想延時(shí)50ms,只需修改計(jì)數(shù)初始值,即2x

125x

200us=50ms延時(shí)時(shí)間怎樣計(jì)算?循環(huán)程序設(shè)計(jì)延時(shí)程序中延時(shí)時(shí)間的設(shè)定:源程序:指令周期DELAY:MOVR3,#(X)H2個(gè)T機(jī)器DEL2:MOVR4,#(Y)H2個(gè)T機(jī)器DEL1:NOP1個(gè)T機(jī)器

NOP1個(gè)T機(jī)器

DJNZR4,DEL12個(gè)T機(jī)器

DJNZR3,DEL22個(gè)T機(jī)器

RET#200#125指令周期、機(jī)器周期T機(jī)器與時(shí)鐘周期T時(shí)鐘的關(guān)系:T機(jī)器=12T時(shí)鐘=12

x1/fosc=1us(假設(shè)晶振頻率fosc為12MHz)延時(shí)時(shí)間的簡(jiǎn)化計(jì)算結(jié)果:(1+1+2)x

Xx

Y若想延時(shí)100ms,只需修改計(jì)數(shù)初始值,即(1+1+2)

x125

x200us=100ms5.3.4循環(huán)程序例5-10:編寫(xiě)延時(shí)10ms子程序,fosc=12MHz。根據(jù)C51的數(shù)據(jù)類型規(guī)定,使用指針類型定義x,y,定位于片內(nèi)RAM中。程序如下:voiddelay_10ms(void){ unsignedchari,j; /*i,j定位于片內(nèi)RAM中*/ for(i=0;i<13;i++) /*i,j的循環(huán)次數(shù)由延時(shí)時(shí)間確定*/ for(j=0;j<250;j++);} 5.3.4循環(huán)程序例5-10:編寫(xiě)延時(shí)10ms子程序,fosc=12MHz。使用KEILC的C51編譯器和連接軟件將delay()延時(shí)子程序編譯后,可得對(duì)應(yīng)的反匯編程序如下,C:0x0003E4 CLRAC:0x0004FF MOVR7,AC:0x0005E4 CLRAC:0x0006FE MOVR6,AC:0x00070E INCR6C:0x0008BE18FCCJNER6,#0xFA,C:0007C:0x000B0F INCR7C:0x000CBF64F6CJNER7,#0x0D,C:0005C:0x000F22 RETR60xFA(250)R70x0D(13)5.3.5查表程序表格是事先存放在ROM中的,一般為一串有序的常數(shù)。(平方表、字型碼)表格可通過(guò)偽指令DB來(lái)確定。通過(guò)查表指令 MOVCA,@A+DPTR MOVCA,@A+PC來(lái)實(shí)現(xiàn)。當(dāng)用DPTR作基址寄存器時(shí),查表的步驟分三步:①基址值(表格首地址)→DPTR;②變址值(表中要查的項(xiàng)與表格首地址之間的間隔字節(jié)數(shù))→A;③執(zhí)行MOVCA,@A+DPTR。一般情況下用DPTR作基址寄存器。5.3.5查表程序例5-11:用查表法計(jì)算平方。用DPTR作基址寄存器時(shí),源程序如下:

ORG 0000H MOV DPTR,#TABLE;表首地址送DPTR MOV A,#05 ;被查數(shù)字5→A MOVC A,@A+DPTR ;查表求平方

SJMP $TABLE:DB 0,1,4,9,16,25,36,49,64,81 END5.3.5查表程序例5-11:用查表法計(jì)算平方。C51源程序如下:unsignedcharcodetable[10]={0,1,4,9,16,25,36,49,64,81};voidmain(void){ unsignedchari,j; /*i,j定位于片內(nèi)RAM中*/ i=5; j=table[i];}5.3.6散轉(zhuǎn)程序散轉(zhuǎn)程序是指通過(guò)修改某個(gè)參數(shù)后,程序可以有三個(gè)以上的流向,多用于鍵盤(pán)程序。常用的指令是JMP@A+DPTR,該指令是把16位數(shù)據(jù)指針DPTR的內(nèi)容與累加器A中的8位無(wú)符號(hào)數(shù)相加,形成地址,裝入程序計(jì)數(shù)器PC,形成散轉(zhuǎn)的目的地址。在C51語(yǔ)言程序設(shè)計(jì)中,常用switch/case語(yǔ)句處理多路分支的情況。5.3.6散轉(zhuǎn)程序例5-12:根據(jù)R7的內(nèi)容,轉(zhuǎn)向各自對(duì)應(yīng)的操作程序(R7=0,轉(zhuǎn)入OPR0;……;R7=n,轉(zhuǎn)入OPRn。C51源程序如下:假定工作寄存器R7在0區(qū),則對(duì)應(yīng)的內(nèi)部RAM地址為07H。unsignedchardataOpr_data_at_0x07; //定義R7地址

switch(Opr_data){ case0: …… //OPR1對(duì)應(yīng)的程序段

break; //轉(zhuǎn)向?qū)?yīng)的散轉(zhuǎn)地址人口

…… case7: …… //OPR7對(duì)應(yīng)的程序段

break; default: break;}5.3.7子程序(1)要給每個(gè)子程序起一個(gè)名字,也就是入口地址的代號(hào)。(2)要能正確地傳遞參數(shù)。即首先要有入口條件,說(shuō)明進(jìn)入子程序時(shí),它所要處理的數(shù)據(jù)放在何處。另外,要有出口條件,即處理的結(jié)果存放在何處。(3)注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。5.3.7子程序例5-13:利用子程序的參數(shù)傳遞,計(jì)算平方和c=a2+b2(假設(shè)c<255)。SQR:

PUSH DPH ;保護(hù)現(xiàn)場(chǎng),將主程序中DPTR的高八位放入堆

溫馨提示

  • 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)論