[课程]单片机数据传送实验报告
- 格式: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数据传送指令的使用。对于各种跳转指令的区别有了进一步的理解,压栈指令
的频繁使用让我们明白了栈的重要性及实用性,希望通过本次的实验,我们今后可以熟练运
用数据传送方面的内容。