单片机汇-编语言程序设计.ppt
- 文档编号:18788389
- 上传时间:2023-11-14
- 格式:PPT
- 页数:65
- 大小:1.55MB
单片机汇-编语言程序设计.ppt
《单片机汇-编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《单片机汇-编语言程序设计.ppt(65页珍藏版)》请在冰点文库上搜索。
2023/11/14,1,第4章汇编语言程序设计,4-1汇编程序约定,4-2汇编程序设计步骤,4-3顺序程序,4-4分支程序,4-5循环程序,4-6算术运算程序,2023/11/14,2,4-1汇编程序约定,汇编语言程序:
用汇编语言编写的、完成特定功能的指令序列。
汇编程序:
能将汇编语言源程序转换成机器语言目标程序的系统软件。
汇编语言程序到机器语言程序的转换过程称为汇编。
1、手工汇编:
人工查指令表汇编。
用于设计短小程序或调试程序的场合。
2、机器汇编:
用汇编程序进行汇编。
2023/11/14,3,源程序使用机器汇编要考虑汇编程序的约定:
1)按指令格式和语法规则编写程序。
常数的表示:
十进制数:
20十六进制数:
87H,0F0H二进制数:
01011001B字符:
H字符串:
“Hello”。
2)使用伪指令提供汇编信息。
2023/11/14,4,汇编的主要任务:
1)确定程序中每条汇编语言指令的指令机器码。
2)确定每条指令在存储器中的存放地址。
3)提供错误信息。
4)提供目标执行文件(*.OBJ/*.HEX)和列表文件(*.LST)。
汇编语言的语句格式语句行由四个字段组成:
标号:
操作码操作数;注释括号内的部分可以根据实际情况取舍。
每个字段之间要用分隔符分隔,可以用作分隔符的符号有空格、冒号、逗号、分号等。
如:
LOOP:
MOVA,#7FH;A7FH,2023/11/14,5,一、标号标号是语句地址的标志符号,用于引导对该语句的非顺序访问。
有关标号的规定为:
标号由18个ASCII字符组成。
第一个字符必须是字母,其余字符可以是字母、数字或其他特定字符;不能使用该汇编语言已经定义了的符号作为标号。
如指令助记符、寄存器符号名称等;标号后边必须跟冒号。
二、操作码操作码用于规定语句执行的操作。
它是汇编语句中唯一不能空缺的部分。
它由指令助记符表示。
2023/11/14,6,三、操作数操作数用于给指令的操作提供数据或地址。
在一条汇编语句中操作数可能是空缺的,也可能包括一项,还可能包括两项或三项。
各操作数间以逗号分隔。
操作数字段的内容可能包括以下几种情况:
(1)工作寄存器名;
(2)特殊功能寄存器名;(3)标号名;(4)常数;(5)符号“$”,表示程序计数器PC的当前值;(6)表达式。
2023/11/14,7,四、注释注释不属于汇编语句的功能部分,它只是对语句的说明。
注释字段可以增加程序的可读性,有助于编程人员的阅读和维护。
注释字段必须以分号“;”开头,长度不限,当一行书写不下时,可以换行接着书写,但换行时应注意在开头使用分号“;”。
汇编语言指令类型:
1.机器指令:
指令系统中的全部指令,每条指令有对应的机器代码。
2.伪指令:
汇编控制指令,仅提供汇编信息,没有指令代码。
2023/11/14,8,3.宏指令:
宏汇编功能:
将需要多次反复执行的程序段定义成一个宏指令名(宏定义),编程时,可在程序中使用宏指令名来替代一段程序(宏调用)。
宏定义过程:
宏指令名MACRO形式参数;定义程序段ENDM宏调用过程:
宏指令名实际参数宏指令名实际参数,2023/11/14,9,二、汇编控制指令(伪指令):
伪指令是放在汇编语言源程序中用于指示汇编程序如何对源程序进行汇编的指令,它不同于指令系统中的指令,指令系统中的指令在汇编程序汇编时能够产生相应的指令代码,而伪指令在汇编程序汇编时不会产生代码,只是对汇编过程进行相应的控制和说明。
伪指令通常在汇编语言源程序中用于定义数据、分配存储空间、控制程序的输入输出等。
MCS-51汇编语言源程序相对于一般的微型计算机汇编语言源程序结构简单,伪指令数目少,常用的伪指令只有几条。
2023/11/14,10,1.ORG起始地址指令:
指明程序和数据块起始地址。
该指令的功能是向汇编程序说明下面紧接的程序段或数据段存放的起始地址。
表达式通常为16进制地址,也可以是已定义的标号地址。
常用伪指令及其功能:
ORG8000HSTART:
MOVA,#30H此时规定该段程序的机器码从地址8000H单元开始存放。
在每一个汇编语言源程序的开始,都要设置一条ORG伪指令来指定该程序在存储器中存放的起始位置。
若省略ORG伪指令,则该程序段从0000H单元开始存放。
在一个源程序中,可以多次使用ORG伪指令规定不同程序段或数据段存放的起始地址,但要求地址值由小到大依序排列,不允许空间重叠。
2023/11/14,11,2DB伪指令格式:
标号:
DB项或项表DB伪指令用于定义字节数据,可以定义一个字节,也可定义多个字节,字义多个字节时,两两之间用逗号间隔,定义的多个字节在存储器中是连续存放的。
定义的字节可以是一般常数,也可以为字符,还可以是字符串,字符和字符串以引号括起来,字符数据在存储器中以ASCII码形式存放。
在定义时前面可以带标号,定义的标号在程序中是起始单元的地址。
【例3-19】ORG3000HTAB1:
DB12H,34HDB5,A,abc汇编后,各个数据在存储单元中的存放情况如下:
2023/11/14,12,3DW伪指令格式:
标号:
DW项或项表这条指令与DB相似,但用于定义字数据。
项或项表指所定义的一个字在存储器中占两个字节。
汇编时,机器自动按低字节在前,高字节在后,即低字节存放在低地址单元,高字节存放在高地址单元。
【例3-20】ORG3000HTAB2:
DW1234H,5678H汇编后,各个数据在存储单元中的存放情况如下:
2023/11/14,13,4DS伪指令格式:
标号:
DS数值表达式该伪指令用在存储器中保留一定数量的字节单元。
保留存贮空间主要为以后存放数据。
保留的字节单元数由表达式的值决定。
【例3-21】ORG2000HTAB1:
DB12H,34HDS4HDB5汇编后,存储单元中的分配情况如下:
2023/11/14,14,5EQU伪指令格式:
符号EQU项该伪指令的功能是将指令中的项的值赋予EQU前面的符号。
项可以是常数、地址标号或表达式。
以后可以通过使用该符号使用相应的项。
【例3-22】TAB1EQU1000HTAB2EQU2000H汇编后TAB1、TAB2分别等于1000H、2000H。
程序后面使用1000H、2000H的地方就可以用符号TAB1、TAB2替换。
用EQU伪指令对某标号赋值后,该符号的值在整个程序中不能再改变。
2023/11/14,15,7END伪指令格式:
END该指令放于程序最后位置,用于指明汇编语言源程序的结束位置,当汇编程序汇编到END伪指令时,汇编结束。
END后面的指令,汇编程序都不予处理。
一个源程序只能有一个END命令,否则就有一部分指令不能被汇编。
6bit伪指令格式:
符号bit位地址bit该伪指令用于给位地址赋予符号,经赋值后可用该符号代替bit后面的位地址。
【例3-23】FLGbitF0AIbitP1.0定义后,在程序中位地址F0、P1.0就可以通过FLG和AI来使用。
2023/11/14,16,4-2汇编语言程序设计步骤,一、确定方案和计算方法;二、了解应用系统的硬件配置、性能指标;三、建立系统数学模型,确定控制算法和操作步骤;四、画程序流程图;表示程序结构和程序功能。
五、编制源程序。
1.合理分配存储器单元和了解I/O接口地址。
2.按功能设计程序,明确各程序之间的相互关系。
3.用注释行说明程序,便于阅读、修改和调试。
2023/11/14,17,常用程序结构:
4-3顺序程序顺序程序是指无分支、无循环结构的程序。
其执行流程是依指令在存储器中的存放顺序进行的。
顺序程序又称简单程序,程序走向只有一条路径。
例:
双字节变补程序(设数据在R4R5中):
MOVA,R5;取低字节CPLAADDA,#01H;低字节变补MOVR5,AMOVA,R4;取高字节CPLAADDCA,#00H;高字节变补MOVR4,A,顺序程序、分支程序、循环程序。
2023/11/14,18,例题(顺序),例4.1三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。
低字节,低字节,中字节,中字节,高字节,高字节,R0,R1,2023/11/14,19,MOVR0,#52HMOVR1,#55HMOVA,R0ADDA,R1MOVR0,ADECR0DECR1MOVA,R0ADDCA,R1MOVR0,ADECR0DECR1MOVA,R0ADDCA,R1MOVR0,ACLRAADDCA,#00HMOVR0,#00HMOVR0,A,;被加数的低字节地址;加数的低字节地址;低字节相加;存低字节相加结果;中间字节带进位相加;存中间字节相加结果;高字节带进位相加;存高字节相加结果;存放进位的单元地址;进位送00H位保存,程序:
MOVC,ACC.0MOV00H,C,MOVR0,#20HMOVR0,A,例:
压缩式BCD码分解成为单字节BCD码。
MOVR0,#40H;设指针MOVA,R0;取一个字节MOVR2,A;暂存ANLA,#0FH;高半字节清0INCR0MOVR0,A;保存数据个位MOVA,R2SWAPA;十位换到低半字节ANLA,#0FHINCR0MOVR0,A;保存数据十位,十个,2023/11/14,21,4-4分支程序,4-4-1单重分支程序一个判断决策框,程序有两条出路。
两种分支结构:
例:
求R2中补码绝对值:
正数不变,负数变补。
MOVA,R2JNBACC.7,NEXT;为正数?
为0跳CPLA;负数变补INCAMOVR2,ANEXT:
SJMPNEXT;结束,由条件转移指令构成程序判断框部分,形成程序分支结构。
P85:
例题(单分支),例4.2假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1和ST2单元中分别存放着两个8位无符号二进制数,要求找出其中的大数并存入ST3单元中。
START:
CLRCMOVDPTR,#ST1MOVXA,DPTRMOVR2,AINCDPTRMOVXA,DPTRSUBBA,R2JNCBIG1XCHA,R2BIG0:
INCDPTRMOVXDPTR,ARETBIG1:
MOVXA,DPTRSJMPBIG0,;进位位清“0”;设置数据指针,指向ST1;取第一个数;第一个数存R2;数据指针加1,指向ST2;取第二个数;两数比较(第二个数第一个数);第二个数大转BIG1(C=0无借位跳);第一个数大整字节交换继续;指向ST3单元;存大数,例:
FRT:
MOVA,40H;取行李重量计价单位GMOVR3,AMOVB,#03H;M=G3MULABMOVR2,A;暂存3GMOVA,R3;取回GCJNEA,#05H,L1;G5?
G5跳L1SJMPWETCL1:
JCWETC;是,转至WETC(C=1即G5跳)SUBBA,#05H;否则M=3G+2(G-5)RLCAADDA,R2SJMPL2WETC:
MOVA,R2L2:
MOV41H,A;存结果MRET,G5?
:
跳WETC:
G5:
跳WETCG5:
顺序执行,行李计价:
当G5,M=G3;当G5,M=G3+(G-5)(5-3)。
2023/11/14,24,例求双字节补码。
设在内部RAM的addr1和addr+1单元存有一个双字节数(高位字节存于高地址单元)。
编写程序将其读出取补后再存入addr2和addr2+1单元。
首先对低字节取补,然后判其结果是否为全“0”。
若是,则高字节取补,否则高字节取反。
START:
MOVR0,#addr1;原码低字节地址送R0MOVR1,#addr2;补码低字节地址送R1MOVA,R0;原码低字节送ACPLA;A内容取补INCAMOVR1,A;存补码低字节INCR0;调整地址,指向下一单元INCR1JZZERO;(A)=0时转ZEROMOVA,R0;原码高字节送ACPLAMOVR1,A;高字节反码存入addr2+1单元SJMPLOOP1ZERO:
MOVA,R0;高字节取补存入addr2+1单元CPLAINCAMOVR1,ALOOP1:
RET,4-4-2多重分支程序,例:
求符号函数Y=SGN(X)+1(当X0)SGN(X)=0(当X=0)-1(当X0),SYMB:
MOVA,40H;取XJZSTOR;X=0跳,Y=XJBACC.7,MINUS;X0(A.7=1跳)MOVA,#01H;X0,Y=+1SJMPSTORMINUS:
MOVA,#0FFH;X0,Y=-1STOR:
MOV41H,A;保存YRET,一、多次使用条件转移指令,形成两个以上判断框。
2023/11/14,26,温控系统结构框图,电热箱采用电热丝加热,由双向可控硅控制加热量的大小;温度传感器检测电热箱内的温度,经放大与A/D转换后进入单片机;单片机将设定的温度值与检测到的电热箱中的实际温度进行比较,并调节运算后,发出控制信号经光电隔离器去驱动双向可控硅以调节加在电热丝的电压,从而控制电热箱的温度。
电热箱单片机温控系统结构框图,2023/11/14,27,例题(多分支),例4.3某温度控制系统,采集的温度值(Ta)放在累加器A中。
此外,在内部RAM54H单元存放控制温度下限值(T54),在55H单元存放控制温度上限值(T55)。
若TaT55,程序转向JW(降温处理子程序);若TaT54,则程序转向SW(升温处理子程序);若T55TaT54,则程序转向FH(返回主程序)。
:
去FH思路:
Ta=T55?
:
TaT55:
去JWTaT55:
Ta=T54?
:
去FH:
TaT54:
去SWTaT54:
去FH算法:
(1)TaT55:
去JW
(2)TaT54:
去SW(3)T55TaT54:
去FH,2023/11/14,28,程序:
CJNEA,55H,LOOP1AJMPFHLOOP1:
JNCJWCJNEA,54H,LOOP2AJMPFHLOOP2:
JCSWFH:
RET,;TaT55:
转向LOOP1;Ta=T55:
返回;若CY=0,表明TaT55,转降温处理程序;TaT54:
转向LOOP2;Ta=T54:
返回;若CY=1,表明TaT54,转升温处理程序;T55TaT54,返回主程序,若TaT55,程序转向JW(降温处理子程序);若TaT54,则程序转向SW(升温处理子程序);若T55TaT54,则程序转向FH(返回主程序)。
二、按分支号转移。
如:
当分支号=0,程序转移到ADDR0处;当分支号=1,程序转移到ADDR1处;。
例4.4有BR0、BR1、BR2和BR3共4个分支程序段,各分支程序段的功能依次是从内部RAM256B范围取数、从外部RAM低256B范围取数、从外部RAM4KB范围取数和从外部RAM64KB范围取数。
并假定R0中存放取数地址低8位地址,R1中存放高8位地址,R3中存放分支序号值。
假定以BRTAB作差值表首地址,BR0_BRTABBR3_BRTAB为差值。
分析:
差值表=分支入口地址该表首址,1、利用查地址表法:
MOVA,R3MOVDPTR,#BRTABMOVCA,A+DPTRJMPA+DPTRBRTAB:
DBBR0_BRTABDBBR1_BRTABDBBR2_BRTABDBBR3_BRTABBR0:
MOVA,R0SJMPBREBR1:
MOVXA,R0SJMPBREBR2:
MOVA,R1ANLA,#0FHANLP2,#0F0HORLP2,AMOVXA,R0SJMPBREBR3:
MOVDPL,R0MOVDPH,R1MOVXA,DPTRBRE:
SJMP,;分支转移值送A(如R3=2);差值表首址(BRTAB=3000H);查表A+DPTR=3002H,(A)=40H;转移(A+DPTR=3040H);差值表(=10H)(=20H)(=40H)(=60H);从内部RAM取数;从外部RAM256B取数;从外部RAM4KB取数;高位地址取低4位;清P2口低4位;发高位地址;从外部RAM64KB取数,程序:
入口地址:
3010H3020H3040H3060H,差值表=分支入口地址该表首址,例题(查转移指令表),4.5假定键盘上有3个操作键,功能说明如下表:
MOVDPTR,#3000HCLRCRLCAJMPA+DPTRAJMPDSAJMPXSAJMPCR,3000H3001H3002H3003H3004H3005H3006H,;3000H为基址;进位位CY清“0”;A带进位位循环左移;转操作键处理程序;转读数据程序;转写数据程序;转插入程序,2、使用转移指令表法。
用分支转移指令AJMP,对AJMP指令应将分支序号乘以2,转移范围为2KB;对LJMP指令应将分支序号乘以3,转移范围为64KB。
2023/11/14,32,设分支号已存入A。
把分支程序入口地址存放在表中。
MTJS:
MOVSP,#30HMOVDPTR,#TAB;取分支入口地址表首地址CLRC;分支号2RLCAMOVR2,AMOVCA,A+DPTR;取分支地址低位PUSHA;入栈保存MOVA,R2INCAMOVCA,A+DPTR;取分支地址高位PUSHA;入栈保存RET;分支地址PC,转移TAB:
DWADDR0;分支程序入口地址表DWADDR1ADDR0:
;程序段0ADDR1:
;程序段1ADDR2:
;程序段2,3、利用堆栈操作法:
如:
DPTR=3000HA=2,4-5循环程序,4-5-1循环程序的构成,各个环节任务:
一、初始化部分:
循环准备工作。
如:
清结果单元、设指针、设循环控制变量初值等。
二、循环体:
循环工作部分:
需多次重复处理的工作。
循环控制部分:
1.修改指针和循环控制变量。
2.检测循环条件:
满足循环条件,继续循环,否则退出循环。
三、结束部分:
处理和保存循环结果。
允许0次循环的循环结构:
在循环工作之前检测循环条件。
包含多次重复执行的程序段,循环结构使程序紧凑。
4-5-2单重循环,简单循环结构:
循环体中不套循环。
循环控制方法:
计数控制;特征标志控制。
2023/11/14,35,例:
求n个单字节数据的累加,设数据串已在43H起始单元,数据串长度在42H单元,累加和不超过2个字节。
SUM:
MOVR0,#42H;设指针MOVA,R0MOVR2,A;循环计数器nCLRA;结果单元清0MOVR3,AADD1:
INCR0;修改指针ADDA,R0;累加JNCNEXT;处理进位(C=0跳)INCR3;有进位,高字节加1NEXT:
DJNZR2,ADD1;循环控制:
数据是否加完?
MOV40H,A;循环结束,保存结果MOV41H,R3RET,R0,2023/11/14,36,一、计数控制:
例:
为一串7位ASCII码数据的D7位加上奇校验,设数据存放在片外RAM的2101H起始单元,数据长度在2100H单元。
MOVDPTR,#2100HMOVXA,DPTRMOVR2,ANEXT:
INCDPTRMOVXA,DPTRORLA,#80HJNBP,PASS;P=0:
1的个数为偶数,跳MOVXDPTR,APASS:
DJNZR2,NEXTDONE:
SJMPDONE,设循环计数器,控制循环次数。
正计数和倒计数两种方式。
2023/11/14,37,二、特征控制:
例:
找正数表最小值。
正数表存在片外RAM中以LIST为起始单元,用-1作为结束标志。
START:
MOVDPTR,#LIST;数表首地址MOVB,#127;预置最小值NEXT:
MOVXA,DPTR;取数INCDPTR;修改指针CJNEA,#-1,NEXT1;是否为数表结尾?
(A-1跳)SJMPDONE;循环结束NEXT1:
CJNEA,B,NEXT2;比较(AB跳)NEXT2:
JNCNEXT;C=0跳MOVB,A;保存较小值SJMPNEXTDONE:
SJMPDONE,习题:
统计一班考试为100分和不及格人数,成绩单在41H起始单元。
设定循环结束标志实现循环控制。
4-5-3多重循环,例:
将内存一串单字节无符号数升序排序步骤:
每次取相邻单元的两个数比较,决定是否需要交换数据位置。
第一次循环,比较N-1次,取到数据表中最大值。
第二次循环,比较N-2次,取到次大值。
第N-1次循环:
比较一次,排序结束。
循环体中套循环结构。
以双重循环使用较多。
SORT:
MOVA,#N-1;N个数据排序MOVR4,A;外循环次数LOOP1:
MOVA,R4MOVR3,A;内循环次数MOVR0,#TAB;设数据指针LOOP2:
MOVA,R0;取二数MOVB,AINCR0MOVA,R0CJNEA,B,L1;比较(AB跳)L1:
JNCUNEX;AB,不交换DECR0;否则交换数据XCHA,R0INCR0MOVR0,AUNEX:
DJNZR3,LOOP2;内循环结束?
DJNZR4,LOOP1;外循环结束?
RET,2023/11/14,40,1、单循环定时程序:
(参看P88)MOVR5,#TIMELOOP:
NOPNOPDJNZR5,LOOP,软件延时程序:
1T1T1T2T,设:
fOSC=6MHz,则T=12/6MHz=2st=(1+4TIME)T=2+8TIME(s),用循环程序将指令重复多次执行,实现软件延时。
试计算延时程序的执行时间。
源程序指令周期(M)指令执行次数,习题:
DELAY:
MOVR6,#1001D1:
MOVR7,#101D2:
NOP1DJNZR7,D22t=6.606msDJNZR6,D12RET2计算延时程序的执行时间(设时钟fOSC=6MHz,T=2s。
DELAY:
MOVR6,#64H(=100)1I1:
MOVR7,#0FFH(=255)1I2:
DJNZR7,I22DJNZR6,I12RET2,延时时间计算:
(设时钟fOSC=12MHz)T=1st=(11+1100+2100255+2100+21)T=51.303ms,11001002551001,2、多重循环定时:
用循环程序将指令重复多次执行,实现较长时间的延时。
2023/11/14,42,4-6算术运算程序4-6-1多字节加减运算程序,多字节加法子程序,Z=X+Y。
(参看P84)ADDS:
CLRCMOVR2,#23HLOOP:
MOVA,R0ADDCA,R1;加一字节MOVR0,A;存和一字节INCR0;修改指针INCR1DJNZR2,LOOP;全部字节加完?
RET,习题1:
编写十进制多字节加法子程序,Z=X+Y。
习题2:
编写多字节减法子程序,Z=X-Y。
思考题:
修改程序使运算结果保存到其他存储单元。
2023/11/14,43,设被乘数的高字节放在R7中,低字节放于R6中;乘数的高字节放于R5中,低字节放于R4中。
乘得的积有4个字节,按由低字节到高字节的次序存于片内RAM中以ADDR为首址的区域中。
由于MCS-51单片机只有一条单字节无符号数乘法指令MUL,而且要求参加运算的两个字节须放于累加器A和B寄存器中,而乘得的结果高字节放于B寄存器中,低字节放于累加器A中。
因而两字节乘法须用四次乘法指令来实现,即R6R4、R7R4、R6R5和R7R5,设R6R4的结果为B1A1,R7R4结果为B2A1,R6R5的结果为B3A3,R7R5的结果为B4A4,乘得的结果须按下面的关系加起来。
4-6-2多字节无符号数乘除运算,2023/11/14,44,即乘积的最低字节C1只由A1这部分得到,乘积的第二字节C2由B1、A2和A3相加得到,乘
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言程序设计