收藏 分享(赏)

微机原理与接口技术软件实验报告.doc

上传人:精品资料 文档编号:11035208 上传时间:2020-02-02 格式:DOC 页数:18 大小:290.77KB
下载 相关 举报
微机原理与接口技术软件实验报告.doc_第1页
第1页 / 共18页
微机原理与接口技术软件实验报告.doc_第2页
第2页 / 共18页
微机原理与接口技术软件实验报告.doc_第3页
第3页 / 共18页
微机原理与接口技术软件实验报告.doc_第4页
第4页 / 共18页
微机原理与接口技术软件实验报告.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、第一篇 软件实验实验一 存储器块操作实验一、实验目的1. 熟悉 KEIL 集成调试环境和汇编程序的调试方法。2. 掌握存储器读写方法;3. 了解内存块的移动方法;二、实验说明实验 1 指定某存储器的其实地址和长度,要求能将其内容赋值。通过该实验学生可以了解单片机读写存储器的方法,同时也可以了解单片机编程、调试方法。块移动是单片机常用操作之一,多用于大量的数据复制和图像操作。例程 2 给出起始地址,用地址加 1 方法移动块,将指定源地址和长度的存储块移到指定目标为起始地址的单元中去。移动 3000H 起始的 256 个字节到 4000H 起始的 256 个字节。三、实验内容1. 试编程将片内 R

2、AM 中的数据依次复制到片外 RAM。假设源数据区的首地址为 40H,目的数据区的首地址为 1000H,数据块长度为 10H。流程图:程序:ORG 0000hMOV 40H,#3HMOV 42H,#29HMOV 46H,#71HMOV 48H,#0ABHMOV 4CH,#1EHMOV 4FH,#0FFH ;输入若干数据方便测试MOV R0,#40HMOV DPTR,#1000HLOOP:MOV A,R0MOVX DPTR,AINC R0INC DPTRCJNE R0,#50H,LOOP ;判断是否出界SJMP $END运行结果:Memory 显示,片内 RAM 中 40H 开始数据为 03 0

3、0 29 00 00 00 71 00 AB 00 00 00 1E 00 00 FF,说明测试数据已经成功输入片内 RAM。从片外 RAM 中 1000H 位置开始记录为 03 00 29 00 00 00 71 00 AB 00 00 00 1E 00 00 FF,说明片内 RAM 从 40H 开始的数据已经成功复制到片外从 1000H 开始的地址。2. 两个 16 位无符号二进制数分别存放在片外 RAM 首址为 2000H 和 2002H 单元内,将它们相加,结果存入 RAM 30H(低 8 位) 、31H(高 8 位) 。程序(以 0506H+CDEFH 为例):ORG 0000HLJ

4、MP STARTORG 0030HSTART:MOV DPTR,#2000HMOV A,#05HMOVX DPTR,A ;将第一个数的高位赋给 2000H 单元INC DPTRMOV A,#06HMOVX DPTR,A ;将第一个数的低位赋给 2001H 单元INC DPTRMOV A,#0CDHMOVX DPTR,A ;将第二个数的高位赋给 2002H 单元INC DPTRMOV A,#0EFHMOVX DPTR,A ;将第二个数的低位赋给 2003H 单元MOV DPTR,#2001HMOVX A,DPTRMOV R0,AINC DPTRINC DPTRMOVX A,DPTRCLR CAD

5、DC A,R0MOV 30H,A ;将运算结果的低位存入片内地址为 30H 的单元MOV DPTR,#2000HMOVX A,DPTRMOV R0,AINC DPTRINC DPTRMOVX A,DPTRADDC A,R0MOV 31H,A ;将运算结果的高位存入片内地址为 31H 的单元END程序运行结果:0506H 和 CDEFH 已存入片外单元,运算结果 D2F5 已存入 30H 和 31H 中。四、思考题1. 如何将存储块的内容置成某固定值(例全填充为 0FFH)? 请用户修改程序,完成此操作。答:将源程序中的 MOV A, #01H 改为 MOV A,#0FFH 即可。2. 若源块地

