资源预览内容
第1页 / 共53页
第2页 / 共53页
第3页 / 共53页
第4页 / 共53页
第5页 / 共53页
第6页 / 共53页
第7页 / 共53页
第8页 / 共53页
第9页 / 共53页
第10页 / 共53页
亲,该文档总共53页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第3章教学程序设计概要支持写入单片机或仿真调试的目标程序有两种文件格式: BINHEX BIN文件是由编译器生成的二进制文件,是程序的机器码, HEXINTERASCII码来存储,可供显示和打印。HEX文件需通过符号转换程序OHS51进行转换 两种语言的操作过程见图3-1。连接/定位器L51汇编语言源程序汇编器A51符号转换程序OHS51绝对地址目标程序.BINC语言程序浮动地址目标程序编译器C51HEX图3-1两种语言源程序转换成目标程序 目前很多公司将编辑器、汇编器、编译器、连接/定位器、符号转换程序做成集成软件包,用户进入该集成环境,编辑好程序后,只需点击相应菜单就可以完成上述的各步,如WAVE、KEIL ,WAVE集成软件的使用见附录。 汇编:将汇编语言源程序转换成机器语言目标程序的过程称为汇编。 汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件称为汇编程序。汇编的方法:汇编的方法有两种1.手工汇编: 人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机使用。2.机器汇编: 用计算机中的汇编程序对用户源程序进行汇编。 用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定。这些由伪指令指定。3)提供错误信息4)提供目标执行文件(*.OBJ/*.HEX)和列表文件(*.LST) 地址 机器码 源程序 ORG 202XH 202XH 78 30 MAIN: MOV R0,#30H 202XH E6 MOV A,R0 汇编的主要任务1)确定程序中每条汇编语言指令的指令机器码2)确定每条指令在存储器中的存放地址1.机器指令:指令系统中的全部指令。每条机器指令都有对应的机器代码,可以被CPU执行。2.伪指令: 汇编控制指令,没有指令代码,只用于汇编过程,为汇编程序提供汇编信息。一. 汇编语言指令类型3.宏指令 宏汇编功能:将需要反复多次执行的程序段定义成一个宏指令名(宏定义)。编程时,可在程序中使用宏指令名来替代被定义的程序段(宏调用)。宏定义过程宏调用过程: 宏指令名 实际参数 宏指令名 实际参数宏指令名 MACRO 形式参数 ;被定义的程序段 ENDM二伪指令 常用伪指令及功能1.起始指令 ORG nn功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以nn为起始地址,连续存放在程序存储器中。 指令地址 机器码源程序 ORG 202XH 202XH 78 30 MAIN: MOV R0,#30H 202XH E6 MOV A,R0 ORG3000H3000H23TAB:DB23H,100,A3001H643002H412.字节定义 标号: DB(字节常数,或字符或表达式)功能:指示在程序存储器中以标号为起始地址的单元里存放的数为字节数据(八位二进制数)。例如 LN:DB 32,C,25H,-1LNLN+3 地址单元依次存放20H , 43H , 25H ,FFH地址数据LN20LN+143LN+225LN+3FF3.字定义 标号:DW (字常数或表达式)作用: 指示在程序存储器中以标号为起始地址的单元里存放的数为字数据(即16位的二进制数),例如:GH :DW 1234H,5678H,08GH1234GH+25678GH+40008 5.等值指令 标号 EQU(数值表达式) 表示EQU两边的量等值,用于为标号或标识符赋值。 例如:X1 EQU 202XH X2 EQU 0FH MAIN:MOV DPTR,#X1 ; DPTR=202XH ADD A,#X2 ; A=A+0FH4.保留字节 标号:DS (数值表达式)作用:指示在程序存储器中保留以标号为起始地址的若干字节单元,其单元个数由数值表达式指定。例如 L1:DS 32 ; 从L1地址开始保留32个存储单元。6. 位定义 标号 BIT 位地址作用: 同EQU指令,不过定义的是位操作地址。例如 。7.汇编结束 END作用: 指示源程序段结束。 END指令放在程序的最后。A51汇编程序还有一些其它的伪指令,列在教材表3-1中,以备查阅。3-2 汇编语言程序设计步骤一.确定方案和计算方法二.了解应用系统的硬件配置、性能指标三.建立系统数学模型,确定控制算法和操作步骤四.合理分配存储器单元和了解I/O接口地址五.编制源程序1.按功能设计程序,明确各程序之间的相互关系2.用流程图表示程序结构和功能3.程序中用注释说明指令在程序中的作用,方便阅读、调试和修改顺序程序设计例3-1 编程将外部数据存储器的000EH和000FH单元的内容相换。常用程序结构 顺序程序、分支程序 循环程序、子程序000EH000FH000EH000FH000EH000FH000EH000FH分析: 外部数据存储器的数据操作只能用MOVX指令,且只能和A之间传送,因此必须用一个中间环节作暂存,设用20H单元。用R0、R1指示两单元的低八位地址,高八位地址由P2指示。编程过程如下: 000EH000FH000EH000FH000EH000FH ORG 0000H MOV P2, #00H ;送地址高八位至P2口 MOV R0, #0EH ;R0= 0EH MOV R1, #0FH ;R1=OFH MOVX A, R0 ;A=(000EH) MOV 20H, A ;(20H)=(000EH) MOVX A, R1 ;A=(000FH) XCH A, 20H ; A=(000EH),(20H)=(000FH) MOVX R1, A MOV A, 20H MOVX R0, A ;交换后的数送各单元 SJMP $ END3-3 顺序程序顺序程序(简单程序),程序走向只有一条路径例3-2:将R4R5双字节符号数求补码程序。 ORG 0000H MOV A,R4 JB ACC.7, CPLL ;判符号位 SJMP $ ;正数的补码原码CPLL: MOV A,R5 ;取低字节 CPL A ADD A,#1 ;低字节变补 MOV R5,A MOV A,R4 ;取高字节 CPL A ADDC A,#0 ;高字节变补 ORL A, #80H ;恢复负号 MOV R4,A SJMP $地址数据TAB0TAB+1 1TAB+2 4TAB+3 9TAB+4 16TAB+5 25例3-5 设变量放在片内RAM的20H单元,其值为00H-05H之间,要求编查表程序,查出变量的平方值, 并放入片内RAM的21H单元。 ORG 0000H MOV DPTR, #TAB MOV A, 20H MOVC A, A+DPTR ;查表 MOV 21H, A SJMP $TAB: DB 0,1,4,9,16,25 END分析 :在程序存储器安排一张平方表,首地址为TAB,以DPTR指向表首址,A存放变量值,利用查表指令MOVC A,A+DPTR,即可求得表中数据用BCD码存放合乎人们的习惯. 如果平方值为两个字节,程序应如何编。DPTRA ORG 0000H MOV A,R2,N ;为正数? CPL A ;负数变补 INC A MOV R2,AN: SJMP $ ;结束3.4 分支程序的设计由条件转移指令构成程序判断框部分,形成分支结构3.4.1 单分支程序一个判断决策框,两种分支结构图。条件满足?N影响条件Y处理1处理2例1 求8位有符号数的绝对值。方法:正数不变,负数变补条件满足?N影响条件Y处理段 例2 用单片机加重力传感器作磅秤,称出重量后算出行李运费价格,其称出的重量以10kg为1个计价单位G , G已存入40H单元。最终运费存放在41H单元。计价方法为50kg以内按3元/G, 50kg以上计价: 总重按3元/G,,超过50kg部分加收2元。 由此列出算式: G3+(G-5)2;当G5M=G3 ;当G5 3G因重复使用,先暂存在R2。流程见左, 程序如下: ORG 0100HFRT: MOV A,40H;取行李重量计价单位GMOV R3,AMOV B,#03H;运费M=G3MUL ABMOV R2,A;暂存3G MOV A,R3 ;取回G CJNE A,#05H,L1;G 5 ?SJMP WETCL1:JC WETC ;小于5,转至WETCSUBB A,#05H;否则 M=3G+2(G-5) RLC AADD A,R2 MOV R2 ,AWETC:MOV 41H,R2 ;存运费 M RET多分支散转程序的设计有一类分支程序,它根据不同的输入条件或不同的运算结果,转向不同的处理程序,称之为散转程序。这类程序通常利用JMP A+DPTR间接转移指令实现转移。有如下两种设计方法: 1. 查转移地址表: 将转移地址列成表格,将表格的内容作转移的目标地址。 2. 查转移指令表: 将转移到不同程序的转移指令列成表格,判断条件后查表,转到表中指令执行,下面用两个例子说明。1. 利用转移地址表实现转移 例3-7 根据R3的内容转向对应的程序,R3的内容为0n,处理程序的入口符号地址分别为PR0PRn (nR1MOVR2,#0;存放结果的高位清零MOVA,R0;BCD码千位数AMOVR3,ALOOP:MOVA,R3MOVB,#10MULABMOVR3,A;R3*10低8位R3MOVA,BXCHA,R2;R3*10高8位暂存R2MOVB,#10MULABADDA,R2;R2*10(R3*10)高8位MOVR2,AINCR0;取下一个BCD数MOVA,R3ADDA,R0MOVR3,AMOVA,R2ADDCA,#0;加低字节来的进位MOVR2,ADJNZR1,LOOPSJMP$END MCS-51单片机有着优异的位逻辑功能,可以方便的实现各种复杂的逻辑运算.这种用软件替代硬件的方法,可以大大简化甚至完全不用硬件,但比硬件要多花运算时间。例3-17 编写一程序,以实现图3-7中的逻辑运算电路.3.6 位操作程序设计 其中和分别是端口线上的信息,TF0和IE1分别是定时器定时溢出标志和外部中请求标志, 25H和26H分别是两个位地址, 运算结果由端口线输出。. 图3-4硬件逻辑运算电路程序如下: ORL C,TF0 MOV F0,C MOV C,IE1 ORL C,/25H ANL C,F0 ANL C,/26H MOV P1.3,C SJMP $例3-18 设累加器A的各位分别记为X0X7,编制程序用软件实现下式: Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7 X2 BIT ACC.2 ORG 0000HMOV C, X0ANL C, X1ANL C, X2MOV 00H,C ;X0X1X2MOV C, X0ANL C, /X1MOV 01H, C ;X0X1ANL C, /X2ORL C, 00HMOV 00H, C MOV C, X2ANL C, 01HANL C, X3 ;X0X1X2X3ORL C, /00HMOV 00H, C MOV C, X7ANL C, /X6ANL C, /X5ANL C, /X4 ; X4 X5 X6 X7ORL C, 00H ; 最终结果 YC SJMP $ 子程序是构成单片机应用程序必不可少的部分,通过ACALL和LCALL两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。 子程序节省占用的存储单元,使程序简短清晰,善于灵活的使用子程序,是程序设计的重要技巧之一。 子程序必须以RET指令结尾. 在调用子程序时,有以下几点应注意:3.7 子程序 当一段程序需多次应用,或为多人应用时,这段程序编为子程序. 1)保护现场。 如果在调用前主程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其他用途,就应先把这些单元或寄存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,应使主、子程序使用不同的寄存器组。 2)设置入口参数和出口参数。 用之前主程序要按子程序的要求设置好地址单元或存储器(称为入口参数),以便子程序从指定的地址单元或存储器获得输入数据; 子程序经运算或处理后的结果存放到指定的地址单元或寄存器
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号