单片机原理及其应用第五章_第1页
单片机原理及其应用第五章_第2页
单片机原理及其应用第五章_第3页
单片机原理及其应用第五章_第4页
单片机原理及其应用第五章_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机原理及其应用第五章第1页,共53页,2023年,2月20日,星期一补充

汇编语言源程序的格式

源程序基本上由主程序、子程序、中断服务子程序组成。编制汇编语言源程序根据MCS-51单片机ROM的出厂内部定义,一般按这样的主框架编制:

;程序变量定义区1 SDA BIT P1.3 ;定义SDA位变量2 IO EQU P0 ;定义I/O等值P0口3 ByteCon DATA 30H ;定义字节变量ByteCon

;程序主体部分4 ORG 0000H ;程序段从0000H单元开始存放5 LJMP MAIN ;跳到主程MAIN6 ORG 0003H ;从0003H开始存放程序段7 LJMP INTERUPT1 ;跳到外部中断0处理子程序第2页,共53页,2023年,2月20日,星期一前言

汇编语言源程序的格式8 ORG 0030H ;从0030H开始存放程序段9 MAIN: ;主程序标号说明10 MOV SP,#30H;设置堆栈指针,可以大于30H11 LCALL INITIATE;调用初始化子程12 FCY: ;控制程序循环标号

LCALL SUB ;调用功能子程序13 LJMP FCY ;跳到FCY构成循环14 ORG xxxx ;以下功能程序的存放地址15 INITIATE:……;初始化子程序标号16 RET ;子程序返回17 SUB: …… ;功能子程序标号18 RET ;子程序返回19INTERUPT1:……;外部中断0功能程序20 RETI ;中断返回21 TABLE: ;表的标号22 DB00H,01H ;表的数据

END

;源程序结束,停止汇编。

第3页,共53页,2023年,2月20日,星期一前言

汇编语言源程序的格式第1~3行:把一些符号或变量定义成通俗的符号。第4、6、8、14行:表示程序存储的开始地址。第5行:使CPU在执行程序时,从0000H跳过各中断源的入口地址,主程序以跳转的目标地址作为起始地址开始编写。第6行:中断服务程序的存储地址。第9、12、15、17、19行:为程序语句标号。第10行:设置堆栈指针一般最小设30H,栈区够用还可以增大。第21、22行:为查表指令的表。第4页,共53页,2023年,2月20日,星期一§5-1汇编语言概述一、汇编语言程序设计的一般步骤分析课题确定算法画流程图编写程序上机调试当接到程序设计的任务后,首先对任务进行详尽的分析,搞清楚已知的数据和想要得到的结果,程序应该完成何种的功能。第5页,共53页,2023年,2月20日,星期一§4-4汇编语言程序设计基础一、汇编语言程序设计的一般步骤分析课题确定算法画流程图编写程序上机调试

根据实际问题的要求和指令系统的特点,确定解决问题的具体步骤。根据任务要求,对不同的计算方法进行比较,选择最适宜的算法。第6页,共53页,2023年,2月20日,星期一§4-4汇编语言程序设计基础一、汇编语言程序设计的一般步骤分析课题确定算法画流程图编写程序上机调试将解决问题的具体步骤用一种约定的几何图形、指向线和必要的文字说明描述出来的图形。第7页,共53页,2023年,2月20日,星期一§4-4汇编语言程序设计基础一、汇编语言程序设计的一般步骤分析课题确定算法画流程图编写程序上机调试

经过上述各步骤后,解决问题的思路已经非常清楚,所以接下来就可以按流程图的顺序对每一个功能框选用合适的指令编写出汇编语言程序。第8页,共53页,2023年,2月20日,星期一§4-4汇编语言程序设计基础一、

汇编语言程序设计的一般步骤分析课题确定算法画流程图编写程序上机调试在应用程序的设计中,几乎没有一个程序只经过一次编写就完全成功的,所以必须经过上机调试。第9页,共53页,2023年,2月20日,星期一二、评价程序质量的标准

(1)程序的执行时间。(2)程序所占用的内存字节数。(3)程序的逻辑性、可读性。(4)程序的兼容性、可扩展性。(5)程序的可靠性。

第10页,共53页,2023年,2月20日,星期一三、汇编程序结构按程序的走向可以将程序分成5种结构:简单程序分支程序循环程序查表程序子程序第11页,共53页,2023年,2月20日,星期一简单程序

