MCS51程序设计及实用子程序.ppt

上传人:san****019 文档编号:19955144 上传时间:2021-01-18 格式:PPT 页数:47 大小:737.10KB
收藏 版权申诉 举报 下载
MCS51程序设计及实用子程序.ppt_第1页
第1页 / 共47页
MCS51程序设计及实用子程序.ppt_第2页
第2页 / 共47页
MCS51程序设计及实用子程序.ppt_第3页
第3页 / 共47页
资源描述:

《MCS51程序设计及实用子程序.ppt》由会员分享,可在线阅读,更多相关《MCS51程序设计及实用子程序.ppt(47页珍藏版)》请在装配图网上搜索。

1、第十四章 MCS-51程序设计及实用子程序 14.1 查表程序设计 14.2 数据极值查找和数据排序 14.3 散转程序设计 14.4 循环程序设计 14.5 定点数运算程序设计 14.6 数据的拆拼 14.7 码制转换 14.1 查表程序设计 查表程序 是一种常用的非数值运算程序 , 应用广泛 。 方法: 该方法把事先计算的结果或实验数据按一定顺序编 成表格 , 存于程序存储器内 , 然后根据输入参数值 , 从表 中取得结果 。 用途: 复杂代码转换显示 数据补偿:传感器补偿 复杂函数计算: Y=SIN(X) 特点: 具有 程序简单 、 执行速度快 、 精度高 等优点 , 而这 正是单片机在

2、测控场合或智能化仪表中所需要的 。 一、以 DPTR为基地址的查表程序 MOVC A, A+DPTR 操作步骤: 初始化 DPTR: 将表格的首地址放入 DPTR中 , 作为基地址 。 初始化 A: A中应该放所要查询的数据在表格中 的顺序号 。 执行结果 : 在执行该指令后 , A中存放的是在表 格中查到的数据 。 注意事项 在查询表格时 , 若所要查询的数据是 双字节 的 , 则在初始化 A中的数应为顺序号的 2倍 , 且应执行 两次本指令 。 对于单字节表格而言 , 表项的个数应不大于 256个 , 若大于 256时 , 则应适当修改 DPTR的值 。 表格的存放位置 。 表格可以设在

3、64K程存的任何 位置 。 二、以 PC为基地址的查表指令 MOVC A, A+PC 操作步骤: 用传送指令把所查数据在表格中顺序号送入累加器 A; 使用 ADD A, #data指令对累加器 A进行修正 , data值由 下式确定: data=数据表格首地址 PC当前值 实际上 data值等于查表指令和数据表格之间的字节数; 执行指令完成查表 , 结果存放在 A中 。 注意事项 对于双字节表格 , 其处理方法与以 DPTR为基地 址的情况相同 。 对于单字节表格而言 , 其项数应不大于 256。 对于双字节表格而言 , 其项数应不大于 128。 三、两种方式的比较 PC仅能对所谓本地表格操作

4、 , 即表格项数不得大 于 256, 且偏移量可能随程序的变化而变化 , 计算 较为麻烦 , 其优点是少用寄存器 。 DPTR使用起来非常灵活 , 表项数不受限制 , 且表 格可以放在 64K的任意地方 。 规则表 X的值为: 0, 1, 2, 3, , n Y的值为: y0,y1,y2,y3, , yn y0,y1,。 yn的字节长度一样 , 这种表格比 较简单 , 可由 y值按顺序构成表格 。 查表方法: MOVC A, A+PC MOVC A, A+DPTR 四、表格形式 例: 设有一个巡回检测报警装置 , 需对 16路输入值进行比 较 , 当每一路输入值等于或超过该路的报警值时 , 实

5、现报警 。 设 Xi为路数 , 查表时 Xi按 0,1,2, ,15(i=15)取数 , 表中 报警值是 2字节数 , 依 Xi顺序列成表格放在 TAB中 。 进入查表程 序前 , 路数 Xi放在 R2中 , 其输入值存于 (R1R0)当中 , 查表结 果放在 (R4R3)中 。 若需报警 , 将 P1.0口置 1, 否则清 0。 报警值的单元地址 =表格首地址 +( Xi*2) 查表程序清单(方法 1) TB1: MOV A, R2 ADD A, R2 ; A 路数 Xi*2 MOV R4, A ;保存 ADD A, #06H ; MOVC A, A+PC ; 1 XCH A, R4 ; 1

