收藏 分享(赏)

第4章 80C51汇编程序设计.ppt

上传人:ysd1539 文档编号:7248882 上传时间:2019-05-10 格式:PPT 页数:42 大小:1.81MB
下载 相关 举报
第4章 80C51汇编程序设计.ppt_第1页
第1页 / 共42页
第4章 80C51汇编程序设计.ppt_第2页
第2页 / 共42页
第4章 80C51汇编程序设计.ppt_第3页
第3页 / 共42页
第4章 80C51汇编程序设计.ppt_第4页
第4页 / 共42页
第4章 80C51汇编程序设计.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

1、第4章 汇编语言程序设计,教学内容: 4.1 汇编语言程序设计过程 4.2 基本程序结构 4.3 子程序及其调用 4.4 简单I/O设备的并口直接驱动示例,教学目的:,1、掌握80C51汇编语言程序设计步骤2、掌握80C51常用伪指令的使用方法3、熟悉几种基本的程序结构和简单I/O程序设计方法 教学重点:1、 源程序形成目标程序的步骤2、 伪指令与单片机指令的本质区别3、 分支、循环、子程序及按键、LED显示程序的设计 教学难点:程序的设计及实现,4.1 汇编语言程序设计过程,1分析问题,确定算法或解题思路 2画流程图 3编写程序 4 调试和修改 注意:程序语言的选择,4.1.1 汇编语言程序

2、设计过程,汇编语言,生成的目标程序占内存空间少、运行速度快,具有效率高、实时性强。,高级语言,对系统的功能描述与实现简单,程序阅读、修改和移植方便,适合于编写复杂的程序。,流程描述,流程图符号,“超级循环”框架,强化模块观念,使程序占用空间减少、结构清晰 循环初值和结束条件,避免“死机”现象 子程序的现场保护(注意栈平衡、寄存器内容),程序模块(主程序模块、各种子程序模块) 模块化优点:分块设计、便于阅读、调试方便,4.1.2 程序编制的方法和技巧,采用循环和子程序,对中断子程序还有注意保护PSW的内容,4.1.3 源程序的编辑和汇编,目标程序的产生过程如下图:,4.1.3.1 源程序的编辑和

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

4、目标文件用OH51.EXE转换为.HEX文件 .HEX文件经编程器写入单片机存储器,4.1.3.2 伪指令,伪指令,也叫汇编命令。仅对汇编过程进行指示 伪指令无对应的单片机可执行代码,起始地址设定伪指令ORG,ORG 表达式,表达式通常为十六进制地址,例:,ORG 8000H START:MOV A,#30H ,ORG可多次使用,但地址值的顺序要由小到大,结束汇编伪指令END,END,当汇编程序遇到该指令后,结束汇编过程,其后的指令将不加处理。,定义字节数据表伪指令DB,定义字数据表伪指令DW,1000H,标号: DB 字节数据表,如: ORG 1000H DB -2,-4,-6,8,10,1

5、8,1001H,标号: DW 字数据表,ORG 1400H DATA1:DW 324AH,3CH ,1400H,1401H,1402H,1403H,大端模式,定义常值为符号名伪指令EQU,符号名 EQU 常值表达式,LEN EQU 10SUM EQU 21H BLOCK EQU 22HCLR AMOV R7,LENMOV R0,BLOCKLOOP:ADD A,R0INC R0DJNZ R7,LOOPMOV SUM,A,符号名为: 地址 常数 段名 字符串 寄存器名 位名,比较:标号只能是地址,定义位地址为符号名伪指令BIT,符号名 BIT 位地址表达式,如: ST BIT P1.0 ;将P1.

6、0的位地址赋给符号名ST CF BIT 0D7H ;将位地址为D7H的位定义为符号名,用BIT定义的“符号名”一经定义便不能重新定义和改变 其它一些伪指令参见教材表4.2,4.2.1 顺序程序,(无分支、无循环),4.2 基本程序结构,【例4-1】片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASCII码。编写程序将该数据转换成压缩BCD码存放在20H单元。,ORG 0000HLJMP START ORG 0040H START:MOV A,21H ;取十位ASCII码ANL A,#0FH ;保留低半字节SWAP A ;移至高半字节MOV 20H,A ;

7、存于20H单元MOV A,22H ;取个位ASCII码ANL A,#0FH ;保留低半字节ORL 20H,A ;合并到结果单元SJMP $END,4.2.2 分支程序,(单分支、双分支、多分支),【例4-2】设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是: 当x大于0时,y=x; 当x=0时,y=20H; 当x小于0时,y=x+5。 编制程序,根据x的大小求y并送回原单元。,ORG 0000HLJMP START ORG 0040H START:MOV A,30H ;取x至累加器JZ NEXT ;x = 0,转NEXTANL A,#80H ;否,保留符号位JZ DONE

