C51的汇编语言程序设计.ppt

上传人:牧羊曲112 文档编号:5417030 上传时间:2023-07-05 格式:PPT 页数:54 大小:2.10MB
返回 下载 相关 举报
C51的汇编语言程序设计.ppt_第1页
第1页 / 共54页
C51的汇编语言程序设计.ppt_第2页
第2页 / 共54页
C51的汇编语言程序设计.ppt_第3页
第3页 / 共54页
C51的汇编语言程序设计.ppt_第4页
第4页 / 共54页
C51的汇编语言程序设计.ppt_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《C51的汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《C51的汇编语言程序设计.ppt(54页珍藏版)》请在三一办公上搜索。

1、2023/7/5,1,第4章 80C51的汇编语言程序设计,程序编制的方法和技巧,4.1,源程序的编辑和汇编,4.2,基本程序结构,4.3,子程序及其调用,4.4,简单I/O设备的并口直接驱动示例,4.5,2023/7/5,2,单片机应用系统由硬件系统和应用程序构成,汇编语言 高级语言,应用程序设计方法,汇编语言,生成的目标程序占内存空间少、运行速度快,具有效率高、实时性强。,高级语言,对系统的功能描述与实现简单,程序阅读、修改和移植方便,适合于编写复杂的程序。,2023/7/5,3,4.1 程序编制的方法和技巧,4.1.1 程序编制的步骤,明确任务:功能要求、技术指标 运行环境调研,任务分析

2、,将实际问题转化为计算机处理的程序算法 算法比较与优化(内存需求与运行速度),算法设计,2023/7/5,4,流程描述,流程图符号,“超级循环”框架,2023/7/5,5,强化模块观念,使程序占用空间减少、结构清晰循环初值和结束条件,避免“死机”现象子程序的现场保护(注意栈平衡、寄存器内容),程序模块(主程序模块、各种子程序模块)模块化优点:分块设计、便于阅读、调试方便,4.1.2 程序编制的方法和技巧,采用循环和子程序,对中断子程序还有注意保护PSW的内容,2023/7/5,6,4.1.3 汇编语言的语句格式,非数字字符开头,后跟字母、数字、“-”、“?”等不能用已定义的保留字(指令助记符、

3、伪指令等)后跟英文冒号“:”,Keil的汇编器A51可以识别的语句形式为:,标号(即符号地址),标号:指令助记符 操作数1,操作数2,操作数3,;注释,指令助记符,是指令功能的英文缩写。,2023/7/5,7,数据:二进制(B)十进制(D或省略D)十六进制(H),注意AF开头时要加“0”ASCII码,如 A,1245符号:符号名、标号或“$”(PC的当前值)表达式:由运算符和数据构成(见表4.1),操作数,注释,英文分号“;”开头,2023/7/5,8,表4.1,2023/7/5,9,4.2 源程序的编辑和汇编,目标程序的产生过程如下图:,2023/7/5,10,4.2.1 源程序的编辑和汇编

4、,源程序的编辑,ORG 0000H LJMP MAIN ORG 0040HMAIN:MOV R7,#16 MOV R0,#60H MOV A,#55HLOOP:MOV R0,A INC R0 DJNZ R7,LOOP SJMP$END,依据汇编语言规则用好伪指令符号不用中文SJMP$用于调试以.ASM存盘,2023/7/5,11,源程序的汇编,汇编源程序转为目标程序的过程叫汇编汇编通常在Windows下的集成开发环境完成用A51.EXE汇编生成.OBJ、.LIB及.LST,目标程序的连接,.OBJ、.LIB经BL51.EXE生成无扩展名的绝对地址目标文件绝对地址目标文件可以用于仿真器调试调试无

5、误的目标文件用OH51.EXE转换为.HEX文件.HEX文件经编程器写入单片机存储器,2023/7/5,12,4.2.2 伪指令,伪指令,也叫汇编命令。仅对汇编过程进行指示伪指令无对应的单片机可执行代码,起始地址设定伪指令ORG,ORG 表达式,表达式通常为十六进制地址,例:,ORG 8000HSTART:MOV A,#30H,ORG可多次使用,但地址值的顺序要由小到大,结束汇编伪指令END,END,该伪指令位于源程序的最后一行。,2023/7/5,13,定义字节数据表伪指令DB,定义字数据表伪指令DW,1000H,标号:DB 字节数据表,如:ORG 1000HDB-2,-4,-6,8,10,

