第二章單片機技術(基礎)課件_第1頁
第二章單片機技術(基礎)課件_第2頁
第二章單片機技術(基礎)課件_第3頁
第二章單片機技術(基礎)課件_第4頁
第二章單片機技術(基礎)課件_第5頁
已閱讀5頁,還剩79頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

大家好第二章

MCS-51系列單片機系統結構§2.1MCS-51單片機的硬件結構(8051)§2.2MCS-51的中央處理器CPU§2.3MCS-51的同步時鐘和復位§2.4CPU的時序(定時)§2.5存儲器組織

§2.6指令系統基本概念§2.7指令格式§2.8尋址方式

§2.9數據操作和指令類型§2.10MCS-51指令系統簡介§2.11

匯編語言程序設計方法§2.1MCS-51單片機的硬件結構一.總體結構(8051)圖2-1(89C52)圖2-2二.內部資源CPU 8位程序存儲器:4KROM(89C52有8K)數據存儲器:128字節RAM(89C52有256字節)定時器/計數器:2個(89C52有3個)并行口:4個串行口:1個中斷源:5個(89C52有6個)時鐘頻率:1.5MHZ~12MHZ三.外部引腳和邏輯符號圖2-3和圖2-4P0口~P3口:48 32根線ALE,PSEN,EA:系統擴展控制線3根XTAL1,XTAL2:時鐘電路接入線2根RST:復位線1根VCC,VSS:工作電源線,接地線 2根@§2.2MCS-51的中央處理器CPU一.運算器1.算術邏輯運算器ALU運算數據寬度:8位或1位運算功能包括:

1)邏輯與、或、異或、循環移位、求補、清零及1位變量的置‘1’、清零、求補、位測試轉移、與、或

2)算術加、減、乘、除2.累加器A數據寬度:8位功能包括:

1)ALU輸入數據之一

2)CPU數據傳送中轉寄存器

3)具有數據加‘1’和減‘1’、移位等功能3.寄存器B數據寬度:8位功能:乘除法中的“乘數”或“除數”及結果的數據寄存單元,也可用作一般的數據寄存單元。@§2.2MCS-51的中央處理器CPU一.運算器4.程序狀態字寄存器PSWPSW格式:

PSW中的各位功能:(1)Cy(Psw.7)進位標志位,也是位累加器C(2)Ac(Psw.6)輔助半進位標志。(3)F0(Psw.5)用戶狀態標志(4)RS1、RS0(Psw.4、Psw.3)4組工作寄存器區選擇控制位(5)OV(Psw.2)溢出標志(6)F1(Psw.1)用戶狀態標志(7)P(Psw.0)奇偶標志位,判斷累加器A中的為“1”位的奇偶性。@CyAcF0RS1RS0OVF0PD7D6D5D4D3D2D1D0PSWD0H§2.2MCS-51的中央處理器CPU二.控制器1.程序計數器PC

程序計數器是一個可并行預置的16位計數器,作用是提供下一條將要執行的指令的在程序存儲器中存放的地址值。工作方式:(1)程序計數器在時鐘脈沖控制下自動加“1”,達到順序執行程序(2)由轉移指令直接并行置入新值,達到程序轉移執行(3)由調用子程序指令直接并行置入新值,達到執行子程序2.指令寄存器指令寄存器IR是用來存放正在執行的指令的操作碼3.指令譯碼器指令譯碼器是對指令操作碼進行譯碼、識別,產生對應的指令控制信號,從而完成指令的功能。4.指令控制邏輯電路在指令譯碼信號指示下產生完成具體的指令功能的控制信號,控制各部件完成指令功能。@§2.3MCS-51的同步時鐘和復位一.同步時鐘和時鐘電路

單片機實際上是一個復雜的同步時序電路,所以必須在一個同步時鐘控制下才能工作,時鐘電路即產生該同步時鐘信號。內部時鐘電路時鐘產生法

該方法由內部時鐘電路和外接晶振構成,接法如圖2-8所示外部直接時鐘輸入法

該方法將外部時鐘信號直接由時鐘引腳輸入,接法如圖2-9所示二.復位和復位電路

