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

下载本文档

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

文档简介

第3章MCS 51单片机汇编语言程序设计 4 1伪指令 伪指令仅在汇编过程中起控制汇编作用 不是单片机可执行指令 无机器码 1 起点指令ORG 格式 ORG H 功能 给程序起始地址或数据块的起始地址赋值 例 用法 一般出现在每段源程序或数据块的开始一个源程序可多次出现ORG指令 首地址 首地址 2 结束命令END 格式 END 功能 汇编程序结束标志 是可选伪指令 附在一个源程序的结尾一个源程序只能出现一次END指令 3 定义字节命令DB 格式 功能 标号 DB字节常数或字符串 8位 定义字节的内容 汇编程序把DB定义的字节依次存入标号开始的存储单元 用法 有定义的内存单元地址 项或项表 例 伪指令ORG定义了TAB的起始地址为8000H 伪指令DB定义了8000H 8003单元的内容依次为 8000H 45H 8001H 49H 8002H 35H 8003H 41H 8004H 05H TAB TAB1 1 由ORG定义 2 跟在其他源程序之后 4 定义字命令DW 格式 功能 标号 DW字或字表 定义若干个字 双字节 例 ORG8000H TAB DW7234H 8AH 10 8000H 72H 8001H 34H 8002H 00H 8003H 8AH 8005H 0AH 汇编后 8004H 00H 5 定义空间命令DS 格式 功能 标号 DS数据或字符及表达式 例 8008H 30H 8009H 8AH 从指定单元地址开始 由数据或字符及表达式的值来定义应保留的单元数 备用 即 8000H 8007H单元保留备用 定义空间 6 等值命令EQU 格式 字符名称EQU数据或汇编符号 功能 将一个数据或汇编符号赋予标号段规定的字符名称 例 AA与R6等值 例 A10EQU10DELYEQU07EBHMOVA A10LCALLDELY A10 10 DELY 07EBH 转向入口地址07EBH 使用EQU指令 须先赋值后使用 不能反之 7 位地址符号命令BIT 格式 字符名称BIT位地址 功能 把位地址赋予标号段的字符名称 P1 0 P2 0赋予位地址字符名称A1 A2 在编程时可以直接把A1 A2当成位地址使用 程序设计语言 机器语言 汇编语言 高级语言 一 汇编语言和高级语言相比具有下列优点 专有特性 51单片机汇编语言程序设计 二 汇编语言程序设计的步骤 三 汇编语言程序的结构 3 3顺序程序设计 3 1编程将外部数据存储器的000EH和000FH单元的内容相交换 编程 对外部RAM访问只能用MOVX指令 地址则可由Ri或者DPTR给出 ORG0000HXCHA 20HMOVP2 0HMOVX R1 AMOVR0 0EHMOVA 20HMOVR1 0FHMOVX R0 AMOVXA R0SJMP MOV20H AENDMOVXA R1 3 2将片内数据存储器 31H 30H 中的16位数求补码后放回原单元 设计分析 先判断数据的正负 再根据正数的补码 原码 负数补码 原码取反 1 分别处理 ORG0000HMOV30H AMOVA 31HMOVA 31HJBACC 7 CPLLCPLASJMP ADDCA 0CPLL MOVA 30HORLA 80HCPLAMOV31H AADDA 1SJMP END 3 3查表程序 设变量放在片内RAM的20H单元 取值范围0 9 要求编写查表程序 查出变量的平方值 并放入片内RAM21H单元分析 对程序存储器查表采用MOVCA A DPTR实现表格定义也可用10进制数表示 如DB0 1 4 9 16ORG0000HMOVDPTR TAB2MOVA 20HMOVCA A DPTRMOV21H ASJMP TAB2 DB00H 01H 04H 09H 16H 25H 24H 31H 40H 51H 补 查表程序 MCS 51指令系统中有两条指令具有极强的查表功能 1 MOVCA A DPTR 作基址寄存器 作变址寄存器 长查表指令 寻址64KB 2 MOVCA A PC 作基址寄存器 作变址 短查表指令页内查表指令 指向表格首址 指向表格的第i项 第i项加变址调整值 例 一个十六进制数放在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 将内部RAM的20H单元中的8位无符号二进制数 转换为3位BCD码 并将结果存放在FIRST 百位 和SECOND 十位 个位 两个单元中 例3 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 05H 05H 50H 55H 02H FIRST SECOND 3 4分支程序设计 简单分支 测试标志位 N路分支 利用散转指令JMP A DPTR可转向任一处理程序 简单分支程序举例 多重分支 判断程序设置的条件 判断2个以上的条件 被称为复合条件 根据程序运行情况 可以有N种选择 3 5 在片内RAM中40H和41H单元有2个无符号数 编程比较这两个数的大小 并将大数存于内部RAM的GR单元 小数存于LE单元 如果两数相等 则分别送入GR和LE地址单元 分析 可采用CJNE指令 除相等比较外还可以通过CY标志位判断2个数的大小 GREQU30HLEEQU31HORG0000HLESS MOVLE AMOVA 40HMOVGR 41HCJNEA 41H NEQSJMP MOVGR AMOVLE ASJMP NEQ JCLESSMOVGR AMOVLE 41HSJMP 多重分支程序举例 3 6 设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 0 程序 0无实根 0有相同实根 0转TOW 有两个不同实根 3 5循环程序 循环程序 一些有规可循而又反复处理的问题 利用比较转移指令CJNE 减1不为 0 转移指令DJNZ等实现 例 3 7 在内部RAM30H 4FH连续32个单元中存放了单字节无符号数 求32个无符号数之和 并存入内部RAM51H 50H中 解 这是重复相加问题 要设置一些工作单元设 R0做加数地址指针 R7做循环次数计数器 R3做和数的高字节寄存器 程序的流程图如下 地址指针 循环次数计数器 流程图 N Y N Y A R0 A R3 1 R3 程序 取被加数 R0作加数地址指针 CY 0 和 256 则转 作加法 CY 1 加到高字节 修改R0指针 未完 重复加 存和数 初始化部分 循环体部分 结束部分 循环执行直到R7 0 循环控制 例 3 8 从外部RAMBLOCK单元开始有一无符号数数据块 数据块长度存入LEN单元 求出其中最大数存入MAX单元 为了方便进行比较 我们使用CY标志来判断两数的大小 使用B寄存器作比较与交换的寄存器 使用DPTR作外部RAM地址指针 解 这是一个基本搜索问题 采用两两比较法 取两者较大的数再与下一个数进行比较 若数据块长度LEN n则应比较n 1次 最后较大的数就是数据块中的最大数 程序的流程图如下 流程图 A中的数较大 较大数交换至A 恢复较大数 初始化工作单元 编程 定义长度计数单元 取数至A 0 CY 修改指针 暂存于B 取下一数 大者送A 若 A B 则恢复A 未完继续比较 存最大数 若用RET指令结尾则该程序可作子程序调用 作减法比较 RET 流程图 程序 实际延时 例 3 9 延时20ms子程序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 3 6位操作程序设计 例3 14 编写程序 实现图3 7逻辑运算电路功能 其中P1 1 P2 2分别是端口上的信息 TF0和IE1分别是定时器定时溢出标志和外部中断请求标志 25H 26H分别是两个位地址 运算结果由端口P1 3输出 图3 7硬件逻辑运算电路 START MOVC P2 2ORLC TF0MOVF0 CMOVC IE1ORLC 25HANLC F0ANLC 26HMOVP1 3 CSJMP 3 7子程序的设计及调用 一 子程序的概念 把能完成某种基本操作并具有相同操作的程序段单独编成子程序 如 函数 运算 代码转换 延时等 利用调用子程序指令 ACALL或LCALL 和从子程序返回指令RET 使用子程序的优点 不必重复书写同样的程序 提高编程效率 程序的逻辑结构简单 便于阅读 缩短了源程序和目标程序的长度 节省了存储器空间 使程序模块化 通用化 便于交流共享资源 便于按某种功能调试 二 调用子程序的要点 子程序开头的标号段必须有一个标志 该标志既是子程序的名字又是其入口地址 以便主程序调用 在主程序中利用指令ACALL或LCALL可转入子程序 该指令具有保护断点的功能 例如 调用延时子程序 LCALL ACALL DELY 子程序结尾必须使用一条从子程序返回指令RET 它具有恢复断点的功能 主程序 CALL断点 子程序 RET 1 子程序的结构 3 16用程序实现c a2 b2 设a b均小于10 a存放在31H单元 b存放在32H单元 把c存入34H和33H单元 以BCD码表示 主程序 ORG0000HMOVSP 3FHMOVA 31HLCALLSQRMOVR1 AMOVA 32HLCALLSQRADDA R1DAA MOV33H AMOVA 0ADDCA 0MOV34H ASJMP 子程序 ORG0100HSQR INCAMOVCA A PCRETTAB DB00H 01H 04H 09H 16H 25H 36H 49H 64H 81HEND 3 17 求两个无符号数据块中的最大值的乘积 数据块的首地址分别为60H和70H 每个数据块的第一个字节都存放数据块长度 结果放入5FH和5EH单元 分析 先分别求出每个数据块的最大值 然后求乘积 求最大值采用子程序调用 子程序入口参数是数据块首地址 放在R1中 出口参数为最大值 放在A中 主程序 ORG0000HMOVR1 60HACALLQMAXMOVB A MOVR1 70HACALLQMAXMULABMOV5EH AMOV5FH

温馨提示

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

评论

0/150

提交评论