6、 ADD A, #03H ; 2 MOVC A, A+PC ; 1 MOV R3, A ; 1 RET ; 1 TAB1: DW 05F0H, 0E89H, 0A695H, 1EAAH DW 0D9BH, 7F93H, 0373H, 26D7H DW 2710H, 9E3FH, 1A66H, 22E3H DW 1174H, 16EFH, 33E4H, 6CA0H 查表程序清单(方法 2) ORG 1000H TB1: MOV DPTR, #TAB1 ; DPTR 表格首地址 MOV A, R2 ADD A, R2 ; A 路数 Xi*2 MOV R4, A MOVC A, A+DPTR ;取出

7、高字节 XCH R4, A ; R4 高字节 INC DPTR MOVC A, A+DPTR ;取出低字节 MOV R3, A ; R3 低字节 CLR C MOV A, R0 ;当前输入值与报警值比较 SUBB A, R3 ;低字节相减 MOV A, R1 SUBB A, R4 ;高字节相减 JNC LOOP ; (C)=0,转移,报警 CLR P1.0 RET 查表程序清单(方法 2)续 LOOP: SETB P1.0 RET ORG 2000H TAB1: DW 05F0H, 0E89H, 0A695H, 1EAAH DW 0D9BH, 7F93H, 0373H, 26D7H DW 27

8、10H, 9E3FH, 1A66H, 22E3H DW 1174H, 16EFH, 33E4H, 6CA0H 14.2 数据极值查找和数据排序 定义: 数据极值查找就是在指定的数据区中找出最 大值或最小值。 方法: 比较交换法。 数据极值查找 例 :从内存 BLOCK单元开始有一个无符号数的数据块, 块长度为 LEN,试找出数据块中最大值,并存入 MAX单元。 ORG 2000H LEN DATA 20H MAX DATA 22H MOV MAX, #00H ; MAX单元清零 MOV R0, #BLOCK ;数据块首地址送 R0 LOOP: MOV A, R0 CJNE A, MAX, NE

9、XT1;比较 NEXT1: JC NEXT ;若 (A)(MAX),交换 NEXT: INC R0 DJNZ LEN, LOOP ;若未完,转 LOOP SJMP $ END 数据排序 例: 编写无符号数排序程序 。 假设在片内 RAM中 , 起始地址为 40H的 10个单元 中存放有 10个无符号数 。 试进行升序排序 。 定义: 数据排序是将指定数据区中的数据按升序或 降序排列 。 方法: 冒泡排序法 解: R7: 比较次数计数器 , 初始值为 09H 位地址 00H: 数据互换的标志位 若 (00H) =0, 无互换发生 , 排序完毕 。 (00H) =1, 有互换发生 。 开 始 数

10、据 区 首 地 址 R 0 比 较 次 数 R 7 清 交 换 标 志 取 前 一 个 操 作 数 取 后 一 个 操 作 数 前 数 256,则加进位 NADD: MOV R3, A MOVC A, A+DPTR ;查转移地址高 8位 XCH A, R3 INC A MOVC A, A+DPTR ;查转移地址低 8位 MOV DPL, A MOV DPH, R3 ;将转移地址赋给 DPTR CLR A JMP A+DPTR ;实现散转 程序清单 TAB4: DW PRG0 ;低位字节在高地址 DW PRG1 DW PRG2 DW PRGn 程序清单 (续 ) 本例的散转范围为 64K, 但散

11、转数 n应小于 256 (R7为 8位 )。 可以通过双字节加法运算修改 DPTR的方法来使散转点大于 256 个 。 四、利用“ RET” 指令实现的散转程序 本方法的 关键 在于将处理子程序的目的地址压 入椎栈 , 然后通过 “ RET”指令来将目的地址弹 出到 PC中 , 从而实现程序转移 。 即利用 RET指令 来代替两个 POP指令 。 例: 要求根据 R7的内容转向各处处理程序 , 设各处 理程序的转向地址分别为 PRG0, PRG1, , PRGn JUMP5: MOV DPTR, #TAB5 MOV A, R7 ADD A, R7 ; A(R7*2) JNC NADD INC

