单片机原理汇编语言程序设计教学课件PPT.ppt

上传人:za****8 文档编号:20017057 上传时间:2021-01-25 格式:PPT 页数:35 大小:2.04MB
返回 下载 相关 举报
单片机原理汇编语言程序设计教学课件PPT.ppt_第1页
第1页 / 共35页
单片机原理汇编语言程序设计教学课件PPT.ppt_第2页
第2页 / 共35页
单片机原理汇编语言程序设计教学课件PPT.ppt_第3页
第3页 / 共35页
点击查看更多>>
资源描述
1 第五章 汇编语言程序设计 1 程序设计方法 2 顺序程序 3 分支程序 4 循环程序 5 子程序 6 算术运算程序 2 第五章 汇编语言程序设计 5-1-2 汇编语言程序设计步骤 一 .分析问题。 二 .确定算法。 三 .制定程序流程图:表示程序结构和程序功能 四 .编制源程序 1. 合理分配存储器单元和了解 I/O接口地址。 2. 按功能设计程序, 明确各程序之间的相互关系。 3. 用注释行说明程序, 便于阅读和修改调试和修改。 五 .程序调试。 开始 1 Y N ? 3 第五章 汇编语言程序设计 5-1-3 评价程序质量的标准 (1)程序的执行时间 。 (2)程序所占用的内存字节数 。 (3)程序的逻辑性 、 可读性 。 (4)程序的兼容性 、 可扩展性 。 (5)程序的可靠性。 4 5-2 顺序程序 直线程序又称简单程序,程序走向只有一条路径。 例 1 双字节变补程序(设数据在 R4 R5中) 双字节变补程序 (设数据在 R4R5 中 ): MOV A, R5 ; 取低字节 CPL A ADD A, #1 ; 低字节变补 MOV R5, A MOV A, R4 ; 取高字节 CPL A ADDC A, #0 ; 高字节变补 MOV R4, A 第五章 汇编语言程序设计 5 第五章 汇编语言程序设计 例 2 压缩式 BCD码分解成为单字节 BCD码。 片内 R A M 42H 0 十 41H 0 个 40H MOV R0, #40H ; 设指针 MOV A, R0 ; 取一个字节 MOV R2, A ; 暂存 ANL A, #0FH ; 清 0高半字节 INC R0 MOV R0, A ; 保存数据个位 MOV A, R2 SWAP A ; 十位换到低半字节 ANL A, #0FH INC R0 MOV R0, A ; 保存数据十位 十 个 6 第五章 汇编语言程序设计 例 5-1 假设两个双字节无符号数,分别存放在 R1R0和 R3R2中,高字节在 前,低字节在后。编程使两数相加,和数存放回 R2R1R0中。 ORG 1000h CLR C MOV A, R0 ; 取被加数低字节至 A ADD A, R2 ; 与加数低字节相加 MOV R0, A ; 存和数低字节 MOV A, Rl ; 取被加数高字节至 A ADDC A, R3 ; 与加数高字节相加 MOV Rl, A ; 存和数高字节 MOV A, #0 ADDC A, #0 ; 加进位位 MOV R2, A ; 存和数进位位 SJMP $ ; 原地踏步 END 7 第五章 汇编语言程序设计 5-3 分支程序 由条件转移指令构成程序判断框部分,形成程序分支结构。 5-3-1 单重分支程序 一个判断决策框,程序有两条出路。两种分支结构。 例 1 求 R2中补码绝对值,正数不变,负数变补。 MOV A, R2 JNB ACC.7, NEXT ; 为正数? CPL A ; 负数变补 INC A MOV R2, A NEXT: SJMP NEXT ; 结束 条件满足 ? N 影响条件 Y 处理段 8 第五章 汇编语言程序设计 5-3-2 多重分支程序 多次使用条件转移指令,形成两个以上判断框。 例 5-7 设 30H单元存放的是一元二次方程 ax2+bx+c=0根的判别式 =b2-4ac的值 。 解 : 值为有符号数 , 有三种情况 , 即大于零 、 等于零 、 小于零 。 9 第五章 汇编语言程序设计 编程: ORG 1000H START: MOV A, 30H ; 值送 A JNB ACC.7, YES ; =0转 YES MOV 31H, #0 ; 0转 TOW MOV 31H, #1 ; =0有相同实根 SJMP FINISH TOW: MOV 31H,#2 ; 有两个不同实根 FINISH: SJMP $ 10 第五章 汇编语言程序设计 5-3-3 N路分支程序 N路分支程序是根据前面程序运行的结果,可以有 N种选择,并能转向其 中任一处理程序。 11 第五章 汇编语言程序设计 例 5-10 128路分支程序 。 功能:根据 R3的值 (00H 7FH)转到 128个目的地址 。 参考程序: JMPl28: MOV A, R3 RL A ; (A) 2 MOV DPTR, #PRGTBL ; 散转表首址送 DPTR JMP A+DPTR ; 散转 PRGTBL: AJMP ROUT00 AJMP ROUT01 AJMP ROUT7F ; 128个 AJMP指令占 256个字节 12 第五章 汇编语言程序设计 例 5-11 256路分支程序 功能:根据 R3的值转移到 256个目的地址; 入口条件: (R3)=转移目的地址代号 (00H FFH); 出口条件:转移到相应分支处理程序入口 。 解: JMP256: MOV A, R3 ; 取 N值 MOV DPTR, #PRGTBL ; 指向分支地址表首址 CLR C RLC A ; (A) 2 JNC LOWl28 ; 是前 128个分支程序,则转移 INC DPH ; 否则基址加 256 13 第五章 汇编语言程序设计 LOWl28: MOV TEMP, A ; 暂存 A INC A ; 指向地址低 8位 MOVC A, A+DPTR ; 查表 , 读分支地址低 8位 PUSH ACC ; 地址低 8位入栈 MOV A, TEMP ; 恢复 A, 指向地址高 8位 MOVC A, A+DPTR ; 查表 , 读分支地址高 8位 PUSH ACC ; 地址高 8位入栈 RET ; 分支地址弹入 PC实现转移 PRGTBL: DW ROUT00 ; 占用 512个字节 DW ROUT01 2000H 2003H 2002H 2001H 高8位 低8位 14 第五章 汇编语言程序设计 例 5-12 大于 256路分支转移程序 功能:根据入口条件转向 n个分支处理程序 入口条件: (R7R6)=转移目的地址代号; 出口条件:转移到相应分支处理程序入口。 程序散转表中有 N条 LJMP指令,每条 LJMP指令占 3个字节,因 此要按入口条件将址代号乘以 3,用乘积的高字节加 DPH, 乘 积的低字节送 A(变址寄存器 )。 PRGTBL: LJMP ROUT0 LJMP ROUT1 LJMP ROUT2 15 第五章 汇编语言程序设计 参考程序: JMPN: MOV DPTR, #PRGTBL; DPTR指向表首址 MOV A, R7 ; 取地址代号高 8位 MOV B, #3 ; MUL AB ; 3 ADD A, DPH ; MOV DPH, A ; 修改指针高 8位 MOV A, R6 ; 取地址代号低 8位 MOV B, #3 ; 3 MUL AB ; XCH A, B ; 交换乘积的高低字节 ADD A, DPH ; 乘积的高字节加 DPH MOV DPH, A XCH A, B ; 乘积的低字节送 A JMP A+DPTR ; 散转 16 第五章 汇编语言程序设计 5-4 循环程序 包含多次重复执行的程序段,循环结构使程序紧凑。 5-4-1 循环程序的导出 各个环节任务: 一初始化部分 循环准备工作。 如:清结果单元、设指针、设循环控制变量初值等。 二循环体 循环工作部分: 需多次重复处理的工作。 循环控制部分: 1.修改指针和循环控制变量。 2.检测循环条件:满足循环条件,继续循环,否则退出循环。 三 .结束部分 处理和保存循环结果。 1)已知循环次数 2)循环次数未知 允许 0次循环的循环结构:在循环工作之前检测循环条件。 循环控制 ? 循环工作 循环结束 循环初始化 Y N 17 第五章 汇编语言程序设计 单重循环 简单循环结构:循环体中不套循环。 例: 求 n个单字节数据的累加,设数据串已在 43H起始单元,数据串长度在 42H单元,累加和不超过 2个字节。 SUM: MOV R0, #42H; 设指针 MOV A, R0 MOV R2, A ; 循环计数器 R2n CLR A ; 结果单元清 0 MOV R3, A ADD1: INC R0 ; 修改指针 ADD A, R0 ; 累加 JNC NEXT ; 处理进位 INC R3 ; 有进位,高字节加 1 NEXT: DJNZ R2,ADD1 ; 循环控制:数据是否加完? MOV 40H, A ; 循环结束,保存结果 MOV 41H, R3 RET 片内 R A M X n 43H X1 42H n 41H S UM H 40H S UM L 18 第五章 汇编语言程序设计 循环控制方法 : 计数控制、特征标志控制。 一 .计数控制: 设循环计数器 , 控制循环次数 。 正计数 和 倒计数 两种方式 。 例: 为一串 7位 ASCII码数据的 D7位加上 奇校验 , 设数据存放在片外 RAM的 2101H起始单元 , 数据长 度在 2100H单元 。 MOV DPTR, #2100H MOVX A, DPTR MOV R2, A NEXT: INC DPTR MOVX A, DPTR ORL A, #80H JNB P, PASS ; 判断是否加校验 MOVX DPTR, A; 是,则加奇校验 PASS: DJNZ R2, NEXT DONE: SJMP DONE 片外 RA M 2102H 01 101000 2101H 00101 101 2100H n 19 第五章 汇编语言程序设计 二 .特征控制: 设定循环结束标志实现循环控制。 例:找正数表最小值。正数表存在片外 RAM中以 LIST为起始单元,用 -1作为结束标志。 START: MOV DPTR, #LIST ; 数表首地址 MOV B, #127 ; 预置最小值 NEXT: MOVX A, DPTR ; 取数 INC DPTR ; 修改指针 CJNE A, #0FFH, NEXT1; 是否为数表结尾? SJMP DONE ; 循环结束 NEXT1: CJNE A, B, NEXT2 ; 比较 NEXT2: JNC NEXT ; Cy=1,则 AB MOV B, A ; 保存较小值 SJMP NEXT DONE: SJMP DONE 20 第五章 汇编语言程序设计 5-4-2 多重循环 循环体中套循环结构。以双重循环使用较多。 例:将内存一串单字节无符号数升序排序。 步骤: 每次取相邻单元的两数比较, 决定是否需要交换数据位置。 第一次循环,比较 N-1次,取数据表中最大值。 第二次循环,比较 N-2次,取到次大值。 第 N-1次循环:比较一次,排序结束。 片内 R A M M A X 5 2 4 1 T A B 3 内循环控制 ? 循环工作 循环结束 外循环控制 ? 内循环初始化 开始 外循环初始化 21 第五章 汇编语言程序设计 SORT: MOV A, #N-1 ; N个数据排序 MOV R4, A ; 外循环次数 LOOP1: MOV A, R4 MOV R3, A ; 内循环次数 MOV R0, #TAB ; 设数据指针 LOOP2: MOV A, R0 ; 取二数 MOV B, A INC R0 MOV A, R0 CJNE A, B, L1 ; 比较 L1: JNC UNEX ; AB, 不交换 DEC R0 ; 否则交换数据 XCH A , R0 INC R0 MOV R0, A UNEX: DJNZ R3, LOOP2 ; 内循环结束? DJNZ R4, LOOP1 ; 外循环结束? RET R3R3 1=0 ? B ( R0) A ( R0 + 1 ) 循环结束 外循环次数 R4 R4R4 1=0 ? 内循环次数 R3 表首 TABR0 开始 A B ? (R0)(R0+1) R0 R0+1 Y N 22 第五章 汇编语言程序设计 软件延时程序 用循环程序将指令重复多次执行,实现软件延时。 试计算延时程序的执行时间。 源程序 指令周期 (M) 指令执行次数 DELAY: MOV R6, #64H 1 I1: MOV R7, #0FFH 1 I2: DJNZ R7, I2 2 DJNZ R6, I1 2 RET 2 延时时间计算:(设时钟 f=12MHz) t=(1 1+1 100+2 100 255+2 100+2 1) M=51.3 ms 1 100 100 255 100 1 23 第五章 汇编语言程序设计 5.5.2编写循环程序应注意的问题 1) 循环体前应注意安排循环初始化; 2) 内外循环间不应相互交叉 。 24 第五章 汇编语言程序设计 5-5 查表程序 例 5-19 一个十六进制数存放在 HEX单元的低四位,将其转换成 ASCII码并送回 HEX单 元。 编程: ORG 0100H HEX EQU 30H HEXASC: MOV A, HEX ANL A , #00001111B ADD A, #3 ; 变址调整 MOVC A, A+PC MOV HEX, A ; 2字节 RET ; 1字节 ASCTAB: DB 30H, 3lH, 32H, 33H DB 34H, 35H, 36H, 37H DB 38H, 39H, 41H, 42H DB 43H, 44H, 45H, 46H END 25 第五章 汇编语言程序设计 5-6 子程序设计 子程序:能完成某项特定功能的独立程序段,可被反复调用。 优点: (1)不必重复书写同样的程序 , 提高编程效率; (2)程序的逻辑结构简单 , 便于阅读; (3)缩短了源程序和目标程序的长度 , 节省了程序存储器空间; (4)使程序模块化 、 通用化 , 便于交流 , 共享资源; (5)便于按某种功能调试 。 26 第五章 汇编语言程序设计 1. 子程序结构 一 子程序入口用标号作为子程序名 。 二 调用子程序之前设置好堆栈 。 三 用返回指令 RET结束子程序 , 并保证堆栈栈顶为调 用程序的返回地址 。 四 . 子程序嵌套须考虑堆栈容量 。 五 . 提供足够的调用信息 : 如: 子程序名 、 子程序功能 、 入口参数和出口参数 、 子程序占用 的硬件资源 、 子程序中调用的其他子程序名 。 27 第五章 汇编语言程序设计 2. 参数传递 入口参数:调用子程序之前 , 需要传给子程序的参数 。 出口参数:子程序送回调用程序的结果参数 。 (1)子程序无须传递参数 28 第五章 汇编语言程序设计 (2)用累加器和工作寄存器传递参数 例 5-24 双字节求补子程序 CPLD。 解 入口参数: (R7R6)=16位数 出口参数: (R7R6)=求补后的 16位数 CPLD: MOV A, R6 CPL A ADD A, #1 MOV R6, A MOV A, R7 CPL A ADDC A, #0 MOV R7, A RET 29 第五章 汇编语言程序设计 (3)通过操作数地址传递参数 例 5-25 n字节求补子程序 。 解 入口参数: (R0)=求补数低字节指针 , (R7)=n-1 出口参数: (R0)=求补后的高字节指针 CPLN: MOV A, R0 CPL A ADD A, #1 MOV R0, A NEXT: INC R0 MOV A, R0 CPL A ADDC A, #0 MOV R0, A DJNZ R7, NEXT RET 30 第五章 汇编语言程序设计 (4)通过堆栈传递参数 例 5-26 在 HEX单元存放两个十六进制数 , 将它们分别转换 成 ASC 码并存入 ASC和 ASC+1单元 。 解 由于要进行两次转换 , 故可调用查表子程序完成 。 主程序: MAIN: PUSH HEX ; 取被转换数 LCALL HASC ; 转子 *PC POP ASC ; ASCL ASC MOV A, HEX ; 取被转换数 SWAP A ; 处理高四位 PUSH ACC LCALL HASC ; 转子程序 POP ASC+1 ; ASCH ASC+1 31 第五章 汇编语言程序设计 子程序: HASC: DEC SP DEC SP ; 修改 SP指向 HEX POP ACC ; 弹出 HEX ANL A, #0FH ; 屏蔽高四位 ADD A, #5 ; 变址调整 MOVC A, A+PC ; 查表 PUSH ACC ; 结果入栈 (2字节 ) INC SP ; (1字节 ) INC SP ; 修改 SP指向断点位置 (1字节 ) RET ; (1字节 ) ASCTAB: DB 0 1 2. .7 DB 8 9 A. .F *PCH *PCL HEX SP+3 SP+2 SP+1 SP 32 第五章 汇编语言程序设计 3. 现场保护 推入与弹出的顺序应按 “ 先进后出 ” ,或 “ 后进先出 ” 的顺序,才能保证 现场的恢复。 例:十翻二子程序的现场保护 。 BCDCB: PUSH ACC PUSH PSW PUSH DPL ; 保护现场 PUSH DPH POP DPH POP DPL POP PSW ; 恢复现场 POP ACC RET 33 第五章 汇编语言程序设计 4. 设置堆栈 调用子程序时,主程序的断点将自动入栈; 转子后,现场的保护都要占用堆栈工作单元,尤其多重转子或子 程序嵌套,需要 使栈区有一定的深度 。 由于 MCS-51的堆栈是由 Sp指针组织的内部 RAM区,仅有 128个 地址空间 , 堆栈并非越深越好,深度要恰当。 34 第五章 汇编语言程序设计 5.6.3 子程序的调用及嵌套 1子程序调用 2子程序嵌套 35 第五章 汇编语言程序设计 2子程序嵌套 断点入栈 断点出栈
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!