单片机第4章.ppt_第1页
单片机第4章.ppt_第2页
单片机第4章.ppt_第3页
单片机第4章.ppt_第4页
单片机第4章.ppt_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章汇编语言程序设计 4 1概述 4 2简单程序 4 3分支程序 4 4循环程序 4 6子程序的设计及调用 4 7程序设计举例 4 5查表程序 下页 4 1概述 一 汇编语言和高级语言相比具有下列优点 上页 下页 回目录 专有特性 MOVP1 A 如 输出操作 二 汇编语言程序设计的步骤 三 汇编语言程序的结构 上页 下页 回目录 例1 内部RAM从DATA1单元有一数据块 存放若干无符号数 第一单元为数据块长度 求这些无符号数之和 起始地址 程序主体 汇编结束标志 标号 注释 上页 下页 回目录 上页 下页 回目录 四 评价程序质量的标准 程序的执行时间 程序所占用的内存字节数目 程序的逻辑性 可读性 程序的兼容性 可扩展性 程序的可靠性 时间空间 4 2简单程序 简单程序的特点 既无分支 又无循环 按照顺序执行 例4 2 将一个字节内的两个BCD码拆开并变成ASCII码 存入两个RAM单元 BCD码放在内RAM的20H 转换后高半字节放到21H 低字节放22H BCDHBCDL 0011 0011 方法1 BCD码0 9对应的ASCII码为30H 39H转换时 将20H中的BCD码拆开 高四位置为 0011 即可 BCDH BCDL 上页 下页 回目录 可完成一定的基本功能 是编写复杂程序的基础 程序 0011BCDH 00000000 两个BCD数送A BCDL数送22H 完成转换 BCDH数送A的低4位 完成转换 存数 BCDHBCDL BCDL 0000 0011 0000 BCDH 0011 上页 下页 回目录 原地踏步 相当与停机 方法1小结 以上程序用了8条指令 15个内存字节 执行时间为9个机器周期 方法2 采用除10H取余法将两个BCD数拆开 BCDHBCDL 00010000 0000BCDH 0000BCDL DIVAB 上页 下页 回目录 0011BCDH 0011BCDL 程序 取BCD码至A 完成转换 存ASCII码 完成转换 存ASCII码 BCDHBCDL 00010000 0000BCDH 0000BCDL DIVAB 0011 0011 上页 下页 回目录 方法2小结 以上程序用了7条指令 16个内存字节 执行时间为13个机器周期 双字节求补设 两个字节原码数存在R1 R0中求补后结果 存在R3 R2中 例4 3 方法 求补采用 模 原码 的方法 上页 下页 回目录 即用 0 去减 原码 程序 CLRC CLRA SUBBA R0 MOVR2 A CLRA SUBBA R1 ORG1000H MOVR3 A SJMP END 低字节求补 送R2 A清零 高字节求补 送R3 上页 下页 回目录 将内部RAM的20H单元中的8位无符号二进制数 转换为3位BCD码 并将结果存放在FIRST 百位 和SECOND 十位 个位 两个单元中 例4 4 解 可将被转换数除以100 得百位数 余数除以10得十位数 最后余数即为个位数 编程如下 例如 255 十进制 除以100 得2 百位数 余数除以10 得5 十位数 最后余数5即为个位数 上页 下页 回目录 55H 程序 设 20H 0FFH 除100 百位BCD 除10 除数10 B 十位数送高位 A为十位 个位BCD 存十位 个位数 0FFH 64H 02H 37H 0AH 37H MOVA B 05H 05H 50H 55H 02H 上页 下页 回目录 FIRST SECOND 4 3分支程序 简单分支 测试标志位 解 这是一个简单分支程序 可以使两数相减 若CY 1 则被减数小于减数 用JC指令进行判断 N路分支 利用散转指令JMP A DPTR可转向任一处理程序 例4 5设内RAM30H 31H存放两个无符号数 试比较两数的大小 较小的数存入30H单元 较大的数存入31H单元 程序的流程图如下 简单分支程序举例 上页 下页 回目录 多重分支 判断程序设置的条件 判断2个以上的条件 被称为复合条件 根据程序运行情况 可以有N种选择 程序 做减法比较两数 若 30H 小 则转移 交换两数 流程图 CY 1则转移 若CY 1则顺序执行 上页 下页 回目录 例4 6 空调机制冷时 若排出的空气温度比吸入的空气温度低8 则认为工作正常 否则便认为是故障 并设置故障标志 解 为了可靠的监控空调机的工作情况 做两次减法 第一次 40H 41H 若CY 1 则肯定有故障 第二次两个温度的差值减去8 若CY 1 则肯定有故障 程序的流程图如下 上页 下页 回目录 首先定义一些工作单元 低 高 置热 置冷能力不足 流程图 上页 下页 回目录 故障 正常 入出 故障 程序 A 40H 41H CY 1 则故障 是则故障 温度小于8 工作正常标志 转出口 设置故障标志 若CY 1顺序执行 CY 1转移 CY 1转移 若CY 1顺序执行 上页 下页 回目录 停机 多重分支程序举例 例4 7 设30H单元存放的是一元二次方程ax2 bx c 0根的判别式 b2 4ac的值 试根据30H单元的值 编写程序 判断方程根的三种情况 在31H中存放 0 代表无实根 存放 1 代表有相同的实根 存放 2 代表两个不同的实根 解 为有符号数 有三种情况 这是一多重分支程序即小于零 等于零 大于零 可以用两个条件转移指令来判断 首先判断符号位 用指令JNBACC 7 rel判断 若ACC 7 1 则一定为负数 此时 0若ACC 7 0 则 0 此时再用指令JNZrel判断若 0 则 0 否则 0 上页 下页 回目录 流程图 上页 下页 回目录 0 则无实根 0 则1个实根 0 则2个实根 P124 程序 0无实根 0有相同实根 0转TOW 有两个不同实根 上页 下页 回目录 P124 4 3 3散转程序设计 根据R0中的内容 转向各个子程序 R0 0 转入Pr0R0 1 转入Pr1R0 2 转入Pr2 R0 n 转入Prn ORG0030HJUMP1 MOVDPTR TABCLRAMOVA R0ADDA R0JMP A DPTRORG0100HTAB AJMPProg0 2个字节 AJMPProg1 2个字节 AJMPProg2 2个字节 Prog0 Prog1 Prog2 思考 为什么A R0 中的内容要乘以2 例1根据工作寄存器R0内容的不同 使程序转入相应的分支 程序如下 LP0 MOVDPTR TAB 取表头地址 MOVA R0 ADDA R0 R0内容乘以2 JNCLP1 无进位转移 当 A 80H 128D 时有进位 当 A 80H 128D 时无进位 进位应加到高位DPH中 INCDPH 加进位位 LP1 JMP A DPTR 跳至散转表中相应位置 TAB AJMPPR0 占2个字节AJMPPR1 AJMPPRNPRO 上例程序仅适用于散转表首地址TAB和处理程序入口地址PR0 PR1 PRN在同一个2KB范围的存储区内的情形 若超出2KB范围可在分支程序入口处安排一条长跳转指令 可采用如下程序 例2 MOVDPTR TAB MOVA R0 MOVB 03H 长跳转指令占3个字节 MULAB XCHA BADDA DPH MOVDPH A XCHA B JMP A DPTR 跳至散转表中相应的位置 TAB LJMPPR0 跳至不同的分支 LJMPPR1 占3个字节 LJMPPRNPR0 PR1 4 4循环程序 循环程序 一些有规可循而又反复处理的问题 利用比较转移指令CJNE 减1不为 0 转移指令DJNZ等实现 例4 13 在内部RAM30H 4FH连续32个单元中存放了单字节无符号数 求32个无符号数之和 并存入内部RAM51H 50H中 解 这是重复相加问题 要设置一些工作单元设 R0做加数地址指针 R7做循环次数计数器 R3做和数的高字节寄存器 程序的流程图如下 上页 下页 回目录 地址指针 循环次数计数器 流程图 上页 下页 回目录 N Y N Y A R0 A R3 1 R3 P130 程序 取被加数 R0作加数地址指针 CY 0 和 256 则转 作加法 CY 1 加到高字节 修改R0指针 未完 重复加 存和数 初始化部分 循环体部分 结束部分 上页 下页 回目录 循环执行直到R7 0 循环控制 循环程序的结构 P129 例4 14 从外部RAMBLOCK单元开始有一无符号数数据块 数据块长度存入LEN单元 求出其中最大数存入MAX单元 为了方便进行比较 我们使用CY标志来判断两数的大小 使用B寄存器作比较与交换的寄存器 使用DPTR作外部RAM地址指针 解 这是一个基本搜索问题 采用两两比较法 取两者较大的数再与下一个数进行比较 若数据块长度LEN n则应比较n 1次 最后较大的数就是数据块中的最大数 程序的流程图如下 上页 下页 回目录 P130请阅读 阅读 流程图 上页 下页 回目录 A中的数总是较大 较大数交换至A 恢复较大数至A 初始化工作单元 编程 定义长度计数单元 上页 下页 回目录 取数至A 0 CY 修改指针 暂存于B 取下一数 大者送A 若 A B 则恢复A 未完继续比较 存最大数 若用RET指令结尾则该程序可作子程序调用 作减法比较 RET 例4 15 从外部RAMBLOCK单元开始有一数据块 数据块长度存入LEN单元 试统计其中正数 负数和零的个数 分别存入PCOUNT MCOUNT ZCOUNT单元 解 这是一个多重分支的单循环问题 数据块中是带符号数 先用JBACC 7 rel指令判断符号位 程序的流程图如下 若ACC 7 1 则该数一定是负数 MCOUNT单元加1 若ACC 7 0 则该数可能是正数 也可能是零 用JNZrel判断A是否为零 若A 0 则一定是正数 PCOUNT单元加1 若既不为正也不为负 则一定是零 ZCOUNT单元加1 上页 下页 回目录 P132请阅读 阅读 流程图 上页 下页 回目录 P132 负数 正数 零 程序 上页 下页 回目录 上页 下页 回目录 P132 延时20ms程序 主频为12MHZ DELY MOVR7 100 1TDLY0 MOVR6 100 1TDLY1 DJNZR6 DLY1 2T100 2T 200T 200usDJNZR7 DLY0 2T100 200T 20msRET 2T分析 使用12MHz晶振时 一个机器周期执行DJNZ指令为2us 加其他指令的时间 延时时间为 t 200T 1T 2T 100 3T 20303T 20 303ms 精确延时20ms程序 主频为12MHZ DELY MOVR7 100 1TDLY0 MOVR6 98 1TNOP 1TDLY1 DJNZR6 DLY1 2T98 2T 196usDJNZR7 DLY0 2TRET 2T 例10秒延时程序 延时程序与MCS 51执行指令的时间有关 如果使用6MHz 12MHZ 晶振 一个机器周期为2 s 1 s 计算出一条指令以至一个循环所需要的执行时间 给出相应的循环次数 便能达到延时的目的 10秒 5秒 延时程序如下 DELAY MOVR5 100 1T DEL0 MOVR6 100 1T DEL1 MOVR7 248 1T DEL2 DJNZR7 DEL2 2T DJNZR6 DEL1 2T DJNZR5 DEL0 2T RET T 248T 2 1T 2T 100 1T 2T 100 1T 4990301T 冒泡法 排序示例 例4 18 例 数1 3 5 2 4五个数按从大到小的比较排序过程 第一次外循环 4次内循环 比较4次 有交换 需要再次比较 最小数1沉底1 3 5 2 4 有交换 3 1 5 2 4 有交换 3 5 1 2 4 有交换 3 5 2 1 4 有交换 3 5 2 4 1第二次外循环 3次内循环 比较3次 有交换 需要再次比较 最小数2沉底3 5 2 4 1 有交换 5 3 2 4 15 3 2 4 1 有交换 5 3 4 2 1 第三次外循环 2次内循环 比较2次 有交换 需要再次比较 最小数3沉底5 3 4 2 15 3 4 2 1 有交换 5 4 3 2 1第四次外循环 1次内循环 比较1次 无交换 不需要再次比较 最小数4沉底5 4 3 2 15 4 3 2 1 结论 若有N个数参加比较排序 则至多需要N 1次的内循环和N 1次的外循环 内循环的次数随外循环次数的增加而减少1次 1次外循环 能找出1个当前剩下数中的最小数 要找出N个最小数 最多用N 1次外循环 作业P156 1 4 5 6 4 5查表程序 上页 下页 回目录 对于复杂参数的计算如 非线性参数 对数 指数 三角函数 微分 积分等 用汇编编程十分困难 甚至无法建立数学模型 用查表的方法简单便捷 MCS 51指令系统中有两条指令具有极强的查表功能 1 MOVCA A DPTR 作基址寄存器 作变址寄存器 长查表指令 寻址64KB 2 MOVCA A PC 作基址寄存器 作变址 短查表指令页内查表指令 指向表格首址 指向表格的第i项 第i项加变址调整值 例4 20 一个十六进制数放在HEX单元的低四位 将其转换成ASCII码 查表程序 解 十六进制0 9的ASCII码为30H 39H A F的ASCII码为41H 46H 利用查表指令MOVCA A DPTR MOVCA A PC 先用伪指令DB或DW把表格的数据存入ROM 上页 下页 回目录 来获得数据 ASCII码表格的首址为ASCIITAB 上页 下页 回目录 编程1 0123456789 ABCDEF A 3 33H A 15 46H 编程2 2字节 1字节 3 上页 下页 回目录 变址调整 ALU PC 0207H 01H 04H 31H 查十六进制数 01H 的ASCII码 PC做基址 上页 下页 回目录 ALU 01H 31H 查十六进制数 01H 的ASCII码 DPTR做基址 020BH 上页 下页 回目录 例4 21求y n n 0 1 2 9 Y地址 函数表首址 n 3TABL DB00 00 00 0 DB01 00 00 1 DB02 00 00 2 DB06 00 00 3 DB80 28 36 9 4 6子程序的设计及调用 一 子程序的概念 把能完成某种基本操作 并具有相同操作的程序段 单独编成子程序 如 函数 运算 代码转换 数据采集 延时等 利用调用子程序指令 ACALL或LCALL 和从子程序返回指令RET 使用子程序的优点 不必重复书写同样的程序 提高编程效率 程序的逻辑结构简单 便于阅读 缩短了源程序和目标程序的长度 节省了存储器空间 使程序模块化 通用化 便于交流共享资源 便于按某种功能调试 上页 下页 回目录 二 调用子程序的要点 子程序开头的标号段必须有一个标志 该标志既是子程序的名字又是其入口地址 以便主程序调用 在主程序中利用指令ACALL或LCALL可转入子程序 该指令具有保护断点的功能 例如 调用延时子程序 LCALL ACALL DELY 子程序结尾必须使用一条从子程序返回指令RET 它具有恢复断点的功能 主程序 CALL断点 子程序 RET 1 子程序的结构 上页 下页 回目录 2 参数传递 子程序入口条件 在调用一个子程序时 主程序应先把有关参数放到某些约定的位置 子程序运行时 可以从约定的位置得到有关参数 子程序出口条件 子程序结束前 也应把处理结果送到约定位置 参数传递的方法 子程序无须传递参数 这类子程序中所需要的参数是子程序赋予 不需要主程序给出 上页 下页 回目录 主程序 子程序 不需主程序提供入口参数 从子程序开始到子程序返回 大约为20ms 例4 23调用延时子程序DELY 子程序开始的标号 子程序返回指令 调用子程序 上页 下页 回目录 98 2 196 s 1 s 1 s 设 主频为12MHZ 2 s 196 2 2 100 3 20003 s 20 003ms 2 s 1 s 3 意味着每个机器周期为1 s 用累加器和工作寄存器传递参数 入口参数 放在累加器A和工作寄存器中R0 R7中 出口参数 放在累加器A和工作寄存器中R0 R7中 例4 24双字节求补子程序CPLD 解 采用 变反加1 的方法 十六位数变反加1 不仅低字节要加1 高字节要加低字节的进位 故采用ADD指令 不采用INC指令 INC指令不影响CY位 上页 下页 回目录 入口参数 R7R6 16位数 出口参数 R7R6 求补后的16位数 上页 下页 回目录 Cy Cy R7R6 R7R6 通过操作数地址传递参数 入口参数 R0 求补数低字节指针 R7 n 1 出口参数 R0 求补后高字节指针 例4 25n字节求补子程序CPLN 上页 下页 回目录 地址 通过堆栈传递参数 解 由于要进行两次转换 故可调用查表子程序完成 主程序 PCH PCL HEX 栈底 断点地址 上页 下页 回目录 子程序 上页 下页 回目录 HEX Result Result PC HEX HEX PCL PCH 断点 ASC 主程序 子程序 上页 下页 回目录 3 现场保护 现场保护 如果子程序使用的寄存器与主程序使用的寄存器有冲突 在转入子程序前 特别是进行中断服务子程序时 要进行现场保护 保护内容 主程序使用的内部RAM内容 各工作寄存器内容 累加器A和DPTR以及PSW等寄存器内容 保护方式 将要保护的单元压入堆栈 上页 下页 回目录 中断保护时 还可以用RS1RS0来选择其他通用寄存器组 以便保护主程序现场 R0 R7 冲突 例如 十翻二子程序的现场保护 推入与弹出应按照 先进后出 或 后进先出 的顺序 上页 下页 回目录 三 子程序的调用及嵌套 1 子程序的调用 上页 下页 回目录 请阅读P144 使用LCALL或ACALL指令 主程序 上页 下页 回目录 请阅读P144 子程序 A37A30 0 0 A37 A36 A36 0 A26 A37 A16 A27 A06 A27 上页 下页 回目录 2 子程序的嵌套 子程序的嵌套 子程序中可调用其他子程序 上页 下页 回目录 子程序与主程序的概念是相对的 在一个子程序中又可调用其它子程序 这就是子程序的多重嵌套 多重嵌套的过程 PC0L PC0H PC1L PC1H PC2H PC2L 主程序 LCALLSUB1 继续主程序 PC0 断点入栈 LCALLSUB2 PC1 断点入栈 LCALLSUB3 PC2 断点入栈 RET 弹出断点 RET 弹出断点 RET 弹出断点 上页 下页 回目录 栈底 堆栈的设置是十分重要的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论