通過復位功能使單片機上電后從初始的固定狀態開始工作。復位后內部寄存器的初始狀態如表2-6所示上電自動復位電路如圖2-12a所示(微分電路)人工復位電路如圖2-12b所示系統總復位電路

時序上要求是CPU比其它部件同時或延后退出復位,不得先退出復位,其實現電路如圖2-13所示@§2.4CPU的時序(定時)一.

CPU的指令執行時序如圖2-10所示

CPU每條指令的執行過程可以分成幾個微操作完成,而每個微操作又可分成幾個微步;這些微步、微操作、及指令執行所需的時間分別用狀態周期、機器周期、指令周期描述。二.

MCS-51的狀態周期、機器周期、指令周期狀態周期需2個時鐘周期(P1,P2)機器周期需6個狀態周期組成(S1,S2,…,S6),若晶振是12MHz,則一個機器周期是1us指令周期需1至4個機器周期三.

MCS-51指令周期特點大多數指令是1至2個機器周期MUL(乘法)和DIV(除法)指令是4個機器周期1字節1個機器周期、2字節1個機器周期、1字節2個機器周期。如圖2-10所示@§2.5存儲器組織MCS-51單片機的5個獨立的存儲器尋址空間如圖2-5所示64K字節程序存儲器空間(0~0FFFFH)128字節內部RAM空間(00~7FH)(89C52有256字節00~0FFH)128字節內部特殊功能寄存器空間(80~0FFH)位尋址空間(0~0FFH),(通用位存儲器128個,特殊位存儲器83個)64K字節外部數據存儲器(RAM/IO)空間(0~0FFFFH)存儲器系統按功能分成兩部分:

程序存儲器:64KB數據存儲器:64K+128~256字節存儲器系統按空間分成兩部分:片內存儲器:程序存儲器0~32KB字節,數據存儲器128~256個字節。片外存儲器:程序存儲器,數據存儲器64K。存儲器系統按存放信息的位數來分:字節存儲器8位位存儲器:1位,共有211位@§2.5存儲器組織一.程序存儲器 圖2-5程序存儲器空間:片內,片外編址:共64K,片內,片外統一編址,用16位二進制編地址??刂凭€:EA,PSEN,ALEEA=1,表示允許選用片內程序存儲器,地址從0000H開始,如果有4K,則末地址為0FFFH;片外程序存儲器的地址從1000H開始。

EA=0,表示禁止選用片內程序存儲器,程序存儲器全部在片外。片外程序存儲器的地址從0000H開始。

PSEN:是系統訪問外部程序存儲器的讀出信號專線,低電平有效。

ALE:地址鎖存控制信號,用于將訪問片外程序存儲器的低8位地址打入地址鎖存器。

CPU復位后,程序計數器PC為0,CPU總是從地址為0

的單元取指令開始執行程序。特殊用途單元圖2-6@§2.5存儲器組織二.數據存儲器圖2-51.概述數據存儲器空間:片內128byte(89C52為256字節);片外0~64KB;編址:片內數據存儲器用8位二進制編地址;片外數據存儲器用16位二進制編地址??刂凭€:2根。

