单片机应用技术第4章.ppt
第第4章章 汇编语言程序设计汇编语言程序设计本章要点本章要点o80C51汇编语言语句结构的基本格式o伪指令的功能和应用o汇编的概念o程序设计的步骤和基本方法o顺序程序o分支程序o循环程序o查表程序o散转程序4.1汇编语言程序设计基本概念汇编语言程序设计基本概念4.1.1汇编语言及其语句结构汇编语言及其语句结构标号:操作码标号:操作码 目的操作数,源操作数目的操作数,源操作数;注释;注释4.1.2 伪指令伪指令o用汇编语言编写的程序称为汇编语言源程序。而计算机是不能直接识别源程序的,必须把它翻译成目标程序(机器语言程序),这个翻译过程叫“汇编”。o在汇编时起控制作用,自身并不产生机器码,而仅是为汇编服务的一些指令,称为伪指令。伪指令不属于80C51指令系统。|起始伪指令起始伪指令 ORG(Origin)格式:ORG 16位地址功能:规定ORG下面目标程序的起始地址。ORG 0100HSTART;MOV A,#05H;标号START代表的地址为0100H|结束伪指令结束伪指令 END格式:END功能:汇编语言源程序的结束标志。J在END后面的指令,汇编程序不再处理。一个源程序只能有一个END指令,放在所有指令的最后。|等值伪指令等值伪指令 EQU(Equate)格式:字符名称 EQU 数据或汇编符号功能:将一个数据或特定的汇编符号赋予规定的字符名称。ABC EQU 30H;ABC=30H,#ABC=#30H|数据地址赋值伪指令数据地址赋值伪指令 DATA格式:字符名称 DATA 表达式功能:将数据地址或代码地址赋予规定的字符名称。JDATA与EQU的区别:EQU定义的符号必须先定义后使用,DATA可以先使用后定义。|定义字节伪指令定义字节伪指令DB(Define Byte)格式:DB 8位二进制数表功能:从指定的地址单元开始,定义若干个8位内存单元的数据。数据与数据之间用“,”分割。ORG 4000HTAB:DB 73H,45,”A”,”2”;(4000H)=73H,(4001H)=2DH|定义字伪指令定义字伪指令DW(Define Word)格式:DW 16位二进制数表功能:从指定的地址单元开始,定义若干个16位数据。占用两个字节,高8位先存入,低8位后存入。不足16位者,用0填充。ORG 1000HHTAB:DW 7856H,89H,30;(1000H)=78H,(1001H)=56H|定义位地址伪指令定义位地址伪指令BIT格式:字符名称 BIT 位地址功能:将位地址赋予所规定的字符名称。DEF BIT 30H;把位地址赋给字符DEF,DEF可作为位地址30H使用。4.1.3 汇编汇编 将汇编语言源程序转换为计算机所能识别的机器语言代码程序的过程称为汇编。汇编可分为:手工汇编 计算机汇编4.1.4 程序设计的基本方法程序设计的基本方法编写程序要求:编写程序要求:不仅要完成规定的功能任务,而且还要求:执行速度快、占用内存少、条理清晰、阅读方便、便于移植、巧妙而实用。一般应按以下几个步骤进行:1.分析问题,确定算法或解题思路2.画流程图3.编写源程序4.汇编和调试4.2 程序设计举例程序设计举例4.2.1 顺序程序顺序程序 顺序程序是指按顺序依次执行的程序,也称为简单程序或直线程序。顺序程序结构虽然比较简单,但也能完成一定的功能任务,是构成复杂程序的基础。例4-2 已知已知16位二进制负数存放在位二进制负数存放在R1R0中,试求其补码,并将结中,试求其补码,并将结果存在果存在R3R2中。中。解:二进制负数的求补方法可归结为“求反加1”,符号位不变。利用CPL指令实现求反;加1时,则应低8位先加1,高8位再加上低位的进位。注意这里不能用INC指令,因为INC指令不影响标志位。CONT:MOV A,R0 ;读低8位CPL A ;取反ADD A,#1 ;加1MOV R2,A ;存低8位MOV A,R1 ;读高8位CPL A ;取反ADDC A,#80H;加进位及符号位MOV R3,A ;存高8位RET4.2.1 分支程序分支程序 根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。80C51指令系统中的条件转移指令、比较转移指令和位转移指令,可以实现分支程序。例4-8已知电路如图已知电路如图4-5所示,要求实现:所示,要求实现:S0单独按下,红灯亮,其余灯灭;S1单独按下,绿灯亮,其余灯灭;其余情况,黄灯亮。解:程序如下解:程序如下SGNL:ANL P1,#11100011B SGNL:ANL P1,#11100011B ;红绿黄灯灭红绿黄灯灭 ORL P1,#00000011B ORL P1,#00000011B ;置置P1.0P1.0、P1.1P1.1输入态输入态,P1.5P1.5P1.7P1.7状态不变状态不变SL0:JNB P1.0,SL1SL0:JNB P1.0,SL1 ;P1.0=0,S0;P1.0=0,S0未按下未按下,转判转判S1S1 JNB P1.1,RED JNB P1.1,RED ;P1.0=1,S0;P1.0=1,S0按下按下;且且P1.1=0,S1P1.1=0,S1未按下未按下,转红灯亮转红灯亮YELW:SETB P1.4YELW:SETB P1.4 ;黄灯亮黄灯亮 CLR P1.2CLR P1.2 ;红灯灭红灯灭 CLR P1.3CLR P1.3 ;绿灯灭绿灯灭 SJMP SL0SJMP SL0 ;转循环转循环SL1:JNB P1.1,YELW SL1:JNB P1.1,YELW;P1.0=0,S0;P1.0=0,S0未按下未按下;P1.1=0,S1;P1.1=0,S1未按下未按下,转黄灯亮转黄灯亮GREN:SETB P1.3GREN:SETB P1.3 ;绿灯亮绿灯亮 CLR P1.2CLR P1.2 ;红灯灭红灯灭 CLR P1.4CLR P1.4 ;黄灯灭黄灯灭 SJMP SL0SJMP SL0 ;转循环转循环RED:SETB P1.2RED:SETB P1.2 ;红灯亮红灯亮 CLR P1.3CLR P1.3 ;绿灯灭绿灯灭 CLR P1.4CLR P1.4 ;黄灯灭黄灯灭 SJMP SL0SJMP SL0 ;转循环转循环 4.2.3 循环程序循环程序循环程序一般包括以下几个部分:循环初值;循环体;循环修改;循环控制;以上四部分可以有两种组织形式,其结构如图4-6所示。例4-10 设设XiXi均为单字节数,并按顺序存放在以均为单字节数,并按顺序存放在以50H50H为首地址的内为首地址的内RAMRAM存储单元中,存储单元中,数据长度(个数)数据长度(个数)N N存在存在R2R2中,试编程求和中,试编程求和S=X1+X2+S=X1+X2+XN+XN,并将,并将S S(双(双字节)存放在字节)存放在R3R4R3R4中,(设中,(设S S6553665536)。)。解:程序如下:解:程序如下:SXN:MOV R2,#NSXN:MOV R2,#N ;置数据长度置数据长度(循环次数循环次数)MOV R3,#00H MOV R3,#00H ;和单元和单元(高高8 8位位)清清0 0 MOV R4,#00H MOV R4,#00H ;和单元和单元(低低8 8位位)清清0 0 MOV R0,#50H MOV R0,#50H ;求和数据区首址求和数据区首址LOOP:MOV A,R4LOOP:MOV A,R4 ;读前次低读前次低8 8位和位和 ADD A,R0ADD A,R0 ;低低8 8位累加位累加 MOV R4,AMOV R4,A ;存低存低8 8位和位和 CLR A CLR A ;ADDC A,R3 ADDC A,R3 ;高高8 8位加进位位加进位 MOV R3,A MOV R3,A ;存高存高8 8位和位和 INC R0 INC R0 ;指向下一数据指向下一数据 循环修改循环修改 DJNZ R2,LOOP DJNZ R2,LOOP;判判N N个数据累加完否?个数据累加完否?循环控制循环控制 RET RET ;退出循环退出循环 退出循环退出循环 例4-13编写延时编写延时10ms子程序子程序,fosc=12MHz。解:fosc=12MHz,一个机器周期为1s。DY10ms:MOV R6,#20 ;置外循环次数DLP1:MOV R7,#250;置内循环次数DLP2:DJNZ R7,DLP2;2机周250=500机周 DJNZ R6,DLP1;500机周20=10000机周 RET ;说明:说明:MOV Rn指令为1个机器周期;DJNZ指令为2个机器周期;RET指令为2个机器周期;(2机周250)+1+220+1+21s/机周=10063s10ms例4-15编制一个循环闪烁灯的程序。编制一个循环闪烁灯的程序。设80C51单片机的P1口作为输出口,经驱动电路74LS240(8反相三态缓冲/驱动器)接8只发光二极管,如图4-8所示。当输出位为“1”时,发光二极管点亮,输出位为“0”时为暗。试编程实现:每个灯闪烁点亮10次,再转移到下一个灯闪烁点亮10次,循环不止。解:程序如下:FLASH:MOV A,#01H;置灯亮初值FSH0:MOV R2,#0AH;置闪烁次数FLOP:MOV P1,A ;点亮 LCALL DY1s ;延时1s MOV P1,#00H;熄灭 LCALL DY1s ;延时1s DJNZ R2,FLOP;闪烁10次 RL A ;左移一位 SJMP FSH0 ;循环 RET例4-16 已知已知P1P1口数据每隔口数据每隔10ms10ms刷新一次,试求其刷新一次,试求其1s1s内的平内的平均值均值,平均值存平均值存30H30H。解:本题需求100个数据的平均值,一般有两种方法:一种是全部累加后再平均;另一种是边平均边累加,现给出两种方法的程序。(1)全部累加后再平均AVRG1:MOV R2,#0AVRG1:MOV R2,#0;低低8 8位累加寄存器清位累加寄存器清0 0 MOV R3,#0 MOV R3,#0 ;高高8 8位累加寄存器清位累加寄存器清0 0 MOV R4,#100 MOV R4,#100 ;置平均次数置平均次数ALOP:MOV A,P1ALOP:MOV A,P1;读读P1P1口数据口数据 ADD A,R2ADD A,R2;低低8 8位累加位累加 MOV R2,AMOV R2,A;回存回存 CLR ACLR A;高高8 8位与进位累加位与进位累加 ADDC A,R3ADDC A,R3;MOV R3,A MOV R3,A;回存回存 LCALL DY10msLCALL DY10ms;延时延时10ms10ms DJNZ R4,ALOP DJNZ R4,ALOP;判判100100次累加完否?未完继续次累加完否?未完继续 MOV A,R3MOV A,R3;100;100次累加完次累加完,求平均值求平均值,被除数被除数A A、B B MOV B,R2 MOV B,R2;MOV R0,30H MOV R0,30H ;置商间址置商间址 MOV R6,#0MOV R6,#0;置除数置除数100,100,除数除数R6R5R6R5 MOV R5,#100 MOV R5,#100;LCALL SUM LCALL SUM;(A;(A、B)B)(R6(R6、R5)=R5)=商商 R0,R0,余数余数A A CJNE A,#50,NEXT CJNE A,#50,NEXT;四舍五入四舍五入NEXT:JCNEXT:JC GRET GRET;C=1,;C=1,50,50,舍舍 INCINC 30H 30H;C=0,50,;C=0,50,入入GRET:RETGRET:RET(2)边平均边累加AVRG2:AVRG2:MOV MOV 30H,#030H,#0;商累加寄存器清商累加寄存器清0 0MOVMOV31H,#031H,#0;余数累加寄存器清余数累加寄存器清0 0 MOVMOVR4,#100R4,#100;置平均次数置平均次数ALOP:ALOP:MOVMOVA,P1A,P1;读读P1P1口数据口数据 MOVMOVB,#100B,#100;置除数置除数(平均次数平均次数)DIVDIVABAB;P1;P1口数据除以口数据除以100100ADDADDA,30HA,30H;商累加商累加MOV MOV 30H,A30H,A;回存回存MOV MOV A,BA,B;ADDADDA,31HA,31H;余数累加余数累加MOVMOV31H,A31H,A;回存回存CLRCLRC C;SUBBSUBBA,#100A,#100;JCJCGONGON;余数累加余数累加100,100,余数累加寄存器不变余数累加寄存器不变INCINC30H30H;余数累加余数累加100,100,商累加寄存器商累加寄存器+1+1MOVMOV31H,A31H,A;减去减去100100后差后差余数累加寄存器余数累加寄存器GON:GON:LCALLLCALLDY10msDY10ms;延时延时10ms10msDJNZDJNZR4,ALOPR4,ALOP ;判判100100次累加完否?未完继续次累加完否?未完继续MOVMOVA,31HA,31H;100;100次累加完毕次累加完毕,余数累加四舍五入余数累加四舍五入CJNECJNEA,#50,NEXTA,#50,NEXT;NEXT:NEXT:JCJCGRETGRET;C=1,;C=1,50,50,舍舍INCINC30H30H;C=0,50,;C=0,50,入入GRET:GRET:RETRET4.2.4 查表程序查表程序 在80C51中,数据表格是存放在程序存储器ROM中,而不是在RAM中。编程时,可以通过DB伪指令将表格的内容存入ROM中。用于查表的指令有两条:|MOVC A,A+DPTR|MOVC A,A+PC当用DPTR作基址寄存器时,查表的步骤分三步:基址值(表格首地址)DPTR;变址值(表中要查的项与表格首地址之间的间隔字节数)A;执行MOVC A,A+DPTR。当用PC作基址寄存器时,由于PC本身是一个程序计数器,与指令的存放地址有关,所以查表时其操作有所不同。也可分为三步:变址值(表中要查的项与表格首地址之间的间隔字节数)A;偏移量(查表指令下一条指令的首地址到表格首地址之间的间隔字节数)+AA;执行MOVC A,A+PC指令。说明:表格首地址与PC值间距不能超过256字节,且编程要事先计算好偏移量,比较麻烦。例4-17 在单片机应用系统中,常用在单片机应用系统中,常用LED数码管显示数码,但显示数字数码管显示数码,但显示数字(9)与显示数字编码并不相同,需要将显示数字转换为显示字段与显示数字编码并不相同,需要将显示数字转换为显示字段码,通常是用查表的方法。现要求将码,通常是用查表的方法。现要求将30H中的显示数字转换为显中的显示数字转换为显示字段码并存入示字段码并存入30H。已知共阴字段码表首址为。已知共阴字段码表首址为TABD。解:编程如下:解:编程如下:CHAG:MOV DPTR,#TABDCHAG:MOV DPTR,#TABD;置共阴字段码表首址置共阴字段码表首址 MOV A,30H MOV A,30H ;读显示数字读显示数字 MOVC A,A+DPTR MOVC A,A+DPTR;查表查表,转换为显示字段码转换为显示字段码 MOV 30H,A MOV 30H,A ;存显示字段码存显示字段码 RET RET ;TABD:DB 3FH,06H,5BH,4FH,66HTABD:DB 3FH,06H,5BH,4FH,66H;0;04 4共阴字段码表共阴字段码表 DB 6DH,7DH,07H,7FH,6FHDB 6DH,7DH,07H,7FH,6FH;5;59 9共阴字段码表共阴字段码表例4-19 用查表程序求用查表程序求040之间整数的立方。已知该整数之间整数的立方。已知该整数存在内存在内RAM 30H中,查得立方数存内中,查得立方数存内RAM 30H(高(高8位)位)31H。解:编程如下:解:编程如下:CUBE:CUBE:MOV DPTR,#TAB MOV DPTR,#TAB ;置立方表首址置立方表首址MOV A,30HMOV A,30H ;读数据读数据ADD A,30HADD A,30H ;数据数据2A2AMOV 30H,AMOV 30H,A ;暂存立方表数据序号暂存立方表数据序号 MOVC A,A+DPTR MOVC A,A+DPTR ;读立方数据高读立方数据高8 8位位XCH A,30H XCH A,30H ;存立方数据高存立方数据高8 8位位,立方表数据序号立方表数据序号A AINC AINC A ;指向立方数据低指向立方数据低8 8位位MOVC A,A+DPTR MOVC A,A+DPTR ;读立方数据低读立方数据低8 8位位 MOV 31H,AMOV 31H,A ;存立方数据低存立方数据低8 8位位RET RET ;TAB:DB 0,0,0,1,0,8,0,27,0,64 TAB:DB 0,0,0,1,0,8,0,27,0,64 ;0;04040立方表立方表 DB 0,125,0,216,DB 0,125,0,216,0FAH,00H,0FAH,00H;4.2.5 散转程序散转程序 散转程序是一种并行多分支程序。它根据系统的某种输入或运算结果,分别转向各个处理程序。与分支程序不同的是,散转程序一般采用JMP A+DPTR指令,根据输入或运算结果,确定A或DPTR的内容,直接跳转到相应的分支程序中去。例4-20单片机四则运算系统。单片机四则运算系统。在单片机系统中设置在单片机系统中设置+、四个运算命令四个运算命令键,它们的键号分别为键,它们的键号分别为0 0、1 1、2 2、3 3。当其中一个键。当其中一个键按下时,进行相应的运算。操作数由按下时,进行相应的运算。操作数由P1P1口和口和P3P3口输口输入,运算结果仍由入,运算结果仍由P1P1口和口和P3P3口输出。具体如下:口输出。具体如下:P1P1口输入被加数、被减数、被乘数和被除数,输出运口输入被加数、被减数、被乘数和被除数,输出运算结果的低算结果的低8 8位或商;位或商;P3P3口输入加数、减数、乘数口输入加数、减数、乘数和除数,输出进位(借位)、运算结果的高和除数,输出进位(借位)、运算结果的高8 8位或位或余数。键盘号已存放在余数。键盘号已存放在30H30H中。中。解:程序如下:解:程序如下:PRGM:MOV P1,#0FFH PRGM:MOV P1,#0FFH ;P1;P1口置输入态口置输入态 MOV P3,#0FFH MOV P3,#0FFH ;P3;P3口置输入态口置输入态 MOV DPTR,#TBJ MOV DPTR,#TBJ ;置置“”表首地址表首地址 MOV A,30H MOV A,30H ;读键号读键号 RL A RL A ;键号键号 2A2A ADD A,30H ADD A,30H ;键号键号 3A3A JMP A+DPTR JMP A+DPTR ;散转散转TBJ:LJMP TBJ:LJMP PRGM0PRGM0 ;转转PRGM0(PRGM0(加法加法)LJMP LJMP PRGM1PRGM1 ;转转PRGM1(PRGM1(减法减法)LJMP LJMP PRGM3PRGM3 ;转转PRGM3(PRGM3(除法除法)LJMP LJMP PRGM2PRGM2 ;转转PRGM2(PRGM2(乘法乘法)PRGM0:MOV A,P1 PRGM0:MOV A,P1 ;读加数读加数 ADD A,P3 ADD A,P3 ;P1+P3;P1+P3 MOV P1,A MOV P1,A ;和和P1P1 CLR A CLR A ;ADDC A,#00H ADDC A,#00H ;进位进位A A MOV P3,A MOV P3,A ;进位进位P3P3 RET RET ;PRGM1:MOV A,P1 PRGM1:MOV A,P1 ;读被减数读被减数 CLR C CLR C ;SUBB A,P3 SUBB A,P3 ;P1-P3;P1-P3 MOV P1,A MOV P1,A ;差差P1P1 CLR A CLR A ;RLC A RLC A ;借位借位A A MOV P3,A MOV P3,A ;借位借位P3P3 RET RET ;PRGM2:MOV A,P1 PRGM2:MOV A,P1 ;读被乘数读被乘数 MOV B,P3 MOV B,P3 ;置乘数置乘数 MUL ABMUL AB ;P1;P1P3P3 MOV P1,A MOV P1,A ;积低积低8 8位位P1P1 MOV P3,B MOV P3,B ;积高积高8 8位位P3P3 RET RET;PRGM3:MOV A,P1 PRGM3:MOV A,P1 ;读被除数读被除数 MOV B,P3 MOV B,P3 ;置除数置除数 DIV ABDIV AB ;P1;P1P3P3 MOV P1,A MOV P1,A ;商商P1P1 MOV P3,B MOV P3,B ;余数余数P3P3 RET RET ;说明:由于说明:由于LJMPLJMP为为3 3字节指令,因此键号需先乘字节指令,因此键号需先乘3 3,以便转到正确的位置。,以便转到正确的位置。