[课程]单片机数据传送实验报告

  • 格式:pdf
  • 大小:444.27 KB
  • 文档页数:5

实验三 数据传送实验报告

㈠ 实验目的

1. 进一步掌握程序的编辑、汇编及调试方法;

2. 掌握单片机内部RAM和外部RAM的数据操作; 3. 了解单片机系统地址分配概念。

㈡ 实验器材

1. G6W仿真器 一台 2. MCS—51实验板 一台

3. PC机 一台

4. 电源 一台

㈢ 实验内容及要求

1. 以数据表格形式在ROM中建立一个含有正数和负数的表格,数据长度

为16个字节,要求放置八个正数、八个负数,正、负数应离散随机放置,

不允许三个以上同类型数据连续放置,数据的具体内容自行确定;

2. 编制程序,将数据表格中的数据读出并按正、负数归类,正数送入首地

址为40H的内部RAM中;负数送入首地址为0B000H的外部RAM中;

3. 将首地址为0B000H的外部RAM中的数据取出并求其绝对值,然后送

入内部RAM的48H~4FH单元。

程序如下:

ORG 0000H

AJMP MAIN

ORG 0060H MAIN:

MOV A,#10H ;数据长度放入了累加器A中

MOV R1,#0B0H ;负数所需送入的首地址高位放入R1

MOV 20H,#00H ;负数所需送入的首地址低位放入20H单元中

MOV R0,#40H ;正数所需送入的首地址40H放到R0中去 MOV DPTR,#0A00H ;将表格开始的位置放入DPTR

;以上为初始化的全部内容

PUSH DPH

PUSH DPL

PUSH A START:

POP A

POP DPL

POP DPH PUSH A ;将A压栈,保护里面存储的数据长度10H

MOV A,#00H

MOVC A,@A+DPTR ;读表头地址

MOV 20H,A

INC DPTR ;DPTR指针加1,以读取表格中下一个数 PUSH DPH ;为了保护DPTR中存储的表格地址,压栈以便于放入0B000H,存储负数

PUSH DPL

JUDGE:

MOV A,20H RLC A

JC NEGATIVE ;判断语句,标志位为1,转去N(负数);否则往下执行

OPPOSITE:

MOV A,20H MOV @R0,A ;正数放入到以40H为首地址的单元中去

INC R0 ;进入下一个单元以存放下一个正数

POP DPL

POP DPH

POP A DEC A ;数据长度减一,代表已经读取了一个数

PUSH DPH

PUSH DPL

PUSH A

JNZ START ;如果数据长度不为0,表格还未读取完毕,返回START

SJMP END1 ;如果数据读取完毕,就跳去NEXT1

NEGATIVE:

MOV A,20H

MOV DPH,R1 MOV DPL,20H

MOVX @DPTR,A

INC DPTR ;0B000H加1,下一个负数存储单元

MOV 20H,DPL

MOV R1,DPH POP DPL

POP DPH

POP A

DEC A

PUSH DPH PUSH DPL

PUSH A

JNZ START ;和正数相同

JMP NEXT1

NEXT1: MOV A,#08H ;负数的数据长度放入A中

MOV DPTR,#0B000H ;负数现在存储位置放入DPTR

NEXT2: PUSH A ;将A压栈,保护其中负数的数据长度 MOVX A,@DPTR ;读负数存储的首地址

CPL A ;取反

INC A ;加1

MOV @R0,A ;将第一个绝对值入到48H单元(这里其实写的并不是

很好,如果正数和负数的绝对值存储位置并不相连,就不可以用了)

INC DPTR ;地址加1,下一个负数位置

INC R0 ;进入下一个存储单元

POP A DEC A ;数据长度减1

JNZ NEXT2 ;负数还没读完,继续

SJMP $ ;负数全部转成绝对值存储,程序结束

ORG 0A00H

TABLE:DB 0F0H,10H,80H,25H DB 0B2H,0A4H,30H,08H

DB 0D6H,54H,01H,8FH

DB 0C0H,27H,0CDH,09H

运行结果:

40H~47H中内容为

10H,25H,30H,08H,54H,01H,27H,09H

48H~4FH中内容为

10H,80H,5EH,5CH,2AH,71H,50H,44H

0B000H~0B007H中内容为

0F0H,80H,0B2H,0A4H,0D6H,8FH,0C0H,0CDH

硬件部分:A15~A12对应的选中芯片,因为B为1011,所以应

该选中A14口连接到芯片CS,低电平有效,这样就成功选中芯片进

行了扩展。

经过实验结果可以看出,程序运行正确,基本完成了数据传送,

达到了实验要求。

㈣ 实验框图

正数

结 束 Y 开 始

初始化

查表读入数据

正数? 负数?

数据送入首地址

为0B000H的片外RAM中 数据送入片内RAM,首地址为

40H 负数

数据是否读完? 数据指针加1

将片外RAM 0B000H~ 0B007H中的数据取出,求取

其绝对值分别送入片内RAM 48H~4FH单元存储

调试过程中出现的问题及收获:

1.刚开始写程序的时候对于正数负数的存储感觉上没有太大问题,但是不知道表格要怎么建立以及放到哪里去,只知道一条关于读取表格首地址的指令MOVC A,@A+DPTR,后来经过查

找资料和互相讨论,掌握了建立表格的方法以及关于表格存放的位置

MOV DPTR,#0A00H ;将表格开始的位置放入DPTR

ORG 0A00H

TABLE:DB 0F0H,10H,80H,25H DB 0B2H,0A4H,30H,08H

DB 0D6H,54H,01H,8FH

DB 0C0H,27H,0CDH,09H

2.调试过程中最主要的问题就是刚开始为了读取表格在DPTR中存了表格的首地址,但是后

面存放负数的时候也要用到DPTR存放0B000H,这样势必会改变DPTR的内容两者不可兼得,但是又不知道还有什么其他工具可以使用,很是困惑(其实还是对于堆栈问题的理解不深

刻)。后来深入理解使用堆栈之后这个问题就迎刃而解了,要向不改变其中的内容,将其压

栈进行操作就好,累加器A也是这样,但是一定要注意程序结构的严密性,防止破坏指针。

PUSH A ;将A压栈,保护里面存储的数据长度10H PUSH DPH ;为了保护DPTR中存储的表格地址,压栈以便于放入0B000H,存储负数

PUSH DPL

PUSH A ;将A压栈,保护其中负数的数据长度

。。。。。。 这次的使用让我真正意义上的了解到压栈的便利和使用方法,受益匪浅。

3.其他一些小问题包括取绝对值要取反加1,刚开始忘了加1;对于硬件部分不理解,后来

再三询问老师得到解答等等。

实验小结

本次实验让我们更加深入的了解了51单片机片内外RASM的存储空间及其用途,联系

了片内外RAM数据传送指令的使用。对于各种跳转指令的区别有了进一步的理解,压栈指令

的频繁使用让我们明白了栈的重要性及实用性,希望通过本次的实验,我们今后可以熟练运

用数据传送方面的内容。