RD:對片外數據存儲器進行讀(?。┎僮鳌?/p>

WR:對片外數據存儲器進行寫(存)操作。2.片外數據存儲器

CPU可尋址64K字節的外部數據存儲器

CPU對外部擴展RAM和I/O是統一編址,既讀/寫一個I/O口相當于讀/寫一個存儲器單元。@§2.5存儲器組織二.數據存儲器3.片內數據存儲器

一般為128(89C52為256)個字節,按功能分可分為:工作寄存器區、位尋址區、堆棧和數據緩沖器,如圖2-7所示工作寄存器區:0~1FH,分4個區,表2-1。4個區由PSW標志寄存器的RS0(D3)和RS1(D4)選擇。如表2-2所示。位尋址區:20H~2FH,用于存放各種程序標志,位控制變量。表2-4,每一位有一個地址,位地址的表示法。例3.166H=(2CH).6。堆棧和數據緩沖器:30H~7FH。數據緩沖器:用于存放數據和運算結果。堆棧:是一種特殊結構的緩沖器,里面的數據進出按先進后出,后進先出的原則操作。用于存放數據和斷點地址。其物理實體仍是數據存儲器。@§2.5存儲器組織二.數據存儲器4.特殊功能寄存器它們是一組專用寄存器,具有特定的功能,地址分布在80H~FFH。表2-3。

ACC:(Accumulator)累加器

PSW:(ProgramStateWord)程序狀態字寄存器,用于保存指令執行的結果,工作寄存器區的設置等,表。

SP:是8位的堆棧指針,用于管理堆棧緩沖區,使堆棧具有先進后出功能。

DPTR:是16位的數據指針,一般作為訪問外部數據存儲器的地址指針使用。

部分特殊功能寄存器位地址:見表2-5。位地址表示法:例3.2ACC中的D3位,可以表示為:E3、ACC.3;例3.3PSW中的D4位,可以表示為,RS1和PSW.4。@§2.6指令系統基本概念一.機器指令用一組二進制的編碼來描述計算機的某一個操作,這組編碼就是機器指令。計算機的指令系統是一套描述所有計算機的操作的編碼,這套二進制編碼稱為機器碼語言。二.匯編指令

用一種符號來描述計算機的某一個操作,這種符號就是匯編指令。用匯編指令來描述計算機的指令系統,這套匯編指令稱為匯編語言。三.匯編程序將匯編語言指令編譯成機器語言指令的程序,稱為匯編程序。@§2.6指令系統基本概念四.源程序和目標程序

用匯編語言編制的應用程序稱為匯編語言程序,簡稱源程序。將源程序匯編成機器碼程序,這機器碼程序稱為目標程序。五.偽指令:匯編命令

在匯編語言程序匯編過程需要一些匯編操作,指出這些匯編操作的指令稱為偽指令。@

§2.7指令格式及偽指令一.匯編語言指令格式操作碼:表示指令的功能。操作數:數據和地址,操作數可以是1、2、3個,或者沒有;數據以0~9數字開頭,如遇到16進制數A~F,則前面加0。例4.1

MOVA,#34H(MOVA,#0A3H)

LJMP8100H二.偽指令定位偽指令:ORG m;說明指令和數據的位置。定義字節偽指令:DBX1,X2,…Xn;將程序涉及到的數據和符號作為程序的一部分,其中Xi是一個字節。例4.2、例4.3定義字偽指令:DWY1,Y2,…Yn;將程序涉及到的數據作為程序的一部分,其中Yi是一個字,16位二進制數。例4.4、例4.5@操作碼操作數§2.7指令格式及偽指令二.偽指令匯編結束偽指令:END;表示源程序結束,匯編程序對后面的源程序不再翻譯。標號和注釋:帶標號和注釋后的程序行。

標號:操作碼〔操作數1),〔操作數2〕,〔操作數3〕;注釋@§2.7指令格式及偽指令三.常用的縮寫符號A

累加器ACCAB

累加器ACC和寄存器B組成的寄存器對direct

直接地址,取值為0~0FFH,其中80H~0FFH可用特殊寄存器名表示#data

立即數,表示一個常數0~0FFH@

間接尋址傳送寄存器()

寄存器的內容(())

由寄存器尋址的存儲器單元內容rrr

在指令編碼中表示寄存器Rn的號碼,R0~R7對應的號碼是000~111$

指本條指令起始地址rel

相對偏移量,其值為-128~+127@§2.8尋址方式

尋找操作數的方式,即尋找數據的方式和尋找地址的方式。一.立即尋址:

指令中直接給出操作數本身。

例4.6 MOV A, #70H;該指令是將常數70H復制至累加器ACC中,70H就稱為立即數。指令代碼見下圖。該指令中70H又稱為源操作數,A稱為目的操作數。

例4.7 LJMP9010H;該指令是將程序跳轉到9010H位置,操作數9010H是地址,把它送入程序計數器PC。指令代碼為02H、90H、10H。

@程序存儲器0111010001110000PCPC+170H操作碼立即數ACC§2.8尋址方式二.直接尋址:

指令中直接給出操作數的地址。例4.8 MOV A,70H;指令代碼為,E5H、70H;內部RAM地址為70H的內容可以作為一個操作數。若執行前存儲單元70H中的內容為0DFH,則執行后ACC的內容為0DFH。如下圖所示其地址的形成如圖4-2

注意:直接尋址方式能訪問以下三種存儲空間特殊功能寄存器(只能直接尋址)內部數據存儲器的低128字節位地址空間@程序存儲器1110010101110000PCPC+1操作碼直接地址內部RAM0DFH70H0DFHACC§2.8尋址方式三.寄存器尋址:

指令中給出操作數所在的寄存器地址,即操作數在寄存器中。例4.9 MOVA, R3;指令代碼為,11101rrr,即11101011。若執行前R3中的內容為0DFH,則執行后ACC的內容為0DFH。如下圖所示其地址形成如圖4-1所示注意:能用作寄存器尋址的寄存器有以下幾個R0~R7、ACC、B、DPTR、C@程序存儲器11101011

XXPCPC+1操作碼內部RAM0DFHR30DFHACC§2.8尋址方式四.寄存器間接尋址:

指令中給出的寄存器,其內容不是操作數,而是操作數地址。用@表示

例4.10 MOV A,@R1;若執行前R1的內容為30H,30H的內容為56H,ACC的內容為78H。則執行后ACC的內容為56H。如下圖所示這種尋址方式的地址構成如圖4-3所示注意:

1)能用作間接尋址的寄存器有:

R0、R1、DPTR

2)R0、R1能尋找內部存儲器和外部存儲器00H~0FFH

3)DPTR只能尋找外部存儲器單元0000H~0FFFFH@程序存儲器11100111

XXPCPC+1操作碼內部RAM30HR156HACCXX56H30H§2.8尋址方式四.寄存器間接尋址:這種尋址方式適用于處理批量數據。

例4.11要求將以30H為首地址的內部數據存儲器中的10個數據a0~a9,傳送到以40H為首地址的內部數據存儲器中去。如果按直接尋址的方式編程序,則如下所示:

MOV 40H,30H MOV 41H,31H MOV 42H,32H

::

MOV 49H,39H@§2.8尋址方式四.寄存器間接尋址:如果按寄存器間接尋址的方式編程序,則如下所示:

MOV R0,#30H MOV R1,#40H MOV R7,#10 LOOP: MOV A,@R0

MOV @R1, ACC INC R0 INC R1 DJNZ R7, LOOP@§2.8尋址方式五.基寄存器加變址寄存器間接尋址:

這種尋址方式以PC程序計數器或DPTR數據指針為基寄存器,以ACC累加器為變址寄存器,兩者相加的結果就是操作數地址。注意:

所尋找的存儲單元是程序存儲器

例4.12MOVC A,@A+PC;源操作數地址=(PC)+(ACC)

例4.13MOVC A,@A+DPTR;源操作數地址=(DPTR)+(ACC)其中變址寄存器ACC的內容是一個正整數。

@§2.8尋址方式六.相對尋址:

操作數是一個地址偏移量e,實際轉移地址為當前PC值加上偏移量e

例4.14SJMPe;轉移地址=當前PC值+e

注意:

1)e是一個偏移量,用8位二進制數的補碼表示。

2)當前PC值是指該轉移指令的后一條指令的地址當前PC值=340DH+2=340FH,若e=05H,該指令地址為340DH,則轉移地址=340FH+05H=3414H

當前PC值=1005H+2=1007H,若e=80H,該指令地址為1005H,則轉移地址=1007H+80H=0F87H,其中80H實際是0FF80H,其執行過程如圖4-5所示七.隱含尋址:指令碼中不含操作數。

例4.15RET;子程序返回指令。

@§2.9數據操作和指令類型一.數據操作

數據操作是指:數據傳送,算術運算,邏輯運算,布爾處理,控制轉移等操作。PSW用于存放數據被操作后的狀態。PSW的格式和功能