6、18,1001H,标号:DW 字数据表,ORG 1400HDATA1:DW 324AH,3CH,1400H,1401H,1402H,1403H,大端模式,2023/7/5,14,定义常值为符号名伪指令EQU,符号名 EQU 常值表达式,LEN EQU 10 SUM EQU 21HBLOCK EQU 22H CLR A MOV R7,LEN MOV R0,BLOCK LOOP:ADD A,R0 INC R0 DJNZ R7,LOOP MOV SUM,A,符号名为:地址常数段名字符串寄存器名位名,比较:标号只能是地址,2023/7/5,15,定义位地址为符号名伪指令BIT,符号名 BIT 位地址表

7、达式,如:ST BIT P1.0;将P1.0的位地址赋给符号名STCF BIT 0D7H;将位地址为D7H的位定义为符号名,用BIT定义的“符号名”一经定义便不能重新定义和改变其它一些伪指令参见教材表4.2,2023/7/5,16,4.3 基本程序结构,一般不影响标志寄存器PSW的状态。,传送类指令有两大类 一般传送(MOV)特殊传送,如:MOVC MOVX PUSH、POP XCH、XCHD SWAP,2023/7/5,17,4.3.1 顺序程序,(无分支、无循环),4.3 基本程序结构,【例4-1】片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASC

8、II码。编写程序将该数据转换成压缩BCD码存放在20H单元。,2023/7/5,18,ORG 0040HSTART:MOV A,21H;取十位ASCII码 ANL A,#0FH;保留低半字节 SWAP A;移至高半字节 MOV 20H,A;存于20H单元 MOV A,22H;取个位ASCII码 ANL A,#0FH;保留低半字节 ORL 20H,A;合并到结果单元 SJMP$END,2023/7/5,19,4.3.2 分支程序,(单分支、双分支、多分支),【例4-2】设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是:当x大于0时,y=x;当x=0时,y=20H;当x小于0时

9、,y=x+5。编制程序,根据x的大小求y并送回原单元。,2023/7/5,20,ORG 0040HSTART:MOV A,30H;取x至累加器 JZ NEXT;x=0,转NEXT ANL A,#80H;否,保留符号位 JZ DONE;x 0,转结束 MOV A,#05H;x 0处理 ADD A,30H MOV 30H,A;X+05H送Y SJMP DONE NEXT:MOV 30H,#20H;x=0,20H送Y DONE:SJMP DONE END,2023/7/5,21,【例4-3】根据R7的内容x(转移序号)转向相应的处理程序。设R7内容为04,对应的处理程序入口地址分别为PP0PP4。,

10、2023/7/5,22,START:MOV R7,#3;以转移序号3为例 ACALL JPNUM AJMP START JPNUM:MOV DPTR,#TAB;置分支入口地址表首址 MOV A,R7 ADD A,R7;乘2,调整偏移量 MOV R3,A MOVC A,A+DPTR;取地址高字节,暂存于R3 XCH A,R3 INC A MOVC A,A+DPTR;取地址低字节 MOV DPL,A;处理程序入口地址低8位送DPL MOV DPH,R3;处理程序入口地址高8位送DPH CLR A JMP A+DPTR,2023/7/5,23,TAB:DW PP0 DW PP1 DW PP2 DW

11、PP3 DW PP4 PP0:MOV 30H,#0;转移序号为0时,置功能号“0”于30H单元 RET PP1:MOV 30H,#1;转移序号为1时,置功能号“1”于30H单元 RET PP2:MOV 30H,#2;转移序号为2时,置功能号“2”于30H单元 RET PP3:MOV 30H,#3;转移序号为3时,置功能号“3”于30H单元 RET PP4:MOV 30H,#4;转移序号为4时,置功能号“4”于30H单元 RET,2023/7/5,24,4.3.3 循环程序,(2种:先执行,后判断;先判断,后执行),【例4-4】将内部RAM的30H至3FH单元初始化为00H。,MAIN:MOV

