单片机数据传送实验报告.docx
《单片机数据传送实验报告.docx》由会员分享,可在线阅读,更多相关《单片机数据传送实验报告.docx(7页珍藏版)》请在冰点文库上搜索。
单片机数据传送实验报告
竭诚为您提供优质文档/双击可除
单片机数据传送实验报告
篇一:
单片机数据传送实验报告
实验名称:
数据传送实验
实验类型:
设计性实验
姓名:
袁志生
时间:
04.17第五六节课
一、实验目的与要求
实验目的:
1、掌握单片机的汇编指令系统及汇编语言程序设计方法。
2、掌握单片机的存储器体系结构。
3、熟悉keil软件的功能和使用方法。
4、掌握单片机应用程序的调试方法。
实验要求:
1、实现单片机内部RAm之间,外部RAm之间以及内部RAm与外部RAm之间的数据传送。
2、利用Keil软件编辑、汇编、调试、运行实验程序并记录实验数据。
二、设计要求
1、编写程序将00h~0Fh16个数据分别送到单片机内部RAm30h~3Fh单元中。
2、编写程序将片内RAm30h~3Fh的内容传送至片内RAm40~4Fh单元中。
3、编写程序将片内RAm40h~4Fh单元中的内容传送到外部RAm4800h~480Fh单元中。
4、编写程序将片外4800h~480Fh单元内容送到外部RAm5800h~580Fh单元中。
5、编写程序将片外RAm5800h~580Fh单元内容传送回片内RAm50h~5Fh单元中。
三、实验程序流程框图和程序清单.
程序清单:
oRg0000h
sTART:
moVR0,#30h
moVDpTR,#Qw1
moVR5,#0
Loop:
Qw1:
Qw2:
Loop1:
Loop2:
Loop3:
R7,#16A,R5A,@A+DpTR@R0,AR0IncR5R7,LoopQw200h,01h,02h,03h,04h,05h,06h,07h08h,09h,0Ah,0bh,0ch,0Dh,0eh,0FhR0,#30hR1,#40hmoVR5,#16A,@R0@R1,AR0R1R5,Loop1R1,#40hmoVDpTR,#4800hR5,#16A,@R1@DpTR,AR1DpTRR5,Loop2moVsp,#60h11h,#48h10h,#58hR2,#00hDpL,R210h11hDphmoVxA,@DpTRmoVmoVmoVcmoVIncDJnZLJmpDbDbmoVmoVmoVmoVIncIncDJnZmoVmoVmoVmoVxIncIncDJnZmoVmoVmoVmoVpushpushpop
pop
moVx
Inc
cJne
moV
moV
moV
Loop4:
moVx
moV
Inc
Inc
DJnZ
enD
四,实验小结
Dph@DpTR,AR2R2,#10h,Loop3R1,#50hDpTR,#5800hR5,#16A,@DpTR@R1,AR1DpTRR5,Loop4
1通过本次实验熟悉了keil软件的功能和使用方法.
2掌握单片机的数据传送类和循环类汇编指令系统,学会了各种数据传送形式的程序设计方法.
3掌握了单片机的调试方法。
为以后的实验开了个好头.
五、思考题
1、说明mcs-51系列单片机对片内RAm和片外RAm存贮器各有哪些寻址方式?
答:
片内RAm寻址方式有:
寄存器寻址方式,直接寻址方式,寄存器间接寻址方式,位寻址方式,立即数寻址。
片外RAm寻址方式:
寄存器间接寻址。
2、说明指令moVA,20h和moVc,20h中的20h含义有什么不同?
传送指令中的助记符moV,moVx,moVc各适用于访问哪个存储器空间?
答:
(1)moVA,20h的含义是字节地址,moVc,20h的含义是位地址。
(2)助记符moV适用于访问片内RAm,助记符moVx适用于访问外部RAm,助记符moVc适用于访问程序存储空间。
篇二:
单片机数据传送实验报告
实验三数据传送实验报告
㈠实验目的
1.进一步掌握程序的编辑、汇编及调试方法;
2.掌握单片机内部RAm和外部RAm的数据操作;3.了解单片机系统地址分配概念。
㈡实验器材
1.2.3.4.
g6w仿真器一台mcs—51实验板一台pc机一台电源一台
㈢实验内容及要求
1.以数据表格形式在Rom中建立一个含有正数和负数的表格,数据长度
为16个字节,要求放置八个正数、八个负数,正、负数应离散随机放置,不允许三个以上同类型数据连续放置,数据的具体内容自行确定;2.编制程序,将数据表格中的数据读出并按正、负数归类,正数送入首地
址为40h的内部RAm中;负数送入首地址为0b000h的外部RAm中;3.将首地址为0b000h的外部RAm中的数据取出并求其绝对值,然后送
入内部RAm的48h~4Fh单元。
程序如下:
oRg0000hAJmpmAInoRg0060hmAIn:
moVA,#10h;数据长度放入了累加器A中
moVR1,#0b0h;负数所需送入的首地址高位放入R1
moV20h,#00h;负数所需送入的首地址低位放入20h单元中moVR0,#40h;正数所需送入的首地址40h放到R0中去moVDpTR,#0A00h;将表格开始的位置放入DpTR;以上为初始化的全部内容pushDphpushDpLpushAsTART:
popApopDpL
popDph
pushA;将A压栈,保护里面存储的数据长度10hmoVA,#00h
moVcA,@A+DpTR;读表头地址moV20h,A
IncDpTR;DpTR指针加1,以读取表格中下一个数
pushDph;为了保护DpTR中存储的表格地址,压栈以便于放入0b000h,存储负数pushDpLJuDge:
moVA,20hRLcA
JcnegATIVe;opposITe:
moVA,20h
moV@R0,A;IncR0;popDpLpopDphpopA
DecA;pushDphpushDpLpushA
JnZsTART;sJmpenD1;negATIVe:
moVA,20hmoVDph,R1moVDpL,20hmoVx@DpTR,A
IncDpTR;0b000hmoV20h,DpLmoVR1,DphpopDpLpopDphpopADecA
pushDphpushDpLpushA
JnZsTART;JmpnexT1
nexT1:
moVA,#08h;判断语句,标志位为1,转去n(负数);否则往下执行正数放入到以40h为首地址的单元中去进入下一个单元以存放下一个正数数据长度减一,代表已经读取了一个数如果数据长度不为0,表格还未读取完毕,返回sTART如果数据读取完毕,就跳去nexT1加1,下一个负数存储单元和正数相同负数的数据长度放入A中
moVDpTR,#0b000h;负数现在存储位置放入DpTR
nexT2:
pushA;将A压栈,保护其中负数的数据长度moVxA,@DpTR;读负数存储的首地址cpLA;取反IncA;加1
moV@R0,A;将第一个绝对值入到48h单元(这里其实写的并不是很好,如果正数和负数的绝对值存储位置并不相连,就不可以用了)IncDpTR;地址加1,下一个负数位置IncR0;进入下一个存储单元popA
DecA;数据长度减1
JnZnexT2;负数还没读完,继续
sJmp$;负数全部转成绝对值存储,程序结束oRg0A00h
TAbLe:
Db0F0h,10h,80h,25hDb0b2h,0A4h,3(:
单片机数据传送实验报告)0h,08hDb0D6h,54h,01h,8FhDb0c0h,27h,0cDh,09h
运行结果:
40h~47h中内容为
10h,25h,30h,08h,54h,01h,27h,09h48h~4Fh中内容为
10h,80h,5eh,5ch,2Ah,71h,50h,44h0b000h~0b007h中内容为
0F0h,80h,0b2h,0A4h,0D6h,8Fh,0c0h,0cDh
硬件部分:
A15~A12对应的选中芯片,因为b为1011,所以应该选中A14口连接到芯片cs,低电平有效,这样就成功选中芯片进行了扩展。
经过实验结果可以看出,程序运行正确,基本完成了数据传送,达到了实验要求。
㈣实验框图
调试过程中出现的问题及收获:
1.刚开始写程序的时候对于正数负数的存储感觉上没有太大问题,但是不知道表格要怎么建立以及放到哪里去,只知道一条关于读取表格首地址的指令moVcA,@A+DpTR,后来经过查找资料和互相讨论,掌握了建立表格的方法以及关于表格存放的位置moVDpTR,#0A00h;将表格开始的位置放入DpTRoRg0A00h
TAbLe:
Db0F0h,10h,80h,25h
Db0b2h,0A4h,30h,08hDb0D6h,54h,01h,8FhDb0c0h,27h,0cDh,09h
2.调试过程中最主要的问题就是刚开始为了读取表格在DpTR中存了表格的首地址,但是后面存放负数的时候也要用到DpTR存放0b000h,这样势必会改变DpTR的内容两者不可兼得,但是又不知道还有什么其他工具可以使用,很是困惑(其实还是对于堆栈问题的理解不深刻)。
后来深入理解使用堆栈之后这个问题就迎刃而解了,要向不改变其中的内容,将其压栈进行操作就好,累加器A也是这样,但是一定要注意程序结构的严密性,防止破坏指针。
pushA;将A压栈,保护里面存储的数据长度10h
pushDph;为了保护DpTR中存储的表格地址,压栈以便于放入0b000h,存储负数pushDpL
pushA;将A压栈,保护其中负数的数据长度。
。
。
。
。
。
这次的使用让我真正意义上的了解到压栈的便利和使用方法,受益匪浅。
3.其他一些小问题包括取绝对值要取反加1,刚开始忘了加1;对于硬件部分不理解,后来再三询问老师得到解答等等。
实验小结
本次实验让我们更加深入的了解了51单片机片内外RAsm的存储空间及其用途,联系了片内外RAm数据传送指令的使用。
对于各种跳转指令的区别有了进一步的理解,压栈指令的频繁使用让我们明白了栈的重要性及实用性,希望通过本次的实验,我们今后可以熟练运用数据传送方面的内容。
篇三:
单片机数据传送实验
mAIn:
moVR0,#30hmoVR2,#00hmoVR3,#10hLoop:
moVA,R2
;将RAm30h的地址送R0;将00h送到R2中;数据串长度;R2的内容送A
;表首地址TAb1送到DpTR中;查表得数据;将累加器A;R2自加一;R0自加一
;R3自减一,不等0转移;长转移到mAIn2
moVDpTR,#TAb1moVcA,@A+DpTR
moV@R0,AIncR2IncR0
DJnZR3,Loop
LJmpmAIn2
TAb1:
Db0h,01h,02h,03h,04h,05h,06h,07h;数据表Db08h,09h,0Ah,0bh,0ch,0Dh,0eh,0Fh
mAIn2:
moVR0,#30h;数据串首地址送寄存器R0moVR1,#40h;内部RAm首地址30h送R1moVR7,#10h;最大数据串长Loop2:
moVA,@R0;取数据moV@R1,A;数据传送IncR0;寄存器R0加1
IncR1;寄存器R1加1DJnZR7,Loop2;循环控制
mAIn3:
moVR0,#40h;数据串首地址送寄存器R0moVDpTR,#4800h;外部RAm数据首地址送DpTRmoVR7,#10h;最大数据串长Loop3:
moVA,@R0;取数据moVx@DpTR,A;
数据传送
IncR0;IncDpTR;DJnZR7,Loop3;循环控制
mAIn4:
moVDpL,#00h;DpL初始化,4800h低8位地址送DpLmoVR7,#10h;最大数据串长
Loop4:
moVDph,#48h;4800h高8位地址送DphmoVxA,@DpTR;取数据到累加器AmoVDph,#58h;5800h高8位地址送Dph
moVx@DpTR,A;
将累加器A中的内容送到5800h中
IncDpTR;DpTR加一转移DJnZR7,Loop4;循环控制
mAIn5:
moVDpTR,#5800h;5800h地址送DpTRmoVR0,#50h;50h地址送寄存器R0moVR7,#10h;最大数据串长Loop5:
moVxA,@DpTR;取数据moV@R0,A;数据传送
IncDpTR;
DJnZR7,Loop5;循环控制enD结束结束
实验数据