CY位:進位/借位標志。AC位:半進位/半借位標志。OV位:溢出標志,用于補碼運算。P位:奇偶標志,僅表示ACC的奇偶特性。RS1位、RS0位:工作寄存器區選擇位。F1位、F0位:用戶程序標志位。@D7D6D5D4D3D2D1D0CYACF0RS1RS0OVF1PPSW§2.9數據操作和指令類型二.指令類型按功能分:數據傳送指令,共28條算術運算指令,共24條邏輯運算指令,共25條位操作指令,共17條控制指令,共17條按指令長度分:

單字節指令,共49條雙字節指令,共45條3字節指令,共17條按指令執行時間分:

1個機器周期指令,共64條2個機器周期指令,共45條4個機器周期指令,共2條@§2.10MCS-51指令系統簡介數據傳送指令

牢記MOV、PUSH、POP、XCH、XCHD、MOVX、MOVC指令的在不同的尋址方式下所實現的功能算術運算指令牢記ADD、ADDC、INC、DA、SUBB、DEC、MUL、DIV指令在不同的尋址方式下所實現的功能和指令執行后對PSW特殊寄存器的相關位的影響邏輯運算指令

牢記CLR、CPL、RL、RLC、RR、RRC、SWAP、ANL、ORL、XRL指令在不同的尋址方式下所實現的功能和指令執行后對PSW特殊寄存器的相關位的影響§2.10MCS-51指令系統簡介位操作指令牢記MOV、CLR、CPL、SETB、ANL、ORL指令在不同的尋址方式下所實現的功能控制轉移指令牢記AJMP、SJMP、LJMP、JMP、JZ、JNZ、JC、JNC、JB、JNB、JBC、CJNE、DJNZ、ACALL、LCALL、RET、RETI指令在不同的尋址方式下所實現的功能和指令執行后對程序運行順序影響CPU執行指令的時序牢記CPU的時鐘周期、狀態、機器周期、指令周期基本概念,以及CPU執行指令的時序。§2.11

匯編語言程序設計方法一.程序設計的步驟分析問題,明確所要解決問題的要求確定算法,解決問題的方法制定程序框圖,確定程序運行的步驟確定數據格式,分配工作單元根據程序的流程圖編寫程序程序測試程序優化

§2.11

匯編語言程序設計方法二.程序流程圖的繪制

程序流程圖主要由一些有向線段和一些框圖組成??驁D的種類有以下幾種:設置指針執行框:表示某些操作,用一個寫有文字的矩形表示,比如判斷框:表示程序的分支處,用圖形或表示,框內寫上判斷的條件。A>0?開始框:表示某一程序的開始。用圖形表示。結束框:表示某一程序的結束。用圖形表示。開始結束§2.11

匯編語言程序設計方法三.匯編語言程序基本結構無論再復雜的程序,總可以將程序分解成三種程序結構,即順序結構、分支結構、循環結構。以下逐一闡述各種程序結構。§2.11

匯編語言程序設計方法1、順序結構程序設計順序結構程序不僅是最簡單的程序結構,而且是最基本的程序結構,其特點是程序按指令順序排列依次逐條執行。無論多么復雜的程序,總是可以分解成若干個順序結構的程序段。例4-7:若寄存器R2R3和R4R5分別存放了一組壓縮8421BCD碼,要求編一程序段將這兩組BCD碼數據相加,結果放在寄存器R6R7,進位放在Cy中?!?.11

匯編語言程序設計方法1、順序結構程序設計解:根據題意,程序編制如下:

BCDADD:MOVA,R3;取低位BCD碼數據于A。

ADDA,R5;兩個BCD碼數據低位相加。

DAA;BCD碼相加后調整。

MOVR7,A;存放BCD碼數據低位相加的結果。

MOVA,R2;取高位BCD碼數據于A。

ADDCA,R4;兩個BCD碼數據高位相加,并加上

;低位BCD碼數據相加產生的進位。

DAA;BCD碼相加后調整。

MOV R6,A;存放BCD碼數據高位相加結果。

SJMP$;程序在此打住。$表示該指令的首地址。

