已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
书名 单片机应用技术ISBN 978 7 111 30844 7作者 廖世海吴政江出版社 机械工业出版社本书配有电子课件 第3章汇编语言程序设计 廖世海制作 3 1计算机语言概述3 2汇编语言程序设计基础3 3汇编语言程序设计3 4汇编语言程序举例3 5基本技能训练 编程使P1 7输出1kHz的方波 第3章汇编语言程序设计 3 1计算机语言概述 3 1 1机器语言机器语言是直接用二进制代码 0 和 1 来表达计算机程序的指令和数据的原始语言 是早期为计算机编程使用的语言 是一种低级语言 特点 被计算机直接识别 能直接运行 缺点 机器语言书写不便 而且难以记忆 3 1 2汇编语言汇编语言是一种用缩写的英文词符号或数字符号代替机器的二进制指令进行编写的程序设计语言 也是面向机器的低级语言 汇编语言书写的指令与机器语言书写的指令是一一对应的 特点 记忆方便 不能直接运行 面向机器的 属于低级语言 缺点 不同厂家的MCU 指令系统不同 通用性不强 对程序员有较高的要求 3 1 3高级语言 高级语言是一种语法和结构更类似普通英文 独立于计算机硬件结构的通用的程序设计语言 比如C C VB PASCAL语言等 高级语言优点 接近算法语言 提供了结构化程序设计的环境和工具 使得设计出来的程序可读性好 可维护性强 可靠性高 远离机器语言 与具体的计算机硬件关系不大 程序可移植性好 代码重用率高 3 2汇编语言程序设计基础 3 2 1汇编语言格式MCS 51单片机的汇编语言的指令语句由4个部分组成 分别是标号 操作码 操作数和注释 在书写时 各部分严格用定界符加以分隔 其格式为 标号 名字 操作码 助记符 操作数 参数 注释 3 2 2汇编语言程序设计步骤 汇编语言程序设计过程是用汇编方式对指令序列进行正确合理组合编排 并调试完成形成一定功能的可执行程序的过程 为了完成这一过程 一般可以分为以下六个步骤 1 分析问题 2 确定符合计算机运算的算法 3 绘制程序流程图 4 存储器分配 5 根据流程图编写汇编语言程序 6 程序调试与修改 3 2 2汇编语言程序设计步骤 3 2 3汇编语言源程序的汇编汇编语言源程序的汇编过程就是将汇编语言的源程序转换成机器的二进制目标代码 汇编有两种方法 手工汇编 机器汇编 3 3汇编语言程序设计 汇编语言程序设计的基本结构通常有 顺序结构分支结构循环结构子程序任何复杂的程序都可由它们组合而成 3 3 1顺序程序设计 单片机程序的顺序结构是最简单的一种程序结构 这种程序中 没有任何分支转移指令 单片机执行这类程序时 是按照指令编写的先后顺序逐一完成的 拆字程序 例3 1 将30H的内容拆开 高位送31H低位 低位送32H低位 解 ORG0050HCWORD MOVA 30HSWAPAANLA 0FHMOV31H A 将 30H 高位存入 31H MOVA 30HANLA 0FHMOV32H A 将 30H 低位存入 32H END 3 3 2分支程序设计 分支程序是单片机利用条件转移指令实现转移的 其主要特点是程序的流向有两个或两个以上的出口 根据指定的条件进行选择确定 分支结构程序可根据程序要求无条件或有条件地改变程序执行的顺序 选择程序序流向 编写这类结构程序的关键是正确使用转移指令 即无条件转移 条件转移和散转 例3 2 设补码数x存放在30H单元之中 函数值y按下式进行赋值 Y MAIN MOVA 30HJZLOOP1JNBACC 7 LOOP2ADDA 5MOV30H ALOOP2 SJMP LOOP1 MOV30H 10HSJMP 程序流程图 3 3 3循环程序设计 循环结构的程序一般包括下面几个部分 1 置循环初值 2 循环体3 循环修改4 循环控制若循环程序的循环体中不再包括循环程序 即为单循环程序 如果在循环体中还包含循环程序 就称为循环嵌套 循环嵌套有二重 三重 甚至多重嵌套 例3 3 数据传送程序 将内部RAM40H单元开始的内容依次传送到外部RAM1000H单元开始的区域 直到遇到传送的内容是0为止 ORG2000HMOVR0 40H 指向数据首地址MOVDPTR 1000H 指向外部数据首地址MAIN MOVA R0 A R0 MOVX DPTR A DPTR ACJNEA 00H NEXTSJMPFINISH 若A 0 传送完成NEXT INCR0 修改地址指针INCDPTRAJMPMAIN 继续传送FINISH SJMP END 例3 4 使用软件延时的方法 设计一段延时时间约为1ms的延时子程序 假设单片机晶振频率fosc 12MHz 则机器周期Tcy 1 s DJNZR1 为2机器周期指令 一重循环最多耗时为255 2 s 510 s 要延时1ms 子程序为两层循环程序段 其对应的程序流程图如图所示 编程如下 延时子程序 RELAY MOVR0 02 外层循环次数为2次LOOP1 MOVR1 250 内层循环次数为250次DJNZR1 内层循环DJNZR0 LOOP1 外层循环RET 所谓子程序 是指能够完成一定功能 可以被其它程序段 相对而言 称为主程序 调用执行 并能返回调用程序处的程序段 子程序的调用可以嵌套进行 即子程序可以调用其它子程序 甚至可以调用自身 称为递归调用 3 3 4子程序设计 子程序在编写和调用时应注意以下几点 1 子程序结构要独立 2 现场保护和现场恢复现场保护和现场恢复一般是通过堆栈操作指令来完成的 例如 以下子程序就是通过堆栈操作指令来完成现场保护和现场恢复的 LP1 PUSHACC LP1为子程序的入口地址 将A的值压入堆栈进行保护PUSHPSW 将PSW的值压入堆栈进行保护PUSHB 将B的值压入堆栈进行保护 POPB 从堆栈中弹出B并恢复B的值POPPSW 从堆栈中弹出PSW并恢复PSW的值POPACC 从堆栈中弹出A并恢复A的值RET 返回 3 参数传递子程序可分为有参数子程序和无参数子程序 在有参子程序的调用与返回过程中 就需要在主程序和子程序之间进行参数的传递 子程序示例 例3 5 试编程 计算C A2 B2 并将C送内部RAM40H单元 设A B分别放在20H 21H内部单元中 且C 0FFH 解 由于要求两次平方 所以可以用子程序结构 其程序流程图如下图所示 子程序流程图 ORG0030HSTART MOVA 20HLCALLPF 调用求平方子程序MOVR1 A 20H赋值MOVA 21HLCALLPFADDA R1MOV40H ASJMP PF INCA 求平方子程序MOVCA A PCRETTAB DB0 1 4 9 16 25 36 49 64 81END 3 4汇编语言程序举例 3 4 1代码转换程序计算机中的数制较多 在实际应用中 常常需要将一种数制转换成另一种数制 数制之间的转换方法较多 不同数制之间的转换方法也不同 例3 6 将8位无符号二进制数转换为BCD数 设8位二进制数在R2中 BCD数存放到R1 百位 和R0 十位和个位 中 解 把8位二进制数分别除以100 10 分离出百位 十位和个位 并把百位存放到R1 把十位和个位组合后存放到R0中 程序如下 ORG2000HMOVA R2 将8位二进制数送A中MOVB 100 除数为100DIVAB A为百位 B为100以下的二进制数MOVR1 A 存百位BCD数MOVA 10 除数为10XCHA BDIVAB A为十位数 B为个位数SWAPAADDA B 十位 个位BCD数组合在一起MOVR0 A 存十位和个位BCD数END 例3 7 四位二进制数转换为ASCII代码 解 由二进制数和ASCII代码之间的对应关系可知 对于小于10的四位二进制数加30H得到相应的ASCII代码 对于大于等于10的四位二进制数加37H得到相应的ASCII代码 假设四位二进制数存放于R2中 转换后的ASCII代码也存于R2中 BINASC PUSHPSWMOVA R2 取四位二进制ANLA 0FH 屏蔽高四位PUSHACCCLRCSUBBA 0AHPOPACCJCLOOP 该数 10转到LOOPADDA 07HLOOP ADDA 30HMOVR2 A 转换后的ASCII码送R2中POPPSWRETEND 3 4 2算术运算程序进行多字节加 减运算时 应按照从低位字节向高位字节的顺序进行 高位字节运算时应考虑低位字节运算的进位或借位 例3 8 已知两个10字节的无符号数分别存放在以BLOCK1和BLOCK2为起始地址的存储区中 求两个数的和 并把结果存放在以BLOCK1为起始地址的存储区中 解 设R0 R1为地址指针 R0指向第一个加数 R1指向另一个加数 R2为循环计数器 初值为字节数10 编程如下 ORG0100HBLOCK1DATA20HBLOCK2DATA30HMOVR0 BLOCK1MOVR1 BLOCK2 设置两个地址指针MOVR2 10 设置循环计数器初值CLRC 进位标志初值为0LOOP MOVA R0 取被加数到AADDCA R1 加数与被加数相加并加低位进位 结果放A中MOV R0 A 存结果INCR0 指针指向被加数更高位INCR1 指针指向加数更高位DJNZR2 LOOP 未加完则继续CLRAADDCA 0 加最高位的进位MOV R0 A 保存最高位的进位SJMP END 3 4 3查找 排序程序1 查表程序查表操作可用DPTR的值或PC的值作基地址 用DPTR的值作基地址的查表步骤为 1 把表的首地址送到DPTR 2 把所查表的项数 即在表格中的地址是第几项 送入累加器A中 3 执行查表指令 MOVCA A DPTR查表的结果送入A中 用PC的值作基地址的查表步骤为 1 将查表的项数送入累加器A中 2 将MOVCA A PC指令的下一条指令到表格首地址的指令字节数与累加器A的值相加 3 执行查表指令 MOVCA A PC 查表的结果送入A中 例3 9 用查表法求Y X2 设X的值在R0中 X的取值范围为0 9 结果送R0中 解 用PC的值作基地址进行查表求解 程序如下 ORG0100HMOVA R0 1字节ADDA 03 2字节MOVCA A PC 1字节MOVR0 A 1字节SJMP 2字节TABLE DB0 1 4 9 16DB25 36 49 64 81END 2 查找程序数据极值查找是指在给定的数据区中选出最大值或最小值 从一批数据中寻找最大值或最小值的方法很多 最常用的方法是采用比较交换法 例3 10 数据极值查找程序 内部RAM30H单元开始存放了10个数 找出其中最大的数 解 题意分析 我们采用比较交换法来查找最大数 先指定一MAX单元 使第一个数存入MAX单元 然后把它和数据块中每一个数逐一比较 大的数存放在MAX单元 直到数据块中每个数都比较完 此时MAX单元中得到最大数 程序流程如图所示 源程序如下 数据极值查找程序流程图 ORG0100HMAXDATA50HMOVR0 30H 数据首址送R0MOVR2 10 数据长度送R2MOVMAX R0 读第一个数DECR2LOOP1 INCR0MOVA R0 读下一个数CJNEA MAX CHK 数值比较CHK JCLOOP2 MAX大转移MOVMAX A 大数送MAXLOOP2 DJNZR2 LOOP1 继续循环SJMP 停止END 3 数据排序程序 数据排序是将数据块中的数据按升序或降序排列 数据排序方法很多 常用的方法有冒泡法或沉降法 例3 11 片内RAM中数据块排序程序 内部RAM有一无符号数据块 工作寄存器R0指向数据块的首地址 其长度存放在R2中 请将数据块中的数据按从大到小顺序进行排列 排列后数据仍存放在原来位置 解 题意分析 数据排列程序常采用冒泡法 一次冒泡即找到数据块极小值放到数据块最后 再一次冒泡次小数排在倒数第二位置 多次冒泡实现降序排列 程序流程图如图所示 源程序如下 SORT MOVA R0MOVR1 A 把R0暂存到R1中MOVA R2MOVR5 A 把R2暂存到R5中SORT1 CLR00H 交换标志单元清0DECR5 个数减1MOVA R1SORT2 INCR1CLRCCJNEA R1 ABC 相邻的两个数比较ABC JNCNEXT 前者大 转移到NEXTSETB00H 否则 交换标志置位XCHA R1 两数交换 NEXT DECR1MOV R1 AINCR1MOVA R1DJNZR5 SORT2 没比较完 SORT2INCR0MOVR1 R0DECR2MOVR5 R2JB00H SORT1 交换标志为1 继续下一轮两两比较RETEND 3 5基本技能训练 编程使P1 7输出1kHz的方波 要求 1 开关闭合则P1 7输出方波 开关断开则P1 7不输出方波 2 输出方波的周期为1ms 用软件演延时的方法延时 1 任务分析用开关K控制程序的运行 当开关合上时 程序往下执行 延时0 5ms后给P1 7取反 输出方波 开关断开时 程序停留 根据题意要求 延时采用软件延时的方法 2 硬件电路设计在最小系统的基础上 增加一个控制按钮K 接在P3 2上 输出端P1 7接一个三极管放大 硬件电路图如图所示 方波产生电路硬件电路图 3 参考程序流程图 4 参考程序ORG0030HMAIN MOVP3 0FFHDENG JBP3 2 CPLP1 7ACALLDELAYSJMPDENGDELAY MOVR1 248 延时1 sDJNZR1 延时248 2 s 496 sNOP 延时1 sRET 延
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 面试氟化工艺专家技术深度与项目管理问题
- 广东省高中双休通知书
- 广州养殖场整改通知书
- 广州餐厅拆除公告通知书
- 广电网络停业整顿通知书
- 庐阳敲墙拆除公告通知书
- 店铺破产减员通知书
- 延吉冬天复课通知书
- 延寿刮风停电通知书
- 开封13中初中部通知书
- 设计公司培训合同范本
- 空调租赁合作协议合同
- 2025湖南怀化市市直企事业单位引进高层次及急需紧缺人才507人易考易错模拟试题(共500题)试卷后附参考答案
- 北京三帆中学2026届九年级物理第一学期期中经典试题含解析
- 岩棉板外墙保温专项施工方案
- 广东省建筑设计研究院集团股份有限公司校园招聘职位信息笔试历年参考题库附带答案详解
- 2025上海闵行区古美路街道招聘社区综合协管员18人备考考试题库附答案解析
- GB/T 46406-2025科研项目数据管理指南
- 白酒中的酸、醇、酯、醛
- 挂篮施工安全事故的案例课件
- 《动力气象学》全套教学课件
评论
0/150
提交评论