8、;x 0,转结束MOV A,#05H ;x 0处理ADD A,30H MOV 30H,A ;X+05H送YSJMP DONENEXT:MOV 30H,#20H ;x = 0,20H送YDONE:SJMP DONE END,【例4-3】根据R7的内容x(转移序号)转向相应的处理程序。 设R7内容为04,对应的处理程序入口地址分别为PP0PP4。,ORG 0000H LJMP START ORG 0040H,START:MOV R7,#3 ;以转移序号3为例ACALL JPNUMAJMP STARTJPNUM:MOV DPTR,#TAB ;置分支入口地址表首址MOV A,R7ADD A,R7 ;乘

9、2,调整偏移量MOV R3,A MOVC A,A+DPTR ;取地址高字节,暂存于R3XCH A,R3 INC A MOVC A,A+DPTR ;取地址低字节MOV DPL,A ;处理程序入口地址低8位送DPLMOV DPH,R3 ;处理程序入口地址高8位送DPHCLR A JMP A+DPTR,TAB:DW PP0DW PP1DW PP2DW PP3DW PP4 PP0:MOV 30H,#0 ;转移序号为0时,置功能号“0”于30H单元RETPP1:MOV 30H,#1 ;转移序号为1时,置功能号“1”于30H单元RETPP2:MOV 30H,#2 ;转移序号为2时,置功能号“2”于30H单

10、元RETPP3:MOV 30H,#3 ;转移序号为3时,置功能号“3”于30H单元RETPP4:MOV 30H,#4 ;转移序号为4时,置功能号“4”于30H单元RET END,4.2.3 循环程序,(2种:先执行,后判断;先判断,后执行),【例4-4】将内部RAM的30H至3FH单元初始化为00H。,MAIN:MOV R0,#30H ;置初值MOV A,#00H ; MOV R7,#16 ; LOOP:MOV R0,A ;循环处理INC R0 ;DJNZ R7,LOOP ;循环修改,判结束 SJMP $ ;结束处理,【例4-5】将内部RAM起始地址为60H的数据串传送到外部RAM中起始地址为

11、1000H的存储区域,直到发现$ 字符停止传送。,MAIN:MOV R0,#60H ;置初值MOV DPTR,#1000H LOOP0:MOV A,R0 ;取数据CJNE A,#24H,LOOP1 ;循环结束?SJMP DONE ;是 LOOP1:MOVX DPTR,A ;循环处理INC R0 ;循环修改INC DPTR SJMP LOOP0 ;继续循环DONE:SJMP DONE ;结束处理,4.3 子程序及其调用,完成通用功能、反复使用的程序设计成子程序。使应用程序结构清晰紧凑,便于阅读和调试,执行要由其它程序来调用,执行完后要返回到调用程序,结构上仍然采用一般程序的3种结构,调用时注意:

12、 一是现场的保护和恢复; 二是主程序与子程序间的参数传递。,4.3.1 现场保护与恢复,在主程序中实现(结构灵活),PUSH PSW ;保护现场( 含当前工作寄存器组号) PUSH ACC ; PUSH B ; MOV PSW,#10H ;切换当前工作寄存器组 LCALL addr16 ;子程序调用, POP B ;恢复现场 POP ACC ; POP PSW ;含当前工作寄存器组切换,在子程序中实现(程序规范、清晰),SUB1:PUSH PSW ;保护现场( 含当前工作寄存器组号) PUSH ACC ;PUSH B ;MOV PSW,#10H ;切换当前工作寄存器组 POP B ;恢复现场P

13、OP ACC ;POP PSW ;内含当前工作寄存器组切换RET,4.3.2 参数传递,利用累加器或寄存器(简单、快速,但参数个数不多),【例4-6】实现两个8位的十六进制无符号数求和的子程序。,SADD:MOV A,R3 ;取加数(在R3中)CLR CADD A,R4 ;被加数(在R4中)加AJC PP1MOV R3,#00H ;结果小于255时,高字节R3内容为00HSJMP PP2PP1:MOV R3,#01H ;结果大于255时,高字节R3内容为01HPP2:MOV R4,A ;结果的低字节在R4中RET,入口:(R3)=加数;(R4)=被加数。,出口:(R3)=和的高字节;(R4)=