END;源程序結束。以上程序段執行時,從頭開始(BCDADD:MOVA,R3;),順序依次逐條執行至最后(SJMP $;)。§2.11

匯編語言程序設計方法2、分支結構程序設計分支程序結構就是根據不同情況,采用不同處理方法的一種程序結構。具體實現的方法是,根據指定的條件,使程序轉向不同的程序段。例4-8:編制一程序,實現以下符號函數。設x是一個單字節補碼變量,y也采用單字節補碼表示?!?.11

匯編語言程序設計方法2、分支結構程序設計解:根據題意,程序編制如下:

xDATA30H;定義變量x于內部RAM30H元。

yDATA31H;定義變量y于內部RAM31H單元。

START:MOVA,x;取變量x于累加器A。

JNZNEXT1;若x不等于零,轉入NEXT1執行。

MOVy,#00H;若x等于零,則y=0。

SJMPSTOP;轉入程序結束處。

NEXT1:JB ACC.7, NEXT2;若x小于零,轉入NEXT2執行。

MOVy,#01H;若x大于零,則y=1。

SJMPSTOP;轉入程序結束處。

NEXT2:MOVy,#0FFH;因x小于零,故y=-1。

STOP:SJMP$;程序在此打住。

END;源程序結束。§2.11

匯編語言程序設計方法3、循環程序的設計

循環結構程序是指某程序段被反復執行若干次的程序,其特點是程序代碼被反復利用,從而縮短了程序代碼,減少了占用程序存儲器的資源。

循環結構程序一般由以下幾部分組成:1)初始化部分初始化是為循環執行作準備工作,包括設立指針、設置計數器、設置變量的初值、累加器清零、設置標志位等。2)工作部分工作部分是循環程序的主體,是完成某任務的程序段。3)修改部分修改一些繼續循環需要的參數,比如修改地址指針、循環次數計數值等?!?.11

匯編語言程序設計方法3、循環程序的設計4)控制部分控制部分用于檢測循環條件,決定循環是否繼續下去。5)結束處理部分結束處理部分是用于對循環結果進行適當處理,比如存放結果,恢復某寄存器的內容等。有的循環結構程序沒有這一部分。§2.11

匯編語言程序設計方法3、循環程序的設計

例4-10:編制一段程序,找出數據塊中最小的數據并存放在暫存器B。設數據塊位于外部數據存儲器3000H為首地址的內存中,數據是單字節無符號數據,共有200個數據。解:根據題意,畫出程序流程圖(圖4-3)。

§2.11

匯編語言程序設計方法3、循環程序的設計(1)START: MOV DPTR, #3000H;設置外部數據區指針。(2) MOV R6,#199;設置比較次數。(3) MOVX A,@DPTR;取第一個數至A。(4) MOV B,A;將第一個數送至B。(5) INCDPTR;調整指針至下一個數據。(6) LOOP: MOVX A,@DPTR;取下一個數據至A。(7) CJNE A,B,COMP;比較兩數。(8) COMP: JNCNEXT;若(A)≥(B);轉入NEXT處執行。(9) MOV B,A;若(A)<(B),(A)→B。(10) NEXT: INCDPTR;地址指針加1。(11) DJNZ R6,LOOP;若數據塊比較沒完;程序循環至LOOP。(12) SJMP $;若數據塊比較完畢,;程序原處暫停。(13) END;程序結束?!?.11

匯編語言程序設計方法3、循環程序的設計例5.1計算n個單字節數據和(結果為二個字節)解:根據題意需要運算的數是單字節無符號整數,運算的結果是雙字節形式,畫出數據在存儲器的存放形式的示意圖

設立一個累加單元(雙字節),一個取數指針單元,一個取數計數單元,然后逐個取數相加,一直到數據加完為止。畫程序框圖

將R3R4作為累加單元,R2作為計數器,R0作為數據區指針編制程序

§2.11

匯編語言程序設計方法否是開始設立一個累加單元設立一個計數器設立一個指針取數據相加修改指針結束求和結束?§2.11

匯編語言程序設計方法