12、DPH NADD: MOV R3, A MOVC A, A+DPTR ;查高位地址 XCH A, R3 INC A MOVC A, A+DPTR PUSH ACC ;低位地址 PUSH 03H ; PUSH R3高位地址 RET ;转向地址 PC,转移 TAB5: DW PRG0 ;转移地址表 DW PRG1 DW PRGn 程序清单 14.4 循环程序设计 包含多次重复执行的程序段,循环结构使程序紧凑 。 循环程序的构成 及各个环节任务: 初始化部分 循环准备工作。如:清结果单元、 设指针、设循环控制变量初值等 循环体 循环工作部分:需多次重复处理 的工作 循环控制部分: 1.修改指针和循环

13、控制变量。 2.检测循环条件:满足循环条件,继续循环,否则退出循环。 结束部分 处理和保存循环结果。 循环控制 ? 循环工作 循环结束 循环初始化 Y N 单重循环: 循环体中不套循环。 例: 求 n个单字节数据的累加 , 设数据串已在 43H起始单 元 , 数据串长度在 42H单元 , 累加和不超过 2个字节 。 片内 R A M X n 43H X1 42H n 41H S U M H 40H S U M L SUM: MOV R0, #42H ;设地址指针 MOV A, R0 MOV R7, A ;循环计数器 n CLR A ;结果单元清 0 MOV R3, A ADD1: INC R0

14、 ;修改指针 ADD A, R0 ;累加 JNC NEXT ;处理进位 INC R3 ;有进位,高字节加 1 NEXT: DJNZ R7,ADD1 ;循环控制:数据是否加完? MOV 40H, A ;循环结束,保存结果 MOV 41H, R3 RET 多重循环: 循环体中套循环结构。 内循环控制 ? 循环工作 循环结束 外循环控制 ? 内循环初始化 开始 外循环初始化 例: 延时程序设计 DELAY: MOV R7, #200 ; 1个机器周期 DE1: MOV R6, #123 ; 1 200 NOP ; 1 200 DE2: DJNZ R6, DE2 ; 2 123 200 DJNZ R7

15、, DE1 ; 2 200 RET ; 2 如晶体振荡器频率为 12MHz,则其 延时时间 为: 1+(1+1+2 123+2) 200+2=50.003ms 这是一个 50ms的精确延时程序。 14.5 运算程序设计 一、多字节加法 例: 设有两个 4字节的二进制数 2F5BA7C3H和 14DF35B8H, 分 别放在以 40H和 50H为起始地址的单元中 ( 低位在低地址 ) , 试编程求这个数之和 , 结果放在以 40H为起始地址的单元中 。 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R0, #40H MOV R1, #50H MOV R7, #0

16、4H LCALL JASUB LJMP $ 以上为主程序 JASUB: CLR C JASUB1: MOV A, R0 ADDC A, R1 MOV R0,A INC R0 INC R1 DJNZ R7,JASUB1 RET END ADDC A, Rn ADDC A, direct ADDC A, Ri ADDC A, #data 多字节 BCD码加法 与多字节加法程序类似,但需在加法指令后加一条 十进制加法调整 指令。主程序与前面相同。 DADD: CLR C JAD1: MOV A, R0 ADDC A, R1 DA A MOV R0, A INC R0 INC R1 DJNZ R7,

17、JAD1 RET ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R0, #40H MOV R1, #50H MOV R7, #04H LCALL DADD LJMP $ 以上为主程序 二、多字节减法 多字节减法程序和多字节加法程序类似,只需将加法指令 换为 减法指令 即可。 例: 在 43H40H依次存放被减数 443ADD7BH;在 53H50H中 依次存放减数 14DF35B8H,试编程求二者之差。 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R0, #40H MOV R1, #50H MOV R7, #04H LCAL

18、L JIANSUB LJMP $ 以上为主程序 JIANSUB: CLR C JIAN1: MOV A, R0 SUBB A, R1 MOV R0, A INC R0 INC R1 DJNZ R7, JIAN1 RET END 此程序也可以推广到 N个字节的情况。 14.6 数据的拆拼 BBCD:MOV A, R0 ANL A, #0FH MOV R5, A MOV A, R0 ANL A, #0F0H SWAP A MOV R6, A RET 例: 转换前 R0中为压缩 BCD码 XY 程序清单: 0Y 0X 转换后 R6R5中为非压缩 BCD码 14.7 码制转换 在计算机内部 , 任何数