14、和的低字节。,利用存储器(个数多,用R0或R1及DPTR为参数表指针),【例4-7】将内部RAM 中两个4字节无符号整数相加,和的高字节由R0指向。数据采用大端模式存储。,入口:(R0)=加数低字节地址;(R1)=被加数低字节地址。,出口:(R0)=和的高字节起始地址。,NADD:MOV R7,#4 ;字节数4送计数器CLR C ; NADD1:MOV A,R0 ;利用指针,取加数低字节ADDC A,R1 ;利用指针,被加数低字节加AMOV R0,A ;DEC R0DEC R1DJNZ R7,NADD1INC R0 ;调整指针,指向出口RET,利用堆栈,【例4-8】 将内部RAM中20H单元中

15、的1个字节十六进制数转换为2位ASCII码,存放在R0指示的两个单元中。,入口:预转换数据(低半字节)在栈顶,出口:转换结果(ASCII码)在栈顶,HEASC:MOV R1,SP ;借用R1为堆栈指针DEC R1DEC R1 ;R1指向被转换数据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,37HDB 38H,39H,41H,42H,4

16、3H,44H,45H,46H,验证程序段,MAIN:MOV A,20H ;SWAP APUSH ACC ;预转换的数据(在低半字节)入栈ACALL HEASCPOP ACC ;弹出栈顶结果于ACC中MOV R0,A ;存转换结果高字节INC R0 ;修改指针PUSH 20H ;预转换的数据(在低半字节)入栈ACALL HEASCPOP ACC ;弹出栈顶结果于ACC中MOV R0,A ;存转换结果低字节SJMP $,例 无符号双字节乘法。 解: 设被乘数和乘数分别放在R2、R3和R4、R5中,R0指向积的高字节。 子程序入口: (R2、R3)=被乘数;(R4、R5)=乘数;(R0)=预存放积的

17、低字节的单元地址; 子程序出口: (R0)=积的高字节的单元地址; 主程序: ORG 0000Hljmp MAIN ORG 0040HMAIN: MOV R2,#12HMOV R3,#1AHMOV R4,#12HMOV R5,#2BHMOV R0,#33HMOV R0,#00hMOV R7,#04DEC R0DEC R0DEC R0DEC R0,4.4.3 常用子程序示例,1.乘法子程序,LOOP: MOV R0,#00HINC R0DJNZ R7,LOOPNOPACALL BMULSJMP $,BMUL: MOV A,R3 MOV B,R5MUL ABACALL RADDMOV A,R3 M

18、OV B,R4MUL ABINC R0ACALL RADD MOV A,R2MOV B,R5MUL ABINC R0INC R0ACALL RADD MOV A,R2MOV B,R4MUL ABINC R0ACALL RADDINC R0 RET,RADD: ADD A,R0MOV R0,AMOV A,BDEC R0ADDC A,R0MOV R0,ADEC R0MOV A,R0ADDC A,#00hMOV R0,A RET END,子程序:,2.数制与码的转换子程序 例1:将1位十六进制数转换成相应的ASCII码。设十六进制数存放在R0中,转换后的ASCII码存放于R2中。ORG 0000Hl

19、jmp MAIN ORG 0040HMAIN:MOV R0,#0BHACALL HASCSJMP $HASC:MOV A,R0ANL A,#0FHPUSH ACCCLR CSUBB A,#0AHPOP ACCJC LOOPADD A,#07HLOOP:ADD A,#30HMOV R2,ARETEND,例2:双字节二进制数转换成BCD码。设(R2R3)为双字节二进制数,(R4R5R6)为转换完的压缩型BCD码。ORG 0000Hljmp MAIN ORG 0040HMAIN:MOV R2,#0B2HMOV R3,#1BHACALL DCDTHSJMP $DCDTH:CLR AMOV R4,AMO

20、V R5,AMOV R6,AMOV R7,#16LOOP:CLR CMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,A,MOV A,R6ADDC A,R6DA AMOV R6,AMOV A,R5ADDC A,R5DA AMOV R5,AMOV A,R4ADDC A,R4DA AMOV R4,ADJNZ R7,LOOPRETEND,3.延时子程序 例:编写10ms延时子程序。(假设晶振频率为12MHZ) D10ms: MOV R5,#10 ;1us D1ms: MOV R4,#249 ;1usDL: NOPNOPDJNZ R4,DL ;4x249=996usDJ

21、NZ R5,D1ms ;2us,总循环共(1+996+2) 10=9990usRET;2us,4.5 简单I/O设备的并口直接驱动示例,4.5.1 独立式键盘与LED显示示例,【例4-17】数据端与P0口正序连接。编写程序,分别实现功能:上电后数码管显示“P”,按下任何键后,显示从“0”开始每隔1秒加1,加至“F”后,数码管显示“P”,进入等待按键状态。,TEMP EQU 30H ORG 0000HJMP STARTORG 0100H START:MOV SP,#5FHMOV P0,#8CH ;显示“P“MOV P3,#0FFH NOKEY:MOV A,P3CPL AJZ NOKEY ;无键按