例5.1ORG 8100H START: MOV R3, #0 MOV R4, #0 MOV R0, #50HMOVR2, #10 LOOP: MOV A, R4 ADD A, @R0 MOV R4, A CLR A ADDC A, R3 MOV R3, A INC R0 DJNZ R2, LOOP STOP: SJMP STOP END§2.11

匯編語言程序設計方法3、循環程序的設計例5.2 將內部RAM中30H~32H的內容左移4位,移出部分送R2。解:根據題意,程序要完成的內容如圖所示利用交換指令,進行4位二進制數的搬移制定程序框圖:圖-3編制程序

R230H31H032H§2.11

匯編語言程序設計方法§2.11

匯編語言程序設計方法RL43: MOV R0, #32H CLR ALOOP: XCHD A, @R0 SWAP A XCH A, @R0 DEC R0 CJNE R0, #2FH, LOOP ;指針值作為循環終止的條件

SWAP A MOV R2, A RET§2.11

匯編語言程序設計方法4、多重循環程序的設計例5.3 50ms延時子程序設計設系統的時鐘頻率為12MHZ,則一個機器周期的時間為T=12/12MHZ=1μs,延時程序的算法是通過循環執行DJNZ指令來達到延時的目的,由于延時的時間比較長,所以采用雙重循環的程序結構。程序如下:

DEL: MOV R7, #200DEL1: MOV R6, #125DEL2: DJNZ R6, DEL2 DJNZ R7, DEL1 RET

指令DEL2: DJNZ R6, DEL2執行一次所需時間為2T,即2μs。以上程序該指令共執行了125×200=25000次,共需時間為25000×2μs=50ms

§2.11

匯編語言程序設計方法

4、多重循環程序的設計

例5.4

比較精確的50ms子程序的設計例5.3的程序的延時時間是不太精確的,實際所化的時間為(125×2+1+2)×200+2=50.302ms。如果需要更精確的延時,可將以上的程序修改如下:DEL: MOV R7, #200DEL1: MOV R6, #123 NOPDEL2: DJNZ R6, DEL2 DJNZ R7, DEL1 RET總的延時時間為(123×2+1+1+2)×200+2+1=50.003ms?!?.11

匯編語言程序設計方法4、多重循環程序的設計例5.5

試編制一個產生方波的程序段解:設單片機的工作頻率為12MHZ,在P1.1線輸出一個頻率為0.2KHZ的方波。 因為方波的頻率為0.2KHZ,則它的周期為5ms,波形的示意圖如下:

CLRP1.1DL:MOV 30H,#05HDL0:MOV 31H,#0FAHDL1:DJNZ 31H,DL1;指令執行需要2個機器周期,一個機器周期需

DJNZ 30H,DL0;時1μs,即該指令執行需時2μs,這一指令

CPLP1.1;執行1250次,就能耗時2.5ms。每隔2.5ms

SJMPDL;變一次P1.1的狀態,就可使P1.1產生5ms周期的方波。

§2.11

匯編語言程序設計方法4、多重循環程序的設計例5.6

例5.2程序的另一種實現方法。將內部RAM中30H~32H的內容左移4位,移出部分送R2。解:采用雙重循環方法,第一循環是將存儲器有關內容左移一位,第二循環是將第一循環的內容進行四次。程序框圖如下:圖6-4編制程序R230H31H032HC§2.11

匯編語言程序設計方法ABABC§2.11

匯編語言程序設計方法RLC43: MOV R7, #4 MOV R2, #0LOOP0: MOV R0, #32H MOV R6, #3 CLR CLOOP1: MOV A, @R0 RLC A MOV @R0, A DEC R0 DJNZ R6, LOOP1 MOV A, R2 RLC A MOV R2, A DJNZ R7, LOOP0 RET§2.11

匯編語言程序設計方法四.子程序設計和參數傳遞方法

1.子程序的基本結構保護現場:保護子程序將要用到的有關寄存器的內容,使得子程序調用更方便安全。一般可將需要保護的內容壓入堆棧,或采用改變工作寄存器區。程序主體:是子程序為完成有關功能而編制的程序段?;謴同F場:若保護現場是用壓入堆棧,則恢復現場要注意先進后出。返回:采用返回指令將程序返回到原先調用子程序的地方。

