收藏 分销(赏)

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

上传人:仙人****88 文档编号:9279142 上传时间:2025-03-19 格式:DOCX 页数:18 大小:290.77KB 下载积分:10 金币
下载 相关 举报
微机原理与接口技术软件实验报告.docx_第1页
第1页 / 共18页
微机原理与接口技术软件实验报告.docx_第2页
第2页 / 共18页


点击查看更多>>
资源描述
第一篇 软件实验 实验一 存储器块操作实验 一、实验目的 1. 熟悉KEIL集成调试环境和汇编程序的调试方法。 2. 掌握存储器读写方法; 3. 了解内存块的移动方法; 二、实验说明 实验1 指定某存储器的其实地址和长度,要求能将其内容赋值。通过该实验学生可以了解单片机读写存储器的方法,同时也可以了解单片机编程、调试方法。 块移动是单片机常用操作之一,多用于大量的数据复制和图像操作。例程2给出起始地址,用地址加1方法移动块,将指定源地址和长度的存储块移到指定目标为起始地址的单元中去。移动3000H起始的256个字节到4000H起始的256个字节。 三、实验内容 1. 试编程将片内RAM中的数据依次复制到片外RAM。假设源数据区的首地址为40H,目的数据区的首地址为1000H,数据块长度为10H。 流程图: 程序: ORG 0000h MOV 40H,#3H MOV 42H,#29H MOV 46H,#71H MOV 48H,#0ABH MOV 4CH,#1EH MOV 4FH,#0FFH ;输入若干数据方便测试 MOV R0,#40H MOV DPTR,#1000H LOOP: MOV A,@R0 MOVX @DPTR,A INC R0 INC DPTR CJNE R0,#50H,LOOP ;判断是否出界 SJMP $ END 运行结果: Memory显示,片内RAM中40H开始数据为03 00 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 0000H LJMP START ORG 0030H START:MOV DPTR,#2000H MOV A,#05H MOVX @DPTR,A ;将第一个数的高位赋给2000H单元 INC DPTR MOV A,#06H MOVX @DPTR,A ;将第一个数的低位赋给2001H单元 INC DPTR MOV A,#0CDH MOVX @DPTR,A ;将第二个数的高位赋给2002H单元 INC DPTR MOV A,#0EFH MOVX @DPTR,A ;将第二个数的低位赋给2003H单元 MOV DPTR,#2001H MOVX A,@DPTR MOV R0,A INC DPTR INC DPTR MOVX A,@DPTR CLR C ADDC A,R0 MOV 30H,A ;将运算结果的低位存入片内地址为30H的单元 MOV DPTR,#2000H MOVX A,@DPTR MOV R0,A INC DPTR INC DPTR MOVX A,@DPTR ADDC A,R0 MOV 31H,A ;将运算结果的高位存入片内地址为31H的单元 END 程序运行结果: 0506H和CDEFH已存入片外单元,运算结果D2F5已存入30H和31H中。 四、思考题 1. 如何将存储块的内容置成某固定值(例全填充为0FFH)?请用户修改程序,完成此操作。 答:将源程序中的MOV A, #01H 改为MOV A,#0FFH即可。 2. 若源块地址和目标地址有重叠,该如何避免? 答:先执行一次数据转移操作将源块地址中的数据先暂存入一块地址与目标地址和源块地址均不重叠的存储区,再执行一次数据转移操作将暂存区的数据移入目标地址区域。 五、心得体会 本次实验我学会了数据块的移动和赋值。片内数据的移动和计算比较简便,涉及到片外数据的计算时要增加移动到片内的步骤。当数据需要进行保护时可以设定数据暂存区。 本实验微机原理的第一个实验,刚开始编程时有一点困难。我体会到了汇编语言的特点。与其他语言相比,它不仅要求良好的逻辑能力,而且要求编程者有较好的硬件知识。比如本次实验中,一开始我的编译一直报错,原来是将MOVX A,@DPTR指令错写成了MOV A,@DPTR。MOV指令用于内部RAM数据传送,而MOV用于外部数据传送。我体会到只有充分了解单片机的硬件结构,才能使用正确的指令,让编程正确无误的进行。这也是我今后要加强学习的重点。 实验二 数值转换实验 一、 实验目的 1、 熟悉Keil集成调试环境和汇编程序的调试方法。 2、 掌握简单的数值转换算法。 3、 基本了解数值的各种表达方法。 4、 掌握数值的加减法运算。 5、 掌握用查表的方法将BCD值转换成ASCII值。 二、实验说明 单片机系统内部运算用二进制,而输入输出常用十进制,以符合日常习惯,因此数制转换是仪表设计中常用的程序之一。单片机中的数值有各种表达方式,这是单片机的基础。掌握各种数制之间的转换是一种基本功。 三、实验内容 1. 把R中的8位二进制数转换成压缩BCD 码,存放在中。 流程图: 程序: ORG 0000H MOV R3,#123 MOV A,R3 MOV B,#100 DIV AB MOV R4,A MOV A,B MOV B,#10 DIV AB swap A %十位数字转移到高4位 ADD A,B %组合压缩BCD MOV R5,A SJMP $ END 从寄存器中R4、R5的记录可以知道,输入的源数据123被分解成01H和23H分别储存在R4、R5,程序运行成功。 2. 设4位BCD码abcd依次存放在内部RAM中50H~53H单元的低4位,(高4位为0)。试编程将其转换为二进制数并存入R6R7中。 方法思路: 1)计算1000a,高位存入30H,低位存入31H 2)计算100c,高位存入32H,低位存入33H 3)计算10b,结果存入52H 4)计算1000a+100c,高位存入R0,低位存入R1 5)计算10b+d,结果存入R2 6)计算R1+R2,结果存入R7;计算R0+C,结果存入R6. ORG 0000H LJMP START ORG 0100H START: MOV 50H,#09H MOV 51H,#08H MOV 52H,#07H MOV 53H,#06H ;给4位BCD码数赋值 MOV A,50H MOV B,#10 ; 计算1000a,由于1000会溢出,所以分两次计算 MUL AB MOV B,#100 MUL AB MOV 30H,B MOV 31H,A ;把结果高位存入31H,把低位存入32H MOV A,51H MOV B,#100 MUL AB MOV 32H,B MOV 33H,A ;计算100b,并把高位存入32H,低位存入33H MOV A,52H MOV B,#10 MUL AB MOV 52H,A ;计算10c,结果仍存入52H CLR C MOV A,31H ADD A,33H MOV R1,A MOV A,30H ADDC A,32H MOV R0,A ;1000a+100b,结果高位存入R0,低位存入R1 CLR C MOV A,52H ADD A,53H MOV R2,A ;计算10c+d,结果存入R2 CLR C MOV A,R1 ADD A,R2 MOV R7,A MOV A,R0 ADDC A,#0 MOV R6,A ;计算1000a+100b+10c+d,结果高位存入R6,低位存入R7 运行结果: 可知运行结果是2694H,与9876BCD转化成二进制码的结果一致,所以程序正确。 四、思考题 BCD码转换成二进制的算法是什么?例如:(91)BCD对应的二进制数是多少? 答:对于一个8位BCD码,高四位*10+低四位即为二进制。如(91)BCD=1001B*1010B+0001B=01011011B 五、心得体会 经过本实验,我对BCD码和二进制、十进制码之间的相互关系进行了更深一步的了解,学会了单片机这几种数制之间的相互转化。我深刻体会到,在运算中要注意单片机中数字溢出的问题。如在实验2中,计算1000*a,不能直接使用语句MOV A,#1000语句,因为无符号8位二进制数的表示范围只有0~255。所以将1000拆成100*10,与a相乘两次。至于先乘100还是10,考虑到BCD码,a的最大值是9,与10相乘不会产生进位,比较方便第二次与100相乘时的程序书写。如果与100相乘可能会出现结果大于255,程序编写比较复杂。以上思考分析过程需要对各种数制的特点非常了解,这也是一名工程人员的基本要求。 实验三 程序跳转表实验 一、实验目的 1、熟悉KEIL集成调试环境和汇编程序的方法。 2、了解简单的函数计算。 3、掌握多分支结构程序的编程方法。 二、实验说明 多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号指向相应的功能,完成指定操作。若给出调用号来调用子程序,一般用查表法,查到子程序的地址,转到相应子程序。 三、实验内容 流程图如下: ORG 0000H LJMP START ORG 0200H START: MOV R0,#44 ;将x存于R0,赋值可更改,x分别取0,-71,重复实验两次 MOV A,R0 JZ ZERO ;若x=0,则转向ZERO JNB ACC.7,POS ;若x>0,则转向POS NEG: CPL A ;取A的相反数 INC A ;加1得到与x值绝对值相等的正数 MOV B,#2 DIV AB CPL ACC.7 ;将计算结果取反 SJMP DONE POS: MOV B,#2 MUL AB SJMP DONE ZERO:MOV A,#2 DONE:MOV 31H,A ;将y值存在31H END 运行结果: (1)当x=44时,y=88=58H (2)当x=0时,y=0 (3)当x=-127时,计算机内部以补码表示,(-127)补码=81H。y=-63,输出以原码表示,(-63)=BFH 四、思考题 1. 写跳转程序时要注意些什么? 1)给每个子程序赋一个名字,实际是一个入口地址的代号。 2)要能正确地传递参数。即首先要有入口条件,用来说明进入子程序时,它所要处理的数据如何得到(比如,是把它放在ACC中,还是放在某工作寄存器中等)。另外,要有出口条件,即处理的结果是如何存放的。 3)注意保护现场和恢复现场。在执行子程序时,可能要使用累加器或某些工作寄存器。而调用子程序之前,这些寄存器中可能存放有主程序的中间结果,这些中间结果是不允许破坏的。因此,在子程序使用累加器和这些工作寄存器之前,需要将其中的内容保存起来,即保护现场。当子程序执行完,即将返回主程序之前,再将这些内容取出,送回累加器或原来的工作寄存器,这一过程成为“保护现场”。 4)为了使子程序具有一定的通用性,子程序中的操作对象应尽量采用地址或寄存器形式而不用立即数形式。另外,子程序中如含有转移指令,应尽量采用相对转移指令;以便它不管存放在内存的哪个区域都能正确执行。 2. 跳转的作用有哪些? 1)是程序简化,增加可读性和修改性 2)减少一些重复程序的编写,节约内存。 实验四 数据排序实验 一、实验目的 1、熟悉KEIL集成调试环境和汇编程序的调试方法。 2、掌握排序程序的设计方法。 二、实验说明 本例程采用交换排序法将内部RAM中的50~59H单元中的10个单字节无符号二进制按从小到大的次序排列,并将这一列排序后的数据从小到大依次存储在外部RAM1000H的开始处。 三、实验源程序 ORG 0000H JMP MAIN ORG 0100H MAIN:MOV R0,#50H MOV @R0,#5FH INC R0 MOV @R0,#56H INC R0 MOV @R0,#5AH INC R0 MOV @R0,#5EH INC R0 MOV @R0,#51H INC R0 MOV @R0,#5BH INC R0 MOV @R0,#53H INC R0 MOV @R0,#58H INC R0 MOV @R0,#57H INC R0 MOV @R0,#55H ;将10个随机数送入内部RAM的50~59单元 NOP ;可在此处设置断点,观察原始数据情况 ACALL QUE ;调用排序子程序 OUT: MOV R0,#50H MOV DPTR,#1000H MOV R7,#10 OUT1: MOV A,@R0 MOVX @DPTR,A INC R0 INC DPTR DJNZ R7,OUT1 HERE: AJMP HERE NOP ;可在此处设置断点观察最终数据排序情况 QUE: MOV R1,#50H MOV R6,#09H I3: MOV A,R6 MOV R7,A MOV A,R1 MOV R0,A MOV A,@R0 I2: INC R0 MOV R2,A SUBB A,@R0 MOV A,R2 JC I1 XCH A,@R0 I1: DJNZ R7,I2 MOV @R1,A NOP ;可在此处设置断点,观察每次数据排序情况 INC R1 DJNZ R6,I3 RET END 原始数据情况: 第一次排序结果: 第二次排序结果: 第三次排序结果 第四次排序结果 第五次排序结果: 第六次排序结果: 第七次排序结果: 第八次排序结果: 第九次排序结果: 外部RAM1000H处开始的数据情况: 四、实验任务 画出本实验程序的流程图。 答:见本实验的最后一页。 五、心得体会 本实验是一个冒泡法的数据排序程序。主要思想是从a[0]开始,依次与后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。小的数字就像气泡一样往前冒。 程序循环多的时候,使用子程序就很方便。不仅增加了程序的可读性,而且也节省了内存的空间。 当程序比较复杂,调试程序时,可以在程序中设置相应的断点。Keil软件设置断点的方式十分简单,只要在单击相关语句即可,因此是一种简单高校的调试方法。 R1指向下一单元 设置一轮排序内的比较次数R7 交换@R1和@R2 R0指向下一单元 设置R1=R0 设置循环轮数R6 初始化被比较单元R1 将10个随机数据送入50~59单元 开始 Y N N Y N Y R7=0 @R1>@R2 结束 将排序好的数据复制到片外1000H~1009H R6=0 实验五 键盘显示仿真实验 一、 实验目的 1、 熟悉Keil集成调试环境和汇编程序的调试方法。 2、 学习使用外围接口工具调试程序。 3、 熟悉键盘显示接口电路及程序设计。 二、 实验要求 三、实验内容 根据键盘、LED仿真板,设计一个走马灯程序通过按键启停。 主程序是一个循环点灯程序,其流程图如下所示。按键启停功能由外部中断口p3.2完成。触发方式为低电平触发。当按键按下时,将一个0信号送入P1口,于是灯灭。 中断处理程序的流程图如下: ORG 0000H LJMP MAIN ORG 0003H LJMP SUB1 ;转T0中断服务程序入口 ORG 0030H MAIN: MOV IE,#10001001B ;cpu开中断,外部中断0开中断 MOV A,#1H loop: RL A ;循环左移 MOV p1,A MOV R2,#0H BESTAGAIN: MOV R1,#0H NEXTAGAIN: MOV R0,#0H AGAIN: NOP NOP NOP ;延时 INC R0 CJNE R0,#100,AGAIN INC R1 CJNE R1,#100,NEXTAGAIN INC R2 CJNE R2,#100,BESTAGAIN LJMP loop SUB1:PUSH ACC ;中断服务子程序 MOV A,#0 MOV P1,A NOP NOP NOP NOP POP ACC RETI END 当无键按下时,8盏灯向左循环点亮,中断寄存器状态全为0. 当按下P3.2口,可见外部中断0相关寄存器状态置1,同时灯全灭。 所以用按键控制灯的亮灭的走马灯设计成功。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服