6、址和目标地址有重叠,该如何避免?答: 先执行一次数据转移操作将源块地址中的数据先暂存入一块地址与目标地址和源块地址均不重叠的存储区,再执行一次数据转移操作将暂存区的数据移入目标地址区域。五、心得体会本次实验我学会了数据块的移动和赋值。片内数据的移动和计算比较简便,涉及到片外数据的计算时要增加移动到片内的步骤。当数据需要进行保护时可以设定数据暂存区。本实验微机原理的第一个实验,刚开始编程时有一点困难。我体会到了汇编语言的特点。与其他语言相比,它不仅要求良好的逻辑能力,而且要求编程者有较好的硬件知识。比如本次实验中,一开始我的编译一直报错,原来是将 MOVX A,DPTR 指令错写成了 MOV A

7、,DPTR。MOV 指令用于内部 RAM 数据传送,而 MOV 用于外部数据传送。我体会到只有充分了解单片机的硬件结构,才能使用正确的指令,让编程正确无误的进行。这也是我今后要加强学习的重点。实验二 数值转换实验一、 实验目的1、 熟悉 Keil 集成调试环境和汇编程序的调试方法。2、 掌握简单的数值转换算法。3、 基本了解数值的各种表达方法。4、 掌握数值的加减法运算。5、 掌握用查表的方法将 BCD 值转换成 ASCII 值。二、实验说明单片机系统内部运算用二进制,而输入输出常用十进制,以符合日常习惯,因此数制转换是仪表设计中常用的程序之一。单片机中的数值有各种表达方式,这是单片机的基础。

8、掌握各种数制之间的转换是一种基本功。三、实验内容1. 把 R 中的 8 位二进制数转换成压缩 BCD 码,存放在 中。3 45R流程图:程序:ORG 0000HMOV R3,#123MOV A,R3MOV B,#100DIV ABMOV R4,AMOV A,BMOV B,#10DIV ABswap A %十位数字转移到高 4 位ADD A,B %组合压缩 BCDMOV R5,ASJMP $END从寄存器中 R4、R5 的记录可以知道,输入的源数据 123 被分解成 01H 和 23H分别储存在 R4、R5 ,程序运行成功。2. 设 4 位 BCD 码 abcd 依次存放在内部 RAM 中 50

9、H53H 单元的低 4 位, (高 4 位为 0) 。试编程将其转换为二进制数并存入 R6R7 中。方法思路:1)计算 1000a,高位存入 30H,低位存入 31H2)计算 100c,高位存入 32H,低位存入 33H3)计算 10b,结果存入 52H4)计算 1000a+100c,高位存入 R0,低位存入 R15)计算 10b+d,结果存入 R26)计算 R1+R2,结果存入 R7;计算 R0+C,结果存入 R6.ORG 0000HLJMP STARTORG 0100HSTART: MOV 50H,#09HMOV 51H,#08HMOV 52H,#07HMOV 53H,#06H ;给 4

10、位 BCD 码数赋值MOV A,50HMOV B,#10 ; 计算 1000a,由于 1000 会溢出,所以分两次计算MUL ABMOV B,#100MUL ABMOV 30H,BMOV 31H,A ;把结果高位存入 31H,把低位存入 32HMOV A,51HMOV B,#100MUL ABMOV 32H,BMOV 33H,A ;计算 100b,并把高位存入 32H,低位存入 33HMOV A,52HMOV B,#10MUL ABMOV 52H,A ;计算 10c,结果仍存入 52HCLR CMOV A,31HADD A,33HMOV R1,AMOV A,30HADDC A,32HMOV R

11、0,A ;1000a+100b,结果高位存入 R0,低位存入 R1CLR CMOV A,52HADD A,53HMOV R2,A ;计算 10c+d,结果存入 R2CLR CMOV A,R1ADD A,R2MOV R7,AMOV A,R0ADDC A,#0MOV R6,A ;计算 1000a+100b+10c+d,结果高位存入 R6,低位存入 R7运行结果:可知运行结果是 2694H,与 9876BCD 转化成二进制码的结果一致,所以程序正确。四、思考题BCD 码转换成二进制的算法是什么?例如:(91)BCD 对应的二进制数是多少?答:对于一个 8 位 BCD 码,高四位*10+低四位即为二进