简单程序是指一种无分支的顺序执行程序,即CPU从第一条指令开始依次执行每一条指令,直到最后一条指令。这种程序虽然比较简单,但也能完成一定的功能,并且往往也是构成复杂程序的基础。拆字程序拼字程序求和程序第12页,共53页,2023年,2月20日,星期一ORG1000HMOVA,R0ADDA,R2MOVR0,AMOVA,R1ADDCA,R3MOVR1,AMOVA,#0ADDCA,#0MOVR2,ASJMP$END求和程序

例:设2个16位二进制数分别存于R1R0和R3R2中,求二者的和,并将和存于R2R1R0。解:

分析命题确定算法画流程图编写程序上机调试(R0)+(R2)送R0单元;(R1)+(R3)+Cy送R1单元;Cy+0送R2单元开始(R0)+(R2)送R0单元

(R1)+(R3)+Cy送R1单元Cy+0送R2单元结束第13页,共53页,2023年,2月20日,星期一拆字程序

例:将20H单元中存放的一个两位的BCD拆开并转换成ASCII码,然后存入21H和22H单元。解:

分析命题确定算法画流程图编写程序上机调试22H21H20H89H38H39H拆开BCD码,然后分别或#30H即可。ORG1000HMOVR0,#22HMOV@R0,#0MOVA,20HXCHDA,@R0ORL22H,#30HSWAPAORLA,#30HMOV21H,ASJMP$END开始将22H清零将A、22H中低4位交换将22H内容或#30H累加器A中高低4位交换20H单元的内容送AA与#30H相或后送21H结束第14页,共53页,2023年,2月20日,星期一拼字程序

例:将30H和31H单元中存放的2个一字节BCD码组合成一个2位的BCD码存入32H单元,31H单元中的数为低4位。解:

分析命题确定算法画流程图编写程序上机调试32H31H30H04H07H47H将30H单元的高4与低4交换,再与31H单元相或MOVA,30HSWAPAORLA,31HMOV32H,ASJMP$开始将30H单元的内容送A将A中高、低4位交换将A中内容与31H单元内容相或将A中内容存入32H单元结束第15页,共53页,2023年,2月20日,星期一进制转换程序

例:将内部RAM的20H单元中的8位无符号二进制数转换为3位BCD码,并将结果存放在FIRST(百位)和SECOND(十位、个位)两单元中。解:

分析命题确定算法画流程图编写程序上机调试22H21H十位、个位百位先除以100,取出百位;再除以10位,取出十位和个位。FIRSTDATA22H

SECONDDATA21H ORG1000HHBCD:MOVA,20H MOVB,#100 DIVAB MOVFIRST,A MOVA,B MOVB,#10 DIVAB SWAPA ORLA,B MOVSECOND,A SJMP$开始将20H单元的内容送A将A除以100将A中内容存入FIRSTBA,再将A除以10结束将A、B合成后存入SECOND第16页,共53页,2023年,2月20日,星期一分支程序

分支程序就是条件分支程序,即根据不同的条件执行不同的程序段。在编写分支程序时,关键是如何判断分支的条件。在MCS-51中可以直接用来判断分支条件的指令不是很多,只有累加器为零(或不为零)、比较条件转移指令CJNE等,但它还提供位条件转移指令,如JC,JB等。把这些指令结合在一起使用,就可以完成各种各样的条件判断,如正负判断、溢出判断、大小判断等。分段函数符号函数比较大小第17页,共53页,2023年,2月20日,星期一例:两个无符号数分别存于ONE和TWO单元,试比较它们的大小,将较大者存人MAX单元。若两数相等则任存入一个即可。

解:

分析命题确定算法画流程图编写程序上机调试比较大小:简单分支程序MOV A,ONECJNE A,TWO,NEXT1NEXT1: JCNEXT2MOVMAX,ONESJMP$NEXT2:MOV MAX,TWO SJMP$返回开始将ONE单元的内容送A结束A≥TWO将TWO单元内容送MAX单元YN将ONE单元内容送MAX单元第18页,共53页,2023年,2月20日,星期一例:设变量X存放于VAR单元,函数值Y存放在FUNC单元。试按照下式的要求给Y赋值。解:

Y=

分析命题确定算法画流程图编写程序上机调试符号函数VAR DATA 30HFUNC DATA 31HMOV A,VARJZ COMPJNB ACC.7,POSI

MOV A,#0FFHSJMP COMPPOSI:

MOVA,#1COMP:

MOVFUNC,ASJMP$开始将VAR单元的内容送A结束A=0?将0送FUNC单元A>0?将1送FUNC单元将-1送FUNC单元YNYN第19页,共53页,2023年,2月20日,星期一例:设变量X存放于VAR单元,函数值Y存放在FUNC单元。试按照下式的要求给Y赋值。解:

Y=

分析命题确定算法画流程图编写程序上机调试分段函数MOV A,VARCJNE A,#10,NEXT1NEXT1: JCNEXT2MOVR0,#1CJNE A,#21,NEXT3NEXT3: JNCNEXT4

MOVR0,#0SJMPNEXT4NEXT2:

MOV R0,#0FFHNEXT4:

MOVFUNC,R0SJMP$开始将VAR单元的内容送A结束A>20?将0送FUNC单元A<10?将-1送FUNC单元将1送FUNC单元YYNN第20页,共53页,2023年,2月20日,星期一多重分支程序设计——散转法

根据某种输入或运算的结果转向各个处理程序称为散转多分支,即散转程序。(1)利用转移指令表实现转移将转移到不同程序的转移指令列成表格,判断条件后查表,执行表中的转移指令。【例】【功能】某菜单有9项。根据输入数码转去执行相应的子程序。即输入“1”,执行子程序1;输入“2”,执行子程序2;依次类推。第21页,共53页,2023年,2月20日,星期一【分析】用直接转移指令组成一个转移表,然后把菜单号读入累加器(A),转移表首地址放入DPTR中,利用JMP@A+DPTR实现散转。【入口参数】(R3)=存输入键盘码1~9。【出口参数】转移到相应的子程序入口。

ORG 0030HKEY_JMP:MOV DPTR,#PRGTBL;子程序入口首地址送 DPTR MOV A,R3;把键盘输入缓冲区内容送累加器(A) DEC A ;由于输入数码为1~9,因此需减1MOV B,#03H第22页,共53页,2023年,2月20日,星期一MUL AB;由于长跳转指令LJMP占用3B, ;各子程序入口地址相距3BJMP@A+DPTR;根据输入码,执行相应的子程序

ORG 2000H;程序入口地址表PRGTBL: LJMP NO1LJMP NO2 LJMP NO3 LJMP NO4LJMPNO5LJMP NO6 LJMP NO7 LJMP NO8 LJMP NO9 END第23页,共53页,2023年,2月20日,星期一(2)利用转向地址表实现转移这种方法将转移地址列成表格,将表格的内容作为转移的目标地址。【例】【功能】根据R3(0~n)的内容转向对应的程序;处理程序的入口符号地址分别为PR0~PRn(n<256)【分析】将PR0

~PRn入口地址(16位地址)列在表格中,故每一项占两个单元;PRn在表中的偏移量为2n,因此将R3的内容乘“2”即得PRn在表中的偏移地址;从偏移地址2n和2n+1两个单元分别取出PRn的高8位地址和低8位地址送DPTR寄存器,用JMP@A+DPTR指令(A先清零)即转移到PRn入口执行。第24页,共53页,2023年,2月20日,星期一【入口参数】(R3)=0~n

转移。【出口参数】转移到相应的子程序入口。

PR0 EQU 0110H PR1 EQU 0220H PR2 EQU 0330H ······················· ORG 0030H KEY_JMP: MOV DPTR,#TAB MOV A,R3 ADD A,R3 ;(A)←(R3)*2 JNC NADD INC DPH ;(R3*2)>256第25页,共53页,2023年,2月20日,星期一NADD:MOVR3,A MOVC A,@A+DPTRXCH A,R3 ;转移地址高8位

INC AMOVC A,@A+DPTRMOV DPL,A ;转移地址低8位

MOV DPH,R3CLR AJMP @A+DPTRTAB: DWPR0,PR1,PR2,···········PRnPR0: 处理程序0PR1: 处理程序1 · · PRn: 处理程序nEND 第26页,共53页,2023年,2月20日,星期一(3)利用地址偏移量表实现散转这种方法将转移目标地址与表首地址差列表,作为转移目标地址。【例】【功能】有5个按键0,1,2,3,4,根据按下的键转向不同的处理程序,分别为PR0,PR1,PR2,PR3,PR4。【分析】汇编时,利用了伪指令的数学计算功能,标首地址加上处理程序与标首地址差即可转到处理程序。【入口参数】(B)=转向程序号(键盘编码)。【出口参数】转移到相应的子程序入口。第27页,共53页,2023年,2月20日,星期一 ORG 0030H KEY_JMP: MOV A,B MOV DPTR,#TAB MOVC A,@A+DPTR JMP @A+DPTR TAB: DB PR0-TAB DB PR1-TAB DB PR2-TAB DB PR3-TAB DB PR4-TAB PR0: 处理程序0PR1: 处理程序1 PR2: 处理程序2 PR3: 处理程序3 PR4: 处理程序4 END第28页,共53页,2023年,2月20日,星期一循环程序