12、R0,#30H;置初值 MOV A,#00H;MOV R7,#16;LOOP:MOV R0,A;循环处理 INC R0;DJNZ R7,LOOP;循环修改,判结束 SJMP$;结束处理,2023/7/5,25,【例4-5】将内部RAM起始地址为60H的数据串传送到外部RAM中起始地址为1000H的存储区域,直到发现$字符停止传送。,MAIN:MOV R0,#60H;置初值 MOV DPTR,#1000HLOOP0:MOV A,R0;取数据 CJNE A,#24H,LOOP1;循环结束?SJMP DONE;是LOOP1:MOVX DPTR,A;循环处理 INC R0;循环修改 INC DPTR

13、SJMP LOOP0;继续循环 DONE:SJMP DONE;结束处理,2023/7/5,26,4.4 子程序及其调用,完成通用功能、反复使用的程序设计成子程序。使应用程序结构清晰紧凑,便于阅读和调试,执行要由其它程序来调用,执行完后要返回到调用程序,结构上仍然采用一般程序的3种结构,调用时注意:一是现场的保护和恢复;二是主程序与子程序间的参数传递。,2023/7/5,27,4.4.1 现场保护与恢复,在主程序中实现(结构灵活),PUSH PSW;保护现场(含当前工作寄存器组号)PUSH ACC;PUSH B;MOV PSW,#10H;切换当前工作寄存器组LCALL addr16;子程序调用,

14、POP B;恢复现场POP ACC;POP PSW;含当前工作寄存器组切换,2023/7/5,28,在子程序中实现(程序规范、清晰),SUB1:PUSH PSW;保护现场(含当前工作寄存器组号)PUSH ACC;PUSH B;MOV PSW,#10H;切换当前工作寄存器组 POP B;恢复现场 POP ACC;POP PSW;内含当前工作寄存器组切换 RET,2023/7/5,29,4.4.2 参数传递,利用累加器或寄存器(简单、快速,但参数个数不多),【例4-6】实现两个8位的十六进制无符号数求和的子程序。,SADD:MOV A,R3;取加数(在R3中)CLR C ADD A,R4;被加数(

15、在R4中)加A JC PP1 MOV R3,#00H;结果小于255时,高字节R3内容为00H SJMP PP2 PP1:MOV R3,#01H;结果大于255时,高字节R3内容为01H PP2:MOV R4,A;结果的低字节在R4中 RET,入口:(R3)=加数;(R4)=被加数,出口:(R3)=和的高字节;(R4)=和的低字节。,2023/7/5,30,利用存储器(个数多,用R0或R1及DPTR为参数表指针),【例4-7】将内部RAM 中两个4字节无符号整数相加,和的高字节由R0指向。数据采用大端模式存储。,入口:(R0)=加数低字节地址;(R1)=被加数低字节地址。,出口:(R0)=和的

16、高字节起始地址。,NADD:MOV R7,#4;字节数4送计数器 CLR C;NADD1:MOV A,R0;利用指针,取加数低字节 ADDC A,R1;利用指针,被加数低字节加A MOV R0,A;DEC R0 DEC R1 DJNZ R7,NADD1 INC R0;调整指针,指向出口 RET,2023/7/5,31,利用堆栈,【例4-8】将内部RAM中20H单元中的1个字节十六进制数转换为2位ASCII码,存放在R0指示的两个单元中。,入口:预转换数据(低半字节)在栈顶,出口:转换结果(ASCII码)在栈顶,HEASC:MOV R1,SP;借用R1为堆栈指针 DEC R1 DEC R1;R1

17、指向被转换数据 XCH A,R1;取被转换数据 ANL A,#0FH;取一位十六进制数 ADD A,#2;偏移调整,所加值为MOVC与DB间总字节数 MOVC A,A+PC;查表 XCH A,R1;1字节指令,存结果于堆栈中 RET;1字节指令ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H,2023/7/5,32,验证程序段,MAIN:MOV A,20H;SWAP A PUSH ACC;预转换的数据(在低半字节)入栈 ACALL HEASC POP ACC;弹出栈顶结果于ACC中 MOV