19、据都是以二进制的形式存 储 , 但是 , 当我们在作 I/O操作时 , 往往需要其它形式 的数据格式 , 如 ASCII码 、 BCD码 、 八进制数等 , 这就 需要做一些数据格式的互换操作 。 一、 ASCII码与二进制数的相互转换 二进制与 ASCII码的相互关系为: 数字 0 9对应的 ASCII码为 30H 39H,即加 30H 字母 A F对应的 ASCII码为 41H 46H,即加 37H (1)ASCII到二进制的转换 通过以上介绍的二者之间的关系,不难画出流程图: 开始 取操作数 清进位标志 减 30H 差 9? 转换正确 结束 减 07H Y 转换正确 N ASCTOHEX

20、: MOV A, R2 CLR C SUBB A, #30H CJNE A, #0AH, NEXT NEXT: JC TOK SUBB A, #07H TOK: MOV R2, A RET 例: 转换前 R2为 ASCII码 ,转换后 R2为二进制。 (2)二进制到 ASCII码 HEXTOASCII: MOV A, R2 ANL A, #0FH ;取低四位的二进制码 ADD A, #90H DA A ;若 (R2)9,则加 66H,且产生 Cy ADDC A, #40H DA A MOV R2, A RET 例: 转换前 R2为二进制,转换后 R2为 ASCII码。 当二进制数 0AH时 ,

21、加 30H即得相应的 ASCII,当二进 制数介于 0AH、 0FH之间(包括 0AH、 0FH),则加 37H即得 到相应的 ASCII。下例为另一算法。 9 0 4 0 + 1 3 0 9 0 6 6 1 1 3 7 4 0 6 0 例: 8位二进制转换成 BCD码。 BINBCD1: MOV B, #100 DIV AB ; (A)=百位数 MOV R0, A INC R0 MOV A, #10 XCH A, B DIV AB ; (A)=十位数, (B)=个位数 MOV R0, A INC R0 XCH A, B MOV R0, A RET 程序名: BINBCD1 功能: 0 FFH

22、内的二进制数转换为 BCD码 入口: A存要转换的二进制数 出口 : R0存放 BCD数 百、十、个位数的地址 二、二进制数到 BCD码的转换 子程序设计 1. 子程序入口用标号作为 子程序名 ; 2. 调用子程序之前设置好 堆栈 , 子程序 嵌套须考虑 堆栈容量 ; 3. 提供足够的 调用信息 , 如:子程序名 、 入口参数和出口参数等; 4. 用返回指令 RET结束子程序 , 并保证 堆栈栈顶为调用程序的返回地址 。 主程序 C A L L S C A L L S 子程序 S R E T 补充:子程序设计 子程序调用时的参数传递 入口参数: 调用子程序之前 , 需要传给子程序的参数 。 出

23、口参数: 子程序送回调用程序的结果参数 。 参数传递方式: 1. 寄存器 传送参数 2. 堆栈 传送参数 设计子程序应满足 通用性 的要求,不针对具体数据编程。 1. 通过寄存器传递参数 这种方法应用最为广泛 、 也最易使用 , 它 是在调用子程序之前 , 对需要使用的寄存器预 先修改后 , 再来调用子程序 。 例: 试编程对 30H39H单元清零 MAIN: MOV R0, #30H MOV R7, #0AH LCALL SUBRT SUBRT: MOV A, #00H RESU: MOV R0, A INC R0 DJNZ R7, RESU RET 二、通过椎栈传递参数 MAIN: MOV

24、 70H, #30H MOV 71H, #0AH PUSH 70H PUSH 71H LCALL SUBRT SUBRT:POP DPH POP DPL POP 07H ; R7 POP 00H ; R0 SUB1: MOV A, #00H LOOP: MOV R0, A INC R0 DJNZ R7, LOOP PUSH DPL PUSH DPH RET 对于简单程序而言 , 这种方法反而较笨 , 较 易引起混淆 。 例: 试编程对 30H39H单元清零 查表程序设计,注意表格的设计:规则变量表和非 规则变量表; 数据极值查找和数据排序; 散转程序设计:三种转移表的设计及转移范围; 循环程序设计; 定点数运算程序设计; 码制转换; 子程序设计:参数传递的两种方法。 本章总结 本 章 结 束

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

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

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


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