一、循环程序的应用场合二、循环程序的组成三、循环程序举例字符串长度求最大值数组清0第29页,共53页,2023年,2月20日,星期一循环程序

一、循环程序的应用场合分段函数符号函数比较大小

在程序执行时,往往同样的一组操作要重复许多次。当然可以采用简单程序,重复使用同样的指令来完成,但若使用循环程序,重复执行同一条指令许多次来完成重复操作,就可大大减化程序。例如:要使00H—7FH单元的内容清0。方法1:用128条赋值指令完成。方法2:只用一条赋值指令,并使之执行128次,每次执行时操作数亦作相应的变化以完成规定的操作。方法1:MOV00H,#0MOV01H,#0

………MOV7FH,#0方法2:

MOVR0,#128CLRAUP:MOV@R0,ADJNZR0,UPSJMP$第30页,共53页,2023年,2月20日,星期一循环程序

一、循环程序的应用场合二、循环程序的组成循环程序一般由四部分组成:

置循环初值循环体循环修改部分循环控制部分确定循环开始时的状态,如使得工作单元清0,计数器置初值等。要求重复执行的部分。每循环一次就要需要修改一次初值,以便在一定情况下,能结束循环。根据循环结束条件,判断是否结束循环流程图第31页,共53页,2023年,2月20日,星期一循环程序

图1图2第32页,共53页,2023年,2月20日,星期一例:使00H---7FH单元清0。数组清0分析命题确定算法画流程图编写程序上机调试7FH…00H00H00H00H用MOV@R0,A做循环主体,修改R0的值,可以将0送入00H—7FH单元中。MOVR0,#128CLRAUP:DECR0 MOV@R0,ACJNER0,#00H,UPSJMP$开始给R0赋128、A清0A送@R0R0减1结束R0=00H?YN第33页,共53页,2023年,2月20日,星期一数组清0思考:如下程序能使00H—7FH单元清0吗?为什么?

MOVR0,#0MOVR7,#128CLRAUP:MOV@R0,AINCR0DJNZR7,UPSJMP$第34页,共53页,2023年,2月20日,星期一例:内存中以STRING开始的区域有若干个字符和数字,一般称为一个字符串,最末一个字符为"$",试统计这些字符数字的数目,结果存人NUM单元字符串长度分析命题确定算法画流程图编写程序上机调试NUM DATA2DHSTRINGDATA21H ORG0030HCLR AMOVR0,#STRINGLOOP: CJNE@R0,#24H,NEXTSJMPCOMPNEXT: INC A INC R0SJMP LOOPCOMP:INC AMOV NUM,ASJMP$开始给R0赋21H、A清0A加1,并送2DH单元A加1R0加1结束@R0=24H?YN第35页,共53页,2023年,2月20日,星期一例:从外部RAM中BLOCK单元开始有一个无符号数数据块,其长度存于LEN单元,试求出数据块中最大的数,并存入MAX单元。求最大值分析命题确定算法画流程图编写程序上机调试LENDATA30HMAXDATA31HBLOCKDATA0100H ORG0400HFMAX: MOVDPTR,#BLOCK DECLEN MOVXA,@DPTRLOOP: CLR C MOVB,A INCDPTR MOVXA,@DPTR SUBB A,B JNC NEXT MOV A,B SJMP NEXT1NEXT: ADD A,BNEXT1: DJNZ LEN,LOOP MOV MAX,A SJMP$ END开始给DPTR赋BLOCK,LEN-1,取出第一个数A与下一个RAM内容相减结束Cy=0?YNLEN减1A<-BLEN=0?A送MAX单元NY恢复A第36页,共53页,2023年,2月20日,星期一多重循环程序设计【例1】【功能】设计一个延时10ms的程序。【分析】延时程序的延时主要与所用晶振和延时程序中的循环次数有关。已知AT89C51单片机使用的晶振为12MHz,则可知一个机器周期T为1us。【入口参数】(R0)=毫秒数,(R1)=1ms延时预定值。【出口参数】定时到,退出程序。

ORG 2000H指令机器周期数

1 MOVR0,#0AH;毫秒数→R0 1 2 DL2: MOVR1,#MT;1ms延时值→R1 1 3 DL1: NOP 1 4 NOP 1 5 DJNZR1,DL1;1ms延时循环 2 6 DJNZR0,DL2;10ms延时循环 2第37页,共53页,2023年,2月20日,星期一循环程序设计该延时程序是一个双重循环程序,内循环1ms延时的预定值MT需计算:

(1+1+2)×1T×MT=1000T

MT=250=0FAH用0FAH代替程序中的MT,则该程序执行后,能实现10ms的延时。若考虑第1、2、6行延时参数配置指令的时间因素,则该段延时程序的精确延时时间计算式为:

1×1+(1+2)×1×10+(1+1+2)×1×250×10=10.031ms第38页,共53页,2023年,2月20日,星期一多重循环程序设计【例2】将内存一串单字节无符号数升序排序(冒泡法)。分析命题并确定算法:每次取相邻单元的两个数比较,决定是否需要交换数据位置。第一次循环,比较N-1次,取到数据表中最大值。第二次循环,比较N-2次,取到次大值。

…第N-1次循环:比较一次,排序结束。内循环控制?循环工作循环结束外循环控制?内循环初始化开始外循环初始化第39页,共53页,2023年,2月20日,星期一SORT:MOV A,#N-1 ;N个数据排序

MOV R4,A ;外循环次数LOOP1:MOV A,R4 MOV R3,A ;内循环次数

MOV R0,#TAB ;设数据指针LOOP2:MOV A,@R0 ;取第n个数

MOV B,A ;第n个数放入B INC R0 MOV A,@R0 ;取第n+1个数 CJNEA,B,L1 ;比较L1: JNC UNEX ;A≥B,不交换

DEC R0 ;否则交换数据

XCH A,@R0 INC R0 MOV @R0,AUNEX:DJNZR3,LOOP2 ;内循环结束?

DJNZR4,LOOP1 ;外循环结束?

RETR3←R3—1=0?B←(R0)A←(R0+1)循环结束外循环次数→R4R4←R4—1=0?内循环次数→R3表首TAB→R0开始A≥B?(R0)←→(R0+1)R0←R0+1YN第40页,共53页,2023年,2月20日,星期一5-5查表程序例5-19

一个十六进制数存放在HEX单元的低四位,将其转换成ASCII码并送回HEX单元。

编程:

ORG0100HHEXEQU30HHEXASC:MOV

A,HEXANLA

,#00001111BADDA,#3;变址调整MOVCA,@A+PCMOVHEX,A;2字节RET ;1字节ASCTAB:DB 30H,3lH,32H,33HDB 34H,35H,36H,37HDB 38H,39H,41H,42HDB 43H,44H,45H,46HEND

第41页,共53页,2023年,2月20日,星期一子程序

一、子程序的应用场合二、子程序的优缺点三、编制子程序注意事项四、子程序举例第42页,共53页,2023年,2月20日,星期一2.参数传递入口参数:调用子程序之前,需要传给子程序的参数。出口参数:子程序送回调用程序的结果参数。(1)子程序无须传递参数

如:延时子程序

第43页,共53页,2023年,2月20日,星期一例5-24双字节求补子程序CPLD。解

入口参数:(R7R6)=16位数

出口参数:(R7R6)=求补后的16位数

CPLD:MOVA,R6 CPLA ADDA,#1 MOVR6,A MOVA,R7 CPLA ADDCA,#0 MOVR7,A RET(2)用累加器和工作寄存器传递参数

第44页,共53页,2023年,2月20日,星期一例5-25n字节求补子程序。解

入口参数:(R0)=求补数低字节指针,(R7)=n-1

出口参数:(R0)=求补后的高字节指针

CPLN:MOVA,@R0 CPLA ADDA,#1 MOV @R0,ANEXT:INCR0 MOVA,@R0 CPLA ADDCA,#0 MOV@R0,A DJNZR7,NEXT RET(3)通过操作数地址传递参数

第45页,共53页,2023年,2月20日,星期一例5-26

在HEX单元存放两个十六进制数,将它们分别转换成ASCⅡ码并存入ASC和ASC+1单元。解

由于要进行两次转换,故可调用查表子程序完成。主程序:MAIN:…PUSH HEX ;取被转换数

LCALL HASC ;转入子程序

*PC→POP ASC ;ASCL—ASC MOV A,HEX ;取被转换数

SWAP A ;处理高四位

PUSH ACC LCALL HASC ;转子程序

POP ASC+1 ;ASCH→ASC+1

…(4)通过堆栈传递参数

第46页,共53页,2023年,2月20日,星期一子程序:HASC:DECSP

DECSP;修改SP指向HEXPOP ACC;弹出HEXANL A,#0FH;屏蔽高四位

。ADD A,#5;变址调整MOVC A,@A+PC;查表PUSH ACC;结果入栈

(2字节)

INC SP;

(1字节)

INC SP;修改SP指向断点位置(1字节)RET

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论