1、1,第五章 MCS51汇编语言程序设计,刘建成 ,2,4.1 汇编语言程序设计概述,汇编语言是面向机器硬件的语言,要求程序设计者对MCS-51单片机具有很好的“软、硬结合”的功底。MCS-51单片机的编程语言可以是汇编语言也可以是高级语言(如C语言),高级语言编程快捷,但程序长,占用存储空间大,执行慢;汇编语言产生的目标程序简短,占用存储空间小,执行快,能充分发挥计算机的硬件功能。无论是高级语言还是汇编语言,源程序都要转换成目标程序(机器语言)单片机才能执行。,连接/定位器 L51,汇编语言 源程序,汇编器A51,符号转换程序OHS51,绝对地址目标程序.BIN,C语言程序,浮动地址目标程序,
2、编译器C51,HEX,图 3-1 两种语言源程序转换成目标程序,1伪指令,(1)起始指令 ORG nn 功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以nn为起始地址,连续存放在程序存储器中。 指令地址 机器码 源程序 ORG 2000H 2000H 78 30 MAIN: MOV R0,#30H2002H E6 MOV A,R0,ORG 3000H3000H 23 TAB: DB 23H,100,A 3001H 643002H 41,4.2 伪指令与汇编程序基本格式,(2)字节定义 标号: DB(字节常数,或字符或表达式) 功能:指示在程序存储器中以标号为起始地址的单元里存放
3、的数为字节数据(八位二进制数)。 例如 LN:DB 32,C,25H,-1;LNLN+2 地址单元依次存放20H , 43H , 25H ,FFH,(3)字定义 标号:DW (字常数或表达式) 作用: 指示在程序存储器中以标号为起始地址 的单元里存放的数为字数据(即16位的二进制数),例如: GH :DW 1234H,5678H,08,(5)等值指令 标号 EQU(数值表达式) 表示EQU两边的量等值,用于为标号或标识符赋值。 例如: X1 EQU 2000H X2 EQU 0FH MAIN: MOV DPTR,#X1 ; DPTR=2000H ADD A,#X2 ; A=A+0FH,(4)保
4、留字节 标号:DS (数值表达式) 作用: 指示在程序存储器中保留以标号为起始地 址的若干字节单元,其单元个数由数值表达式指定。 例如 L1:DS 32 ; 从L1地址开始保留32个存储单元。,(6)位定义 标号 BIT 位地址 作用: 同EQU指令,不过定义的是位操作地址。 例如 AIC BIT P1.1,(7)汇编结束 END 作用: 指示源程序段结束。END指令放在程序的最后。 A51汇编程序还有一些其它的伪指令。,8,2、汇编程序基本格式 (1)汇编语言的语句格式: ; (2)汇编程序的一般格式ORG XXXXH汇编语句1汇编语句NEND,返回本节,9,第四章 MCS51汇编语言程序设
5、计,本章介绍以下内容 汇编语言程序设计概述 汇编语言伪指令 源程序的编辑和汇编 汇编语言程序基本结构形式 程序设计举例,10,汇编语言程序基本结构形式,按结构化程序设计思想,任何复杂程序都可由顺序结构、分支结构、循环结构等构成,11,顺序结构,不同的操作顺序执行,没有分支、循环、子程序调用。 多字节无符号数相加 整个系统流程就是顺序结构,12,顺序程序设计,顺序结构程序是一种最简单、最基本的程序(也称为简单程序),它是一种无分支的直线形程序,按照程序编写的顺序依次执行。【例】 两个8位无符号数相加,和仍为8位。假设两个无符号数X1, X2分别存放于内部RAM60H、61H单元中,求其和并将和送
6、入62H单元。程序如下:,13,由于MCS-51指令系统中只有单字节加法指令,因此对多字节相加时运算,必须从低位字节开始分字节进行。 最低字节可以使用ADD指令 其它字节相加时要把低字节的进位考虑进去因此应使用ADDC指令。,顺序程序设计,14,【例】两个无符号双字节数相加。设被加数存放在内部存储器30H(高位字节)、31H(低位字节)单元,加数存放在内部存储器40H(高位字节)、41H(低位字节)单元,和存入30H(高位字节)、31H(低位字节)单元。,顺序程序设计,15,没有专门循环指令 通过条件判断控制循环 区分 先执行后判断 先判断后执行,循环控制,16,循环程序设计,循环程序一般由4
7、部分组成。(1)置循环初值。(2)循环体。(3)循环修改。 (4)循环控制。 图 (a)结构是“先执行后判断”,适用于循环次数已知的情况。 图 (b)结构是“先判断后执行”,适用于循环次数未知的情况。,17,循环程序设计,18,多字节无符号数相加设被加数与加数分别在以ADR1与ADR2为初址的片内数据存储器区域中,自低字节起,由低到高依次存放;它们的字节数为L,要求加得的和放回被加数的单元。,19,参考程序如下MOV R0,#ADR1 MOV R1,#ADR2MOV R2,#LCLR C LOOP: MOV A,R0;通过R0间址,取得被加数的一;个字节ADDC A,R1 ;通过R1间址,取得
8、加数的一个字;节,与被加数的相应字节相加MOV R0,A ;加得的和通过R0间址放回原被;加数单元INC R0 ;修改指针,指向下一个相加的数INC R1DJNZ R2,LOOP ;循环实现多字节数相加,20,分支程序,程序分支是通过条件转移指令实现的,即根据条件对程序的执行进行判断,满足条件则进行程序转移,不满足条件程序就顺序执行。 在MCS-51指令系统中,通过条件到断实现单分支程序转移的指令有JZ、JNZ、CJNE和DJNZ等。 此外还有以位状态作为条件进行程序分支的指令,如JC、JNC、JB、JNB和JBC等。 使用这些指令,可以完成为0、为1、为正、为负以及相等、不相等等各种条件判断
9、。,21,多分支程序转移,首先把分支程序按序号进行排列,然后按照序号值进行转移。假定分支转移序号最大值为n,则分支转移结构如图,22,但MCS51指令系统中没有多分支转移指令,无法使用一条指令完成多分支转移。要实现多分支转移,可采用以下几种方法。 使用多条CJNE指令,通过逐次比较,实现多分支程序转移。 使用查表方法实现多分支程序转移 查表方法,但把转移指令直接放人表中 使用堆栈操作实现多分支转移,多分支程序转移,23,使用CJNE指令实现多分支转移,分支序号值在A中,则可使用CJNE A,date , rel 指令实现多分支转移 这种多分支方法的优点是层次清晰,程序简单易懂。 但这种方法分支
10、速度较慢,特别是层次较多时。 此外分支入口地址应在8位偏移量的有效范围之内。,24,使用CJNE指令实现多分支转移,多分支转移流程图(与8088之INT21H中断相似),25,使用查表方法实现多分支程序转移,在程序中建立一个差值表,并将各分支入口地址与该表首址的差值按序排列其中。 差值表首址送DPTR,分支序号值送A中,查表后就可通过转移指令JMP A+DPTR进行分支。,26,使用查表方法实现多分支程序转移,例有四个分支程序段,各分支程序段依次是 从内部RAM取数 从外部RAM低256E范围取数 从外部RAM 4KB范围取数 从外部RAM 64KB范围取数 R0中存低8位地址,R1中存放高8
11、位地址,R3中存放分支序号值。brtab为差值表首地址, br0_brtab、 br3_brtab为差值,27,使用查表方法实现多分支程序转移,28,使用查表方法实现多分支程序转移,29,使用查转移指令表方法实现多分支程序转移,假定有多个分支程序,使这些分支程序都通过绝对转移指令AJMP进行转移,并把这些转移指令按序写入表中 把分支序号值乘以2的原因是AJMP指令为2字节指令。 分支实现过程是根据分支序号值(R3),通过JMP指令转向BRTAB表中的某一条AJMP指令,然后再执行该AJMP指令,而把程序转移到指定分支。 因此这种分支方法实际上是通过两次转移而实现,30,使用查转移指令表方法实现
12、多分支程序转移,31,使用查转移指令表方法实现多分支程序转移,使用这种方法最多可实现128个分支程序的转移 由于AJMP指令的转移范围是2KB,可以在2KB范围内安排分支程序因此分支范围较大,便于分支数目较多时应用 如把表中的AJMP改为长转移LJMP楷今,则分支程序可以在64KB范围内转移 长转移LJMP为3字节指令。,32,使用堆栈操作实现多分支转移,把分支程序入口地址存放在转移表中(低8位在前,高8位在后) 先把分支程序人口地址进栈然后利用返回指令RET把分支程序入口地址装入PC,所以接着就转去执行分支程序,33,使用堆栈操作实现多分支转移,34,第四章 MCS51汇编语言程序设计,本章
13、介绍以下内容 汇编语言程序设计概述 汇编语言伪指令 源程序的编辑和汇编 汇编语言程序基本结构形式 程序设计举例,35,4.3 汇编语言程序设计举例,算术运算程序 加减法 乘法 除法 数制转换 ASCII码与16进制相互转换 BCD码与16进制相互转换,36,4.3 汇编语言程序设计举例,定时程序 在单片机的控制应用中,常有定时的需要如定时中断、定时检测和定时扫描等定时功能除可以使用定时器计数器实现之外更多地是使用定时程序完成。 定时程序是典型的循环程序,它是通过执行一个具有固定延迟时间的循环程序来实现延时的。因此也把定时程序称之为延时程序。定时程序只能使用汇编语言编写。,37,4.3 汇编语言
14、程序设计举例,定时程序 短时间 长时间 调整定时时间 一个程序多种定时,38,定时程序,1单循环定时程序MOV R5, #TlMELOOP: NOP ;1机器周期NOP ;1机器周期DJNZ R5, LOOP ;2机器周期 如单片机的晶振颇率为6MHz,则一个机器周期是2uS。因此一次循环的延迟时间为8uS,程序总的延迟时间为8xtime(uS)。本程序的实际延迟时间决定于装入寄存器R5的定时时间常数。R5是8位寄存器,因此这个程序的最长定时时间为256X8=2048(uS)。即定时范围是2048uS(2.048mS)-时间延迟比较小,39,4.3 汇编语言程序设计举例,短时间定时程序12M晶
15、振,50ms延时 Delay: MOV R7,#125 DEL1: MOV R6,#200 DEL2: DJNZ R6,DEL2DJNZ R7,DEL1RET 调用CALL DelayMOV R7,#?CALL Delay,40,定时程序,2.较长时间的定时程序为了加长定时时间,通常采用多重循环的方法。例如下列双重循环的定时程序,最长可延时262658个机器周期,6Mhz晶振时,即525316uS(525mS或0.5S)MOV R5, #TIME1 LOOP2: MOV R4, #TIME2 LOOP1: NOPNOPDJNZ R4,LOOP1DJNZ R5,LOOP2 定时时间微调:时间系数
16、、循环时间长度,41,定时程序,3.以一个基本的延时程序满足不同的定时要求如果一个系统中有多个定时需要,我们就可以设计一个基本的延时程序,使其延迟时间为各定时时间的最大公约数,然后就可以以此基本程序作为子程序,通过调用的方法实现所需要的不同定时。 例如:设计一个1秒延时子程序,可以实现定时时间分别为5秒、10秒和20秒等的定时,42,数字滤波算法,由于工业生产的现场环境非常恶劣,各种干扰源很多,计算机系统通过输入通道采集到的数据信号,虽经硬件电路的滤波处理,但仍会混有随机干扰噪声。因此,为了提高系统性能,达到准确的测量与控制,一般情况下还需要进行数字滤波。 数字滤波:计算机系统对输入信号采样多
17、次,然后用某种计算方法进行数字处理,以削弱或滤除干扰噪声造成的随机误差,从而获得一个真实信号的过程。 根据预定的滤波算法编制相应的程序,实质上是一种程序滤波。因而可靠性高,稳定性好,修改滤波参数也容易,而且一种滤波子程序可以被多个通道所共用,因而成本很低。另外,数字滤波可以对各种干扰信号,甚至极低频率的信号进行滤波。它的不足之处是需要占用CPU的机时。,43,数字滤波算法,常用的方法有以下几种: 平均值法:对一点数据连续采样多次(可取35次),以平均值作为该点的采样结果。这种方法可以减少系统的随机干扰对采集结果的影响。去极值平均 加权平均 比较舍取法:对每个采样点连续采样几次,根据所采样数据的
18、变化规律,确定取舍办法来剔除偏差数据。例如,“采三取二”,即对每个采样点连续采样三次,取两次相同数据作为采样结果。,44, 中值法:对一个采样点连续采集多个信号,并对这些采样值进行比较,取中值作为该点的采样结果。 X1 X2 X3 X4X5 , 取X3中值滤波能有效地滤去由于偶然因素引起的波动(脉冲)或采样器的不稳定造成的误码等引起的脉冲干扰。对缓慢变化的过程变过采用中值滤波有效果。中值滤波不宜用于快速变化的过程参数。,数字滤波算法,45, 一阶递推数字滤波法:利用软件完成RC低通滤波器的算法。 RC滤波器(惯性滤波)的传递函数写成差分方程其中:a数字滤波器时间常数;x(k)第n次采样时的滤波
19、器的输入;Y(k1)第n1次采样时的滤波器的输出。 Yn第n次采样时的滤波器的输出。,数字滤波算法,46,5、防脉冲干扰复合滤波法 将算术平均值法和中值滤波法结合起来,便可得到防脉冲干扰平均值法。 它是先用中值滤波原理滤除由于脉外干扰引起误差的采样值,然后把剩下的采样值进行算术平均。,数字滤波算法,47,6、滑动平均滤波 在每个采样周期只采样一次,将这一次采样值和过去的若干次采样值一起求平均,所得结果即为有效采样值。具体作法可由循环队列结构方式来实现数据的存放 针对:周期性干扰信号选取何种方法必须根据信号的变化规律予以确定。,数字滤波算法,48,查表程序,查表, 就是根据变量x, 在表格中查找
20、y, 使y = f (x)。 在计算机控制应用中,查表程序是很有用的程序,常用于实现LED显示器控制、波形输出、非线性修正、数据补偿、非线性函数转换、计算、代码转换等,49,查表程序,MCS-51指令系统中有专用的查表指令: MOVC A,ADPTR 适用于在整个64K ROM范围内查表,数据表可以放在程序任何位置。 MOVC A,A PC 适用于在“本地”范围内查表编写查表程序,50,查表程序,已知R0低四位有一个十六进制数(0F中一个),试编出能把它转换成相应ASCII码并送入R0的程序。,ORG 0400H 0400 E8 MOV A, R0 ;取转换值到A 0401 540F ANL
21、A, 0FH ;屏蔽高四位 0403 2403 ADD A, 03H ;地址调整 0405 83 MOVC A, A+PC ;查表 0406 F8 MOV R0, A ;存结果 0407 80FE SJMP 0409 ASCTAB:DB 0,1,2,3,4DB 5,6,7,8,9DB A,B,C,D,E,FEND,51,4.3 汇编语言程序设计举例,极值查找程序 最大值、最小值 数据排序程序 冒泡算法 数据检索程序 顺序检索 对分检索,52,数据排序程序,常用气泡法(两两比较法)它先使E100和E99进行比较,若E100E99,则两数交换,否则不动,然后E99和E98进行比较,按同样的原则,决
22、定是否交换,一直比较下去,最后完成E2和E1的比较及交换。 经过N-1次比较后,E1位置必然得到数组中的最大值。犹如一个气泡冒到水顶。 如此下去,经过N!次比较便完成N个数据的排序。,53,例:100个数据(单字节),从小到大进行排序,MOV R2,#100 BUB:MOV R0,#20HCLR F0DEC R2 BL: CJNE R2,#0,BBMOV 7F,R2MOV 20H,R0MOV A,R0INC R0MOV 21H,R0,CJNE A,21H,LOP LOP: JC BMOV R0,20HDEC R0MOV R0,21HINC R0SETB F0 B: DJNZ 7FH,BLJB F0,BUB BB: SJMP $,数据排序程序,54,如果数据是双字节数,一次需要比较两个字节,从小到大进行排序。,数据排序程序,55,数据检索程序,数据检索程序是在数据区中查找关键字的操作有两种数据检索方法,即顺序检索和对分检索。 顺序检索:把关键字与数据区中的数据从前向后逐个比较,判断是否相等 对分检索:按对分原则取数进行关键字比较(前提是数据已排好序),具体过程是:取数组中间位置的数与关键字比较,如果相等则检索成功。如果取数大于关键字,则下次对分检索的范围是从数据区起点到本次取数。如果取数小于关键字,则下次对分检索的范围是从本次取数到数据区终点。,