12、制。如(91)BCD=1001B*1010B+0001B=01011011B五、心得体会经过本实验,我对 BCD 码和二进制、十进制码之间的相互关系进行了更深一步的了解,学会了单片机这几种数制之间的相互转化。我深刻体会到,在运算中要注意单片机中数字溢出的问题。如在实验 2 中,计算 1000*a,不能直接使用语句 MOV A,#1000 语句,因为无符号 8 位二进制数的表示范围只有 0255。所以将 1000 拆成 100*10,与 a 相乘两次。至于先乘 100 还是 10,考虑到 BCD 码,a 的最大值是 9,与 10相乘不会产生进位,比较方便第二次与 100 相乘时的程序书写。如果与

13、 100 相乘可能会出现结果大于255,程序编写比较复杂。以上思考分析过程需要对各种数制的特点非常了解,这也是一名工程人员的基本要求。实验三 程序跳转表实验一、实验目的1、熟悉 KEIL 集成调试环境和汇编程序的方法。2、了解简单的函数计算。3、掌握多分支结构程序的编程方法。二、实验说明多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号指向相应的功能,完成指定操作。若给出调用号来调用子程序,一般用查表法,查到子程序的地址,转到相应子程序。三、实验内容流程图如下:ORG 0000HLJMP STARTORG 0200HSTART: MOV R0,#44 ;将 x 存于 R0,赋值可

14、更改,x 分别取 0,-71 ,重复实验两次MOV A,R0JZ ZERO ;若 x=0,则转向 ZEROJNB ACC.7,POS ;若 x0,则转向 POSNEG: CPL A ;取 A 的相反数INC A ;加 1 得到与 x 值绝对值相等的正数MOV B,#2DIV AB CPL ACC.7 ;将计算结果取反SJMP DONE POS: MOV B,#2MUL ABSJMP DONEZERO:MOV A,#2DONE:MOV 31H,A ;将 y 值存在 31HEND运行结果:(1 )当 x=44 时,y=88=58H(2 )当 x=0 时, y=0(3 )当 x=-127 时,计算机

15、内部以补码表示, (-127)补码 =81H。y=-63,输出以原码表示,(-63)=BFH四、思考题1. 写跳转程序时要注意些什么?1)给每个子程序赋一个名字,实际是一个入口地址的代号。2)要能正确地传递参数。即首先要有入口条件,用来说明进入子程序时,它所要处理的数据如何得到(比如,是把它放在 ACC 中,还是放在某工作寄存器中等) 。另外,要有出口条件,即处理的结果是如何存放的。3)注意保护现场和恢复现场。在执行子程序时,可能要使用累加器或某些工作寄存器。而调用子程序之前,这些寄存器中可能存放有主程序的中间结果,这些中间结果是不允许破坏的。因此,在子程序使用累加器和这些工作寄存器之前,需要

16、将其中的内容保存起来,即保护现场。当子程序执行完,即将返回主程序之前,再将这些内容取出,送回累加器或原来的工作寄存器,这一过程成为“保护现场” 。4)为了使子程序具有一定的通用性,子程序中的操作对象应尽量采用地址或寄存器形式而不用立即数形式。另外,子程序中如含有转移指令,应尽量采用相对转移指令;以便它不管存放在内存的哪个区域都能正确执行。2. 跳转的作用有哪些?1)是程序简化,增加可读性和修改性2)减少一些重复程序的编写,节约内存。实验四 数据排序实验一、实验目的1、熟悉 KEIL 集成调试环境和汇编程序的调试方法。2、掌握排序程序的设计方法。二、实验说明本例程采用交换排序法将内部 RAM 中