18、R0,A;存转换结果高字节 INC R0;修改指针 PUSH 20H;预转换的数据(在低半字节)入栈 ACALL HEASC POP ACC;弹出栈顶结果于ACC中 MOV R0,A;存转换结果低字节 SJMP$,2023/7/5,33,4.4.3 常用子程序示例,算数运算子程序查表子程序数制与码的转换子程序延时子程序,2023/7/5,34,减法子程序,编写多字节无符号数的减法子程序设2个多字节无符号数的低字节地址分别存于R0R1中,低字节在高地址单元。相减后的差存放在减数原来的位置子程序入口:(R0)=被减数低字节地址(R1)=减数低字节地址(R7)=字节数子程序出口:(R1)=差的高字节

19、地址(起始地址),2023/7/5,35,NSUB:CLR CNSUB1:MOV A,R0 SUBB A,R1 MOV R1,A DEC R0 DEC R1 DJNZ R7,NSUB1 INC R1 RET,2023/7/5,36,乘法子程序,编写双字节无符号数的乘法子程序设双字节的无符号被乘数存放在R2、R3中,乘数存放在R4、R5中,R0指向积的高字节子程序入口:(R2、R3)=被乘数(R4、R5)=乘数(R0)=预存放积的低字节的单元地址子程序出口:(R0)=积的高字节的单元地址,2023/7/5,37,R2,R3,R4,R5,R3R5L,R3R5H,R3R4L,R3R4H,R2R5H,

20、R2R4H,R2R4L,R2R5L,2023/7/5,38,MOV A,R2MOV B,R5MUL ABINC R0INC R0ACALL RADD MOV A,R2MOV B,R4MUL ABINC R0ACALL RADDINC R0RET,MOV A,R3MOV B,R5MUL ABACALL RADDMOV A,R3MOV B,R4MUL ABINC R0ACALL RADD,ADD A,R0MOV R0,AMOV A,BDEC R0ADDC A,R0MOV R0,ADEC R0MOV A,R0ADDC A,#00HMOV R0,ARET,RADD:,部分积累加子程序:,2023/7/

21、5,39,查表子程序,利用子程序实现c=a2+b2设a、b、c分别存放于内部RAM的30H、31H、32H单元中子程序入口:(A)=预平方数子程序出口:(A)=平方值,2023/7/5,40,SQR:MOV DPTR,#TAB MOVC A,A+DPTR RETTAB:DB 0,1,4,9,16,25,36,49,64,81,2023/7/5,41,十六进制数转换为ASCII码,将1位十六进制数(即四位二进制数)转换为相应 的ASCII码。设十六进制数存放在R0中,转换后的ASCII码存放在R2中子程序入口:(R0)=十六进制数子程序出口:(R2)=ASCII码,2023/7/5,42,十六进

22、制数转换为ASCII码,多十六进制数转换为ASCII码。子程序入口:(R0)=十六进制数低字节地址(R2)=字节数子程序出口:(R0)=十六进制数高字节地址(R1)=ASCII码的高位地址,2023/7/5,43,MOV A,R0ANL A,#0FHADDC A,#16MOVC A,A+PCMOV R1,AINC R1MOV A,R0SWAP AANL A#07HADD A,#7MOVC A,A+PCMOV R1,AINC R0INC R1DJNZ R2,LPDEC R1RETASC:DB 30H,31H,32H-,LP:,ASCTAB:DB 30H,31H,32H,33H,34H,35H,3

23、6H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H,MOV A,R0ANL A,#0FHMOV DPTR,#ASCTABMOVC A,A+DPTRMOV R1,AINC R1MOV A,R0SWAP AANL A#07HMOVC A,A+DPTRMOV R1,AINC R0INC R1DJNZ R2,LPDEC R1RET,LP:,2023/7/5,44,二进制数与十进制数之间的转换,双字节二进制数转换为BCD码设(R2R3)为双字节二进制数,(R4R5R6)为转换完的压缩型BCD码子程序入口:(R2R3)=十六位二进制数子程序出口:(R4R5R6)=转换完的压

