单片机汇编语言程序设计.ppt
1,汇编语言程序及其设计,125,2,汇编语言程序设计,通过前面的学习,我们已经了解了单片机内部的结构,MCS-51指令系统的寻址方式、各类指令的格式及功能。下面我们就是要如何利用MCS-51的指令系统,来编写高效、充分利用其特点的程序。,3,4.1 概述,程序设计语言,1.机器语言 在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。缺点:程序不易看懂,不便于记忆,容易出错。,目前,用于程序设计的语言基本上分为三种:,4,2.汇编语言 用助记符表示的指令称为符号语言或汇编语言。汇编语言程序(源程序)需要“汇编”(由专门的汇编程序完成)才能转换成机器语言。得到的机器语言程序称为目标程序。特点:是面向机器的语言,必须对硬件有一定的了解。助记符指令和机器指令一一对应。能直接管理和控制硬件设备(功能部件)。,程序设计语言,5,3.高级语言 高级语言不受具体机器的限制,都是参照一些数学语言而设计的,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。常用的高级语言,如BASIC、FORTRAN、C语言等。特点:通用性强,直观、易懂、易学、可读性好。计算机不能直接识别和执行。(需要进行编译)发展很快。,6,4.1.2 编制程序的步骤,1.任务分析(硬件、软件系统分析)2.确定算法和工作步骤;3.程序总体设计和流程图绘制,关于流程图符号:开始、结束-圆角矩形工作任务-矩形判断分支-菱形程序流向-,开始,结束,7,4.分配内存,确定程序与数据区存放地址;5.编写源程序;6.调试、修改,最终确定程序。,4.1.2 编制程序的步骤,8,4.1.3 方法技巧,模块化设计(按功能分:显示、键盘解读、中断、打印、输入、发送等)2.尽量采用循环及子程序结构(节省内存)3.在使用内存时谨防内存资源冲突,9,4.1.4 汇编语言的规范,汇编语言源程序由以下两种指令构成:汇编语句(指令语句)伪指令(指示性语句)汇编语句的格式:标号:操作码操作数;注释数据表示形式:二进制(B)、十六进制(H)、十进制(D或省略)、ASCII码(以单引号标识),10,控制汇编用的特殊指令,这些指令不属于指令系统,即不会产生机器代码。通过使用伪指令向汇编程序发出指示信息,告诉它如何完成汇编工作。伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。,伪指令,11,常用的伪指令,ORG 定位目的程序的起始地址。格式:ORG 表达式 如:ORG 0000H 注:表达式必须为16位地址值。END 汇编语言程序结束伪指令。注:一定放在程序末尾!,12,EQU 赋值伪指令。格式:字符名称 EQU 数值或汇编符号 例:AAEQU30HK1EQU40HMOV A,AA;(30H)AMOV A,K1;(40H)A,常用的伪指令,13,DB(Define Byte)从指定单元开始定义(存储)若干个字节的数据或ASCII码字符,常用于定义数据常数表。格式:DB 字节常数或ASCII字符例:ORG 1000HDB34H,0DEH,“A”,“B”DB0AH,0BH,20,常用的伪指令,14,常用的伪指令,BIT 位地址符号指令。把位地址赋于规定的字符名称。格式:字符名称BIT位地址例:GPBITP1.1QQBITP3.2,15,4.2 汇编语言程序编辑和汇编,1.编辑(源程序,以.ASM扩展名存盘);2.汇编(手工或机器汇编);如:MOV A,#88H;机器码74 88 MOV 35H,58H;机器码75 35 58又如:地址 目标码 源程序 ORG 1000H 1000H 74 7F MOV A,#7FH 1002H 79 44 MOV R1,#44H END,16,4.3 程序设计基础与举例,4.3.1 顺序结构程序,org 1000hstart:mov dptr,#2000h mov a,20h movc a,a+dptr mov 21h,a sjmp$org 2000htable:db 0,1,4,9,16,25 end,例1:变量存在内部RAM的20H单元中,其取值范围:05,编成,查表法求其平方值,17,开始,表格首地址送DPTR,变量送A(20H)A,查平方表(A+DPTR)A,结束,结果送21H单元:A 21H,18,例2:将20H单元的压缩(Packed)BCD码拆成两个ACSII码存入21H、22H单元。,BCD 0 1 2.9,ASCII 30H 31H 32H.39H,19,方法1,(20H)A,10HB,A/B,A中为高4位BCD码,B中为低4位BCD码,B+30HB,B(21H),A+30HA,A(22H),开始,结束,20,周期数 源程序,ORG 2000HMOV A,20HMOV B,#10HDIV ABORL B,#30HMOV 21H,BORL A,#30HMOV 22H,AEND,124221113,;除以10H;高4位BCD码转换位ASCII码;低4位BCD码转换位ASCII码,21,0(21H),(20H)A,A与(21H)的低4位交换,(21H)+30H(21H),A的高低半字节交换,A+30HA,A(22H),开始,结束,方法2:,22,ORG 2000H MOV R0,#21H MOV R0,#0 MOV A,20H XCHD A,R0 ORL 21H,#30H SWAP A ORL A,#30H MOV 22H,A END,;清21H单元;低4位BCD码送21H单元,;低4位BCD码转换位ASCII码;高4位BCD码转换位ASCII码,111121119,周期数,源程序,23,分支程序,分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转),24,4.3.2 分支程序,分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转),25,例1:设变量x以补码形式存放在片内RAM 30H单元中,变量y与x的关系是:,编程根据x的值求y值并放回原单元。,26,27,ORG 1000HSTART:MOV A,30H JZ NEXT;x=0,转移 ANL A,#80H;保留符号位 JZ ED;x0,转移 MOV A,#05H;x0,不转移 ADD A,30H MOV 30H,A SJMP ED NEXT:MOV 30H,#20H ED:SJMP$,28,START:MOV DPTR,#TAB MOV A,R7 ADD A,R7;R72A MOV R3,A;暂存R3 MOVC A,A+DPTR;取高位地址 XCH A,R3 INC A MOVC A,A+DPTR;取低位地址 MOV DPL,A MOV DPH,R3;转移地址送入DPTR CLR A JMP A+DPTR TAB:DW P0 DW P1 DW PN,例2:根据R7的内容,转至对应的分支程序。设R7的内容为0N,对应的处理程序地址分别为P0P7,29,4.3.3 循环程序,循环程序一般由:初始化部分 循环体部分-处理部分、修改部分、控制部分 结束部分其结构一般有两种:先进入处理部分,再控制循环 至少执行一次循环体 先控制循环,再进入处理部分 循环体是否执行,取决于判断结果。,30,开始,设置循环初值,循环处理,循环修改,结束处理,结束,循环结束?,N,Y,Y,N,31,循环控制的一般方法:循环次数已知 利用循环次数控制 循环次数未知 利用关键字控制,32,例4-3-6:50ms延时子程序。设晶振频率为12MHz,则机器周期为1us。,DEL:MOV R7,#200;1sDEL1:MOV R6,#123;1s NOP;1s DJNZ R6,$;2s DJNZ R7,DEL1;2s RET;2s,延时时间:t=1+200(1+1+2*123)+2+2 50000us=50ms,33,4.3.4 子程序问题,子程序设计时注意事项:1.给子程序赋一个名字。实际为入口地址代号。2.要能正确传递参数:入口条件:子程序中要处理的数据如何给予。出口条件:子程序处理结果如何存放。(寄存器、存储器、堆栈方式)3.保护与恢复现场:保护现场:压栈指令PUSH 恢复现场:弹出指令POP4.子程序可以嵌套,34,例4-3-9:利用查表法求平方和,设a、b、c分别存于内部RAM的DA、DB、DC三个单元中。,MOV A,DA;取a ACALL SQR;调用查表子程序 MOV R1,A;a的平方暂存R1中 MOV A,DB;取b ACALL SQR;调用查表子程序 ADD A,R1;求出平方和暂存阿A中 MOV DC,A;结果存于DC 中 SJMP$SQR:MOV DPTR,#TAB;子程序 MOVC A,A+DPTR RETTAB:DB 0,1,4,9,16,25,36,49,64,81 END,利用累加器或寄存器传递参数,35,4.3.5 码型转换程序的设计,一、十六进制数与ASCCII码之间的转换(对比BCD与ASCCI之间的转换中例2),表4-1 十六进制数与ASCII码之间的关系,36,例4-3-15 将一位十六进制数转换成ASCII码,设十六进制数存放在R0中,转换后的ASCII码放在R2中。,HTASC:MOV A,R0;取十六进制数 PUSH ACC;保护 CLR C;SUBB A,#0AH;判断是否大于十 POP ACC;JC LOOP;小于十,直接加30H ADD A,#07H;大于十,加37H LOOP:ADD A,#30H MOV R2,A RET,37,例4-3-16 利用外部中断计数每十次使LED灯“明”“暗”变化一次。,INTO0:PUSH Acc;现场保护 PUSH PSW INC 38H MOV A,38H CJNE A,#0AH,INTFW CPL P2.5;取反P2.5 口使LED灯变化 MOV 38H,#00H INTFW:POP PSW;恢复现场 POP Acc RETI;中断返回,38,二、键盘矩阵的扫描解读,39,40,41,基于布尔处理的键盘矩阵解读方法之探讨,单片机与嵌入式系统的应用杂志2007年第7期,