17、的 5059H 单元中的 10 个单字节无符号二进制按从小到大的次序排列,并将这一列排序后的数据从小到大依次存储在外部 RAM1000H 的开始处。三、实验源程序ORG 0000HJMP MAINORG 0100HMAIN:MOV R0,#50HMOV R0,#5FHINC R0MOV R0,#56HINC R0MOV R0,#5AHINC R0MOV R0,#5EHINC R0MOV R0,#51HINC R0MOV R0,#5BHINC R0MOV R0,#53HINC R0MOV R0,#58HINC R0MOV R0,#57HINC R0MOV R0,#55H ;将 10 个随机数送入

18、内部 RAM 的 5059 单元NOP ;可在此处设置断点,观察原始数据情况ACALL QUE ;调用排序子程序OUT: MOV R0,#50HMOV DPTR,#1000HMOV R7,#10OUT1: MOV A,R0MOVX DPTR,AINC R0INC DPTRDJNZ R7,OUT1HERE: AJMP HERENOP ;可在此处设置断点观察最终数据排序情况QUE: MOV R1,#50HMOV R6,#09HI3: MOV A,R6MOV R7,AMOV A,R1MOV R0,AMOV A,R0I2: INC R0MOV R2,ASUBB A,R0MOV A,R2JC I1 XC

19、H A,R0 I1: DJNZ R7,I2 MOV R1,ANOP ;可在此处设置断点,观察每次数据排序情况INC R1DJNZ R6,I3RETEND原始数据情况:第一次排序结果:第二次排序结果:第三次排序结果第四次排序结果第五次排序结果:第六次排序结果:第七次排序结果:第八次排序结果:第九次排序结果:外部 RAM1000H 处开始的数据情况:四、实验任务画出本实验程序的流程图。答:见本实验的最后一页。五、心得体会本实验是一个冒泡法的数据排序程序。主要思想是从 a0开始,依次与后面的元素比较,若 a0ai,则交换它们,一直比较到 an。小的数字就像气泡一样往前冒。程序循环多的时候,使用子程序

20、就很方便。不仅增加了程序的可读性,而且也节省了内存的空间。当程序比较复杂,调试程序时,可以在程序中设置相应的断点。Keil 软件设置断点的方式十分简单,只要在单击相关语句即可,因此是一种简单高校的调试方法。开始将 10 个随机数据送入5059 单元初始化被比较单元 R1设置循环轮数 R6设置 R1=R0R0 指向下一单元R1R2交换R1 和R2R7=0设置一轮排序内的比较次数 R7R1 指向下一单元R6=0将排序好的数据复制到片外 1000H1009H结束YNYNYN实验五 键盘显示仿真实验一、 实验目的1、 熟悉 Keil 集成调试环境和汇编程序的调试方法。2、 学习使用外围接口工具调试程序

21、。3、 熟悉键盘显示接口电路及程序设计。二、 实验要求三、实验内容根据键盘、LED 仿真板,设计一个走马灯程序通过按键启停。主程序是一个循环点灯程序,其流程图如下所示。按键启停功能由外部中断口 p3.2 完成。触发方式为低电平触发。当按键按下时,将一个 0 信号送入 P1 口,于是灯灭。中断处理程序的流程图如下:ORG 0000HLJMP MAINORG 0003HLJMP SUB1 ;转 T0 中断服务程序入口ORG 0030HMAIN:MOV IE,#10001001B ;cpu 开中断,外部中断 0 开中断MOV A,#1Hloop:RL A ;循环左移MOV p1,AMOV R2,#0

22、H BESTAGAIN: MOV R1,#0HNEXTAGAIN: MOV R0,#0HAGAIN:NOP NOPNOP ;延时INC R0CJNE R0,#100,AGAININC R1CJNE R1,#100,NEXTAGAININC R2CJNE R2,#100,BESTAGAINLJMP loopSUB1:PUSH ACC ;中断服务子程序MOV A,#0MOV P1,ANOPNOPNOPNOPPOP ACCRETIEND当无键按下时,8 盏灯向左循环点亮,中断寄存器状态全为 0.当按下 P3.2 口,可见外部中断 0 相关寄存器状态置 1,同时灯全灭。所以用按键控制灯的亮灭的走马灯设计成功。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报