微机原理与接口技术软件实验报告.docx
《微机原理与接口技术软件实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术软件实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
微机原理与接口技术软件实验报告
第一篇软件实验
实验一存储器块操作实验
一、实验目的
1.熟悉KEIL集成调试环境和汇编程序的调试方法。
2.掌握存储器读写方法;
3.了解存块的移动方法;
二、实验说明
实验1指定某存储器的其实地址和长度,要求能将其容赋值。
通过该实验学生可以了解单片机读写存储器的方法,同时也可以了解单片机编程、调试方法。
块移动是单片机常用操作之一,多用于大量的数据复制和图像操作。
例程2给出起始地址,用地址加1方法移动块,将指定源地址和长度的存储块移到指定目标为起始地址的单元中去。
移动3000H起始的256个字节到4000H起始的256个字节。
三、实验容
1.试编程将片RAM中的数据依次复制到片外RAM。
假设源数据区的首地址为40H,目的数据区的首地址为1000H,数据块长度为10H。
流程图:
程序:
ORG0000h
MOV40H,#3H
MOV42H,#29H
MOV46H,#71H
MOV48H,#0ABH
MOV4CH,#1EH
MOV4FH,#0FFH;输入若干数据方便测试
MOVR0,#40H
MOVDPTR,#1000H
LOOP:
MOVA,@R0
MOVX@DPTR,A
INCR0
INCDPTR
CJNER0,#50H,LOOP;判断是否出界
SJMP$
END
运行结果:
Memory显示,片RAM中40H开始数据为0300290000007100AB0000001E0000FF,说明测试数据已经成功输入片RAM。
从片外RAM中1000H位置开始记录为0300290000007100AB0000001E0000FF,说明片RAM从40H开始的数据已经成功复制到片外从1000H开始的地址。
2.两个16位无符号二进制数分别存放在片外RAM首址为2000H和2002H单元,将它们相加,结果存入RAM30H(低8位)、31H(高8位)。
程序(以0506H+CDEFH为例):
ORG0000H
LJMPSTART
ORG0030H
START:
MOVDPTR,#2000H
MOVA,#05H
MOVX@DPTR,A;将第一个数的高位赋给2000H单元
INCDPTR
MOVA,#06H
MOVX@DPTR,A;将第一个数的低位赋给2001H单元
INCDPTR
MOVA,#0CDH
MOVX@DPTR,A;将第二个数的高位赋给2002H单元
INCDPTR
MOVA,#0EFH
MOVX@DPTR,A;将第二个数的低位赋给2003H单元
MOVDPTR,#2001H
MOVXA,@DPTR
MOVR0,A
INCDPTR
INCDPTR
MOVXA,@DPTR
CLRC
ADDCA,R0
MOV30H,A;将运算结果的低位存入片地址为30H的单元
MOVDPTR,#2000H
MOVXA,@DPTR
MOVR0,A
INCDPTR
INCDPTR
MOVXA,@DPTR
ADDCA,R0
MOV31H,A;将运算结果的高位存入片地址为31H的单元
END
程序运行结果:
0506H和CDEFH已存入片外单元,运算结果D2F5已存入30H和31H中。
四、思考题
1.如何将存储块的容置成某固定值(例全填充为0FFH)?
请用户修改程序,完成此操作。
答:
将源程序中的MOVA,#01H改为MOVA,#0FFH即可。
2.若源块地址和目标地址有重叠,该如何避免?
答:
先执行一次数据转移操作将源块地址中的数据先暂存入一块地址与目标地址和源块地址均不重叠的存储区,再执行一次数据转移操作将暂存区的数据移入目标地址区域。
五、心得体会
本次实验我学会了数据块的移动和赋值。
片数据的移动和计算比较简便,涉及到片外数据的计算时要增加移动到片的步骤。
当数据需要进行保护时可以设定数据暂存区。
本实验微机原理的第一个实验,刚开始编程时有一点困难。
我体会到了汇编语言的特点。
与其他语言相比,它不仅要求良好的逻辑能力,而且要求编程者有较好的硬件知识。
比如本次实验中,一开始我的编译一直报错,原来是将MOVXA,@DPTR指令错写成了MOVA,@DPTR。
MOV指令用于部RAM数据传送,而MOV用于外部数据传送。
我体会到只有充分了解单片机的硬件结构,才能使用正确的指令,让编程正确无误的进行。
这也是我今后要加强学习的重点。
实验二数值转换实验
一、实验目的
1、熟悉Keil集成调试环境和汇编程序的调试方法。
2、掌握简单的数值转换算法。
3、基本了解数值的各种表达方法。
4、掌握数值的加减法运算。
5、掌握用查表的方法将BCD值转换成ASCII值。
二、实验说明
单片机系统部运算用二进制,而输入输出常用十进制,以符合日常习惯,因此数制转换是仪表设计中常用的程序之一。
单片机中的数值有各种表达方式,这是单片机的基础。
掌握各种数制之间的转换是一种基本功。
三、实验容
1.把R
中的8位二进制数转换成压缩BCD码,存放在
中。
流程图:
程序:
ORG0000H
MOVR3,#123
MOVA,R3
MOVB,#100
DIVAB
MOVR4,A
MOVA,B
MOVB,#10
DIVAB
swapA%十位数字转移到高4位
ADDA,B%组合压缩BCD
MOVR5,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.
ORG0000H
LJMPSTART
ORG0100H
START:
MOV50H,#09H
MOV51H,#08H
MOV52H,#07H
MOV53H,#06H;给4位BCD码数赋值
MOVA,50H
MOVB,#10;计算1000a,由于1000会溢出,所以分两次计算
MULAB
MOVB,#100
MULAB
MOV30H,B
MOV31H,A;把结果高位存入31H,把低位存入32H
MOVA,51H
MOVB,#100
MULAB
MOV32H,B
MOV33H,A;计算100b,并把高位存入32H,低位存入33H
MOVA,52H
MOVB,#10
MULAB
MOV52H,A;计算10c,结果仍存入52H
CLRC
MOVA,31H
ADDA,33H
MOVR1,A
MOVA,30H
ADDCA,32H
MOVR0,A;1000a+100b,结果高位存入R0,低位存入R1
CLRC
MOVA,52H
ADDA,53H
MOVR2,A;计算10c+d,结果存入R2
CLRC
MOVA,R1
ADDA,R2
MOVR7,A
MOVA,R0
ADDCA,#0
MOVR6,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,不能直接使用语句MOVA,#1000语句,因为无符号8位二进制数的表示围只有0~255。
所以将1000拆成100*10,与a相乘两次。
至于先乘100还是10,考虑到BCD码,a的最大值是9,与10相乘不会产生进位,比较方便第二次与100相乘时的程序书写。
如果与100相乘可能会出现结果大于255,程序编写比较复杂。
以上思考分析过程需要对各种数制的特点非常了解,这也是一名工程人员的基本要求。
实验三程序跳转表实验
一、实验目的
1、熟悉KEIL集成调试环境和汇编程序的方法。
2、了解简单的函数计算。
3、掌握多分支结构程序的编程方法。
二、实验说明
多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号指向相应的功能,完成指定操作。
若给出调用号来调用子程序,一般用查表法,查到子程序的地址,转到相应子程序。
三、实验容
流程图如下:
ORG0000H
LJMPSTART
ORG0200H
START:
MOVR0,#44;将x存于R0,赋值可更改,x分别取0,-71,重复实验两次
MOVA,R0
JZZERO;若x=0,则转向ZERO
JNBACC.7,POS;若x>0,则转向POS
NEG:
CPLA;取A的相反数
INCA;加1得到与x值绝对值相等的正数
MOVB,#2
DIVAB
CPLACC.7;将计算结果取反
SJMPDONE
POS:
MOVB,#2
MULAB
SJMPDONE
ZERO:
MOVA,#2
DONE:
MOV31H,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的开始处。
三、实验源程序
ORG0000H
JMPMAIN
ORG0100H
MAIN:
MOVR0,#50H
MOV@R0,#5FH
INCR0
MOV@R0,#56H
INCR0
MOV@R0,#5AH
INCR0
MOV@R0,#5EH
INCR0
MOV@R0,#51H
INCR0
MOV@R0,#5BH
INCR0
MOV@R0,#53H
INCR0
MOV@R0,#58H
INCR0
MOV@R0,#57H
INCR0
MOV@R0,#55H;将10个随机数送入部RAM的50~59单元
NOP;可在此处设置断点,观察原始数据情况
ACALLQUE;调用排序子程序
OUT:
MOVR0,#50H
MOVDPTR,#1000H
MOVR7,#10
OUT1:
MOVA,@R0
MOVX@DPTR,A
INCR0
INCDPTR
DJNZR7,OUT1
HERE:
AJMPHERE
NOP;可在此处设置断点观察最终数据排序情况
QUE:
MOVR1,#50H
MOVR6,#09H
I3:
MOVA,R6
MOVR7,A
MOVA,R1
MOVR0,A
MOVA,@R0
I2:
INCR0
MOVR2,A
SUBBA,@R0
MOVA,R2
JCI1
XCHA,@R0
I1:
DJNZR7,I2
MOV@R1,A
NOP;可在此处设置断点,观察每次数据排序情况
INCR1
DJNZR6,I3
RET
END
原始数据情况:
第一次排序结果:
第二次排序结果:
第三次排序结果
第四次排序结果
第五次排序结果:
第六次排序结果:
第七次排序结果:
第八次排序结果:
第九次排序结果:
外部RAM1000H处开始的数据情况:
四、实验任务
画出本实验程序的流程图。
答:
见本实验的最后一页。
五、心得体会
本实验是一个冒泡法的数据排序程序。
主要思想是从a[0]开始,依次与后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。
小的数字就像气泡一样往前冒。
程序循环多的时候,使用子程序就很方便。
不仅增加了程序的可读性,而且也节省了存的空间。
当程序比较复杂,调试程序时,可以在程序中设置相应的断点。
Keil软件设置断点的方式十分简单,只要在单击相关语句即可,因此是一种简单高校的调试方法。
开始
将10个随机数据送入50~59单元
初始化被比较单元R1
设置循环轮数R6
设置R1=R0
R0指向下一单元
@R1>@R2
交换@R1和@R2
R7=0
设置一轮排序内的比较次数R7
R1指向下一单元
R6=0
将排序好的数据复制到片外1000H~1009H
结束
Y
N
Y
N
Y
N
实验五键盘显示仿真实验
一、实验目的
1、熟悉Keil集成调试环境和汇编程序的调试方法。
2、学习使用外围接口工具调试程序。
3、熟悉键盘显示接口电路及程序设计。
二、实验要求
三、实验容
根据键盘、LED仿真板,设计一个走马灯程序通过按键启停。
主程序是一个循环点灯程序,其流程图如下所示。
按键启停功能由外部中断口p3.2完成。
触发方式为低电平触发。
当按键按下时,将一个0信号送入P1口,于是灯灭。
中断处理程序的流程图如下:
ORG0000H
LJMPMAIN
ORG0003H
LJMPSUB1;转T0中断服务程序入口
ORG0030H
MAIN:
MOVIE,#10001001B;cpu开中断,外部中断0开中断
MOVA,#1H
loop:
RLA;循环左移
MOVp1,A
MOVR2,#0H
BESTAGAIN:
MOVR1,#0H
NEXTAGAIN:
MOVR0,#0H
AGAIN:
NOP
NOP
NOP;延时
INCR0
CJNER0,#100,AGAIN
INCR1
CJNER1,#100,NEXTAGAIN
INCR2
CJNER2,#100,BESTAGAIN
LJMPloop
SUB1:
PUSHACC;中断服务子程序
MOVA,#0
MOVP1,A
NOP
NOP
NOP
NOP
POPACC
RETI
END
当无键按下时,8盏灯向左循环点亮,中断寄存器状态全为0.
当按下P3.2口,可见外部中断0相关寄存器状态置1,同时灯全灭。
所以用按键控制灯的亮灭的走马灯设计成功。