22、下MOV TEMP,P3 ;有键按下CALL D10msMOV A,P3CJNE A,TEMP,NOKEY;去抖MOV R7,#16MOV R2,#0,LOOP:MOV A,R2MOV DPTR,#CODE_P0MOVC A,A+DPTRMOV P0,AINC R2SETB RS0 ;切换组CALL D_1SCLR RS0 DJNZ R7,LOOP JMP START,D_1S:(子程序) D10ms:(子程序),CODE_P0:DB 0C0H,0F9H,0A4H,0B0HDB 99H,92H,82H,0F8HDB 80H,90H,88H,83H,DB 0C6H,0A1H,86H,8EH,有时

23、为方便走线而采用逆序连接,显示段码要进行调整: CODE_P2:DB 03H,9FH,25H,0DH,99H,49H,40H,1FHDB 01H,09H,11H,0C1H,63H,85H,61H,71H,CODE_P0:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HDB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,试比较:,4.5.2 矩阵式键盘与LED显示示例,步骤:判有无键按下、判按下哪个键 、依键号进入相应程序,判有无键按下行线接输入口,列线接输出口。置所有列线为低电平,然后读行线状态,若行线均为高电平,则没有键按下;若行线状态不全

24、为高电平,则可断定有键按下。,判按下哪个键 先让C0列为低电平,其余列线为高电平,读行线状态,如行线状态不全为“1”,则说明所按键在该列;否则所按键不在该列,再使C1列线为低电平,其它列为高电平,判断C1列有无按键按下。,进入相应程序键号 = 行首号+列号。根据键号进入相应的功能程序。,LNUM EQU 30HORG 0000HJMP START ORG 0100H START:MOV SP,#5FHMOV LNUM,#4 ;共4行MOV P0,#8CH ;显示“P”CLR F0ST1:CALL MAKEY ;单元矩阵键盘扫描子程序JNB F0,ST1 ;F0为0时无键按下,继续扫描ANL A

25、,#0FH ;有键按下时键号在A中MOV DPTR,#CODE_P2MOVC A,A+DPTRMOV P2,AJMP START MAKEY:CALL KEYHNJNZ HAVE ;有键按下JMP NRETHAVE:CALL D10msCALL KEYHN ;延时后再判断,去抖动JNZ TRUE ;确认有键按下JMP NRET,TRUE:MOV R1,#0EFH ;首列扫描字MOV R4,#0 ;首列号SCAN:MOV A,R1MOV P1,AMOV A,P1JB ACC.0,L1 ;0行无键按下,转1行MOV A,#0 ;0行首键号JMP KEYNUM ;转键号计算L1:JB ACC.1,L

26、2 ;1行无键按下,转2行MOV A,#4 ;1行首键号JMP KEYNUM ;转键号计算L2:JB ACC.2,L3 ;2行无键按下,转3行MOV A,#8 ;2行首键号JMP KEYNUM ;转键号计算L3:JB ACC.3,NEXT ;3行无键按下,转下一列MOV A,#0CH ;3行首键号 KEYNUM:ADD A,R4 ;键号=行首号+列号PUSH ACC UPKEY:CALL KEYHNJNZ UPKEY ;等待键释放POP ACCSETB F0 ;置有键按下标志JMP HRETNRET:CLR F0 ;清有键按下标志,HRET:RETNEXT:INC R4MOV A,R1DJNZ

27、 LNUM,NDONEJMP NRETNDONE:RL A ;扫描字左移,准备扫描下一列MOV R1,A ;下一列扫描JMP SCANKEYHN:MOV P1,#0FH ;置高4位全为0,低4位输入状态MOV A,P1CPL AANL A,#0FHRETD10ms:MOV R5,#10 D1ms:MOV R4,#249 DL:NOPNOPDJNZ R4,DL DJNZ R5,D1ms RETCODE_P2:DB 03H,9FH,25H,0DH,99H,49H,40H,1FHDB 01H,09H,11H,0C1H,63H,85H,61H,71HEND,本章小结,本章的主要内容是汇编程序设计,从程序编制的方法和技巧,引导学生如何编写程序,紧接着讲解基本程序结构、子程序及其调用,结合前面的基础最后详细讲解了LED显示实例,巩固学生对用汇编语言编写程序这一块知识的理解。,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报