開始保護現場程序主體恢復現場返回§2.11

匯編語言程序設計方法三.子程序設計和參數傳遞方法

2.子程序的參數

入口參數:子程序入口地址,被處理數據存放的位置,影響哪些寄存器。

出口參數:有關結果數據的存放位置,有關指針的內容。

3.用工作寄存器或累加器來傳遞參數例5.7 將十六進制數的ASCII碼轉換成十六進制數。

1)根據ASCII碼與16進制數之間的關系,程序框圖如下:圖6-62)被轉換的數據在R0中。

3)編制程序

0~930H~39H;A~F41H~46H

§2.11

匯編語言程序設計方法ASCH:PUSHPSWPUSHACCCLR CMOVA,R0 SUBBA,#30H CJNE A,#10,$+3 JC AH10 SUBBA,#07AH10:MOVR0,APOPACCPOPPSWRET§2.11

匯編語言程序設計方法三.子程序設計和參數傳遞方法

4.用存儲器來傳遞參數

例5.8

將(R0)和(R1)指出的內部RAM中兩個3字節無符號數相加,結果送(R0)指出的內部RAM中。

:R0—>R1—>入口參數:(R0)和(R1)分別指向加數和被加數的低位字節的內存地址。出口參數:(R0)指向結果的高位字節的內存地址?!?.11

匯編語言程序設計方法編制程序如下:NADD:PUSHACCPUSHPSW MOV R7, #3 CLR CNADD1:MOV A, @R0 ADDCA, @R1 MOV @R0, A DEC R0 DEC R1 DJNZR7, NADD1 INCR0POPPSWPOPACC RET§2.11

匯編語言程序設計方法三.子程序設計和參數傳遞方法

5.用堆棧來傳遞參數

例5.9

將一位十六進制數轉換成ASCII碼入口參數:調用該子程序前,已將一位16進制數壓入堆棧。出口參數:將轉換好了的ASCII碼存放在原來16進制數的堆棧位置。HASC: MOV R0, SP DEC R0 DEC R0 XCH A, @R0 ANL A, #0FH ADD A, #2 MOVC A, @A+PC XCH A, @R0 RET DB ‘0123456789’ DB ‘ABCDEF’

7

PCL

PCH(SP)(SP+1)(SP+1)§2.11

匯編語言程序設計方法三.子程序設計和參數傳遞方法

5.用堆棧來傳遞參數

例5.10

把內部RAM中50H,51H的雙字節十六進制數轉換成4位ASCII碼,存放于(R1)指向的4個內部RAM單元。數據存放的方法如下圖所示:

50H51H(R1)§2.11

匯編語言程序設計方法編制程序如下:利用例9的程序來完成本程序的編制HA24: MOV A,50HSWAP A SWAP APUSH ACC PUSH ACCACALLHASC ACALL HASCPOP ACC POP ACCMOV @R1, A MOV @R1, AINC R1 INC R1 MOVA, 51H MOV A, 50H PUSHACC PUSH ACC ACALLHASC ACALL HASC POP ACC POP ACCMOV @R1,A MOV @R1, ARET INC R1 MOV A, 51H

§2.11

匯編語言程序設計方法

例5.11

一個字節的2位十六進制數轉換為二個ASCII碼子程序。在調用該子程序前剛剛將需轉換的一個字節的2位十六進制數壓入了堆棧,在退出該子程序后,轉換好的相應ASCII碼放在堆棧的頂部。解:設進入該子程序時,堆棧頂的地址為ADDR,則根據題意進入該子程序時和退出該子程序時的堆棧情況如下所示。

堆棧斷點地址高斷點地址低

h1h0堆棧ASCII-1ASCII-0AddAdd-1Add-2AddAdd-1Add-2(SP)(SP)轉換成的相應ASCII碼轉換前轉換后§2.11

匯編語言程序設計方法子程序如下:HTA2: MOV R0, SPXCH A, @R0 DEC R0INC R0 DEC R0XCH A, @R0 PUSH ACC

溫馨提示

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

評論

0/150

提交評論