24、缩型BCD码,2023/7/5,45,D=b15*215+b14*214+b1*2+b0=(b15*2)+b14)*2+b1)*2+b0=(0*2+b15)*2)+b14)*2+b1)*2+b0,D4=b3*23+b2*22+b1*2+b0=(b3*2)+b2)*2+b1)*2+b0=(0*2+b3)*2)+b2)*2+b1)*2+b0,2023/7/5,46,CLR AMOV R4,AMOV R5,AMOV R6,AMOV R7,#16CLR CMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,A,DCD:,LOOP:,MOV A,R6ADDC A,R6DA

25、AMOV R6,AMOV A,R5ADDC A,R5DA AMOV R5,AMOV A,R4ADDC A,R6DA AMOV R4,ADJNZ R7,LOOP,2023/7/5,47,延时子程序,1m延时子程序,D1ms:MOV R6,#249 DL:NOP NOP DJNZ R6,DL RET,D10ms:MOV R5,#10 D1ms:MOV R4,#249 DL:NOP NOP DJNZ R4,DL DJNZ R5,D10ms RET,10ms延时子程序,(1+1+2)*249*T=996*T,(1+996+2)*10*T=9990*T,2023/7/5,48,4.5 简单I/O设备的并

26、口直接驱动示例,4.5.1 独立式键盘与LED显示示例,【例4-17】数据端与P0口正序连接。编写程序,分别实现功能:上电后数码管显示“P”,按下任何键后,显示从“0”开始每隔1秒加1,加至“F”后,数码管显示“P”,进入等待按键状态。,2023/7/5,49,TEMP EQU 30HORG 0000HJMP START ORG 0100HSTART:MOV SP,#5FH MOV P0,#8CH;显示PMOV P3,#0FFHNOKEY:MOV A,P3CPL AJZ NOKEY;无键按下MOV TEMP,P3;有键按下ACALL D10msMOV A,P3CJNE A,TEMP,NOKEY

27、;去抖MOV R7,#16MOV R2,#0,LOOP:MOV A,R2 MOV DPTR,#CODE_P0 MOVC A,A+DPTR MOV P0,A INC R2 SETB RS0;切换组 ACALL D_1S CLR RS0 DJNZ R7,LOOP JMP START,D_1S:(子程序)D10ms:(子程序),CODE_P0:DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H DB 80H,90H,88H,83H,DB 0C6H,0A1H,86H,8EH,2023/7/5,50,有时为方便走线而采用逆序连接,显示段码要进行调整:CODE_P2:DB

28、 03H,9FH,25H,0DH,99H,49H,40H,1FH DB 01H,09H,11H,0C1H,63H,85H,61H,71H,CODE_P0:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,试比较:,2023/7/5,51,4.5.2 矩阵式键盘与LED显示示例,步骤:判有无键按下、判按下哪个键、依键号进入相应程序,2023/7/5,52,判有无键按下 行线接输入口,列线接输出口。置所有列线为低电平,然后读行线状态,若行线均为高电平,则没有键按下;若行线状态不全为高电平,则可断

29、定有键按下。,判按下哪个键先让C0列为低电平,其余列线为高电平,读行线状态,如行线状态不全为“1”,则说明所按键在该列;否则所按键不在该列,再使C1列线为低电平,其它列为高电平,判断C1列有无按键按下。,进入相应程序 键号=行首号+列号。根据键号进入相应的功能程序。,(程序略),2023/7/5,53,列数多时可用线反转法(依据键号与键值的对应关系)。如“D”号键,先使行线输出全“0”,读列线,结果为D0H;再使列线输出全“0”,读行线,结果为07H。2次读的结果拼成一个字节,即D7H,该值称为键值。,将键值与键号的对应关系列成一个有序表,并设置一个计数器,将所按键值用线反转法求出后,将其作为关键字在键值表中从表首开始计数查找,查到匹配处时相应的计数值就是键号,根据键号就可以进入相应的处理程序了。,2023/7/5,54,Thank You!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号