单片机存储器填充程序实验报告 本文关键词:存储器,单片机,填充,实验,程序
单片机存储器填充程序实验报告 本文简介:实验一单片机存储器填充程序一、实验目的1、了解单片机汇编语言程序的基本结构2、了解单片机汇编语言程序的设计和调试方法3、掌握几个的基本的传送类、控制类指令的使用方法二、实验仪器单片机开发板、万利仿真机、稳压电源、计算机三、实验原理1、单片机存储器的结构51系列单片机数据存储器分为内部直接寻址存储器(
单片机存储器填充程序实验报告 本文内容:
实验一
单片机存储器填充程序
一、实验目的
1、了解单片机汇编语言程序的基本结构
2、了解单片机汇编语言程序的设计和调试方法
3、掌握几个的基本的传送类、控制类指令的使用方法
二、实验仪器
单片机开发板、万利仿真机、稳压电源、计算机
三、实验原理
1、
单片机存储器的结构
51系列单片机数据存储器分为内部直接寻址存储器(工作寄存器区,位寻址区),内部间接寻址存储器,外部存储器。如图3-1所示。
00H-07FH
0000H-0FFFFH
外部数据存储器,需要扩展,有些单片在内部扩展一部分
80H—0FFH
直接寻址区,用于特殊功能,有很多没有用
80H—0FFH
间接寻址区,保存一般数据,52单片机内部有高128B存储器
通用存储器
30H-7FH
位寻址寄存器
20H-2FH
工作寄存器
00H-1FH
图3-1
单片机存储器结构
2、
单片机内部存储器操作指令
51单片机内部将数据存储器划分成多个区域,每个区域用的存储器访问指令也不相同(操作码或操作数不同)。
a、内部直接寻址通用存储器访问指令
MOVA
,40H;将内部直接寻址存储器中的40H单元内容复制到累加器A
MOVR2
,30H;将内部直接寻址存储器中的40H单元内容复制到寄存器R2
MOV30H,40H;将内部直接寻址存储器中的40H单元内容复制到30H
MOVA
,@R0;将R0指向的内部直接寻址存储器的内容复制到累加器A
PUSHACC;将累加器A的内容复制到堆栈栈顶
POPACC;将堆栈指针SP指向的内部直接寻址存储器内容复制到A
b、内部间接寻址通用存储器访问指令
MOVA
,@R0;将R0指向的内部间接寻址存储器的内容复制到累加器A
MOVA
,@R0;将累加器A的内容复制到R0指向的内部间接寻址存储器
PUSHACC;将累加器A的内容复制到系统堆栈栈顶
POPACC;将堆栈指针SP指向的内部间接寻址存储器内容复制到A
c、内部位寻址区存储器访问指令
MOVC
,00H;位寻址区的00H位内容复制到C标志
MOV01H,C;将C标志内容复制到位寻址区的00H
3、
单片机外部数据存储器操作指令
MOVXA
,@DPTR;将DPTR指向的外部存储器的内容复制到累加器A
[email protected]
,A;将累加器A的内容复制到由DPTR指向的外部存储器
四、实验内容
1、单片机内部RAM填充程序
开始
装备输入参数
填充一字节
指向下一字节
完成?
完成,退出
图3-2
区域填充程序流程图
Y
N
把单片机片内30H—50H的单元全部清零。流程图如图3-2所示。
ORG0
LJMPSTART
ORG100
START:
MOVA,#00H;填充的内容
MOVR0,#30H;填充的区域的首地址
MOVR7,#32;填充的区域的字节数
RamClear:
[email protected],A;填充数据
INCR0;下一单元
DJNZR7,RamClear;没有完成,则返回
SJMP$;填充完成
2、采用输入参数的方式设计的程序
ORG0
LJMPSTART
ORG100
START:
MOVA,#00H
MOVR0,#30H
MOVR7,#32
LCALLRamClear
SJMP$-3
;------------------------------------------------------------------------------
;RAM区域填充
;输入:A:填充内容,R7:填充字节数,R0:填充指针(加计数)
;输出:无
;-------------------------------------------------------------------------------
RamClear:
[email protected],A
INCR0
DJNZR7,RamClear
RET
3、采用宏汇编结构设计的程序
在万利集成开发环境中建立项目文件,并建立两个文件,添加到项目中,文件内容如下:
File:Init.asm
PUBLIC
RamClear
MiscCodeSEGMENTCODE
RSEGMiscCode
RamClear:
[email protected],A
INCR0
DJNZR7,RamClear
RET
END
在主程序中调用另一个文件中的子程序,要在调用之前声明是引用外部程序。
File:mainpro.asm
EXTRNCODE(RamClear)
……
MOVR7,#32
MOVA,#00H
MOVR0,#30H
LCALLRamClear
SJMP$-3
……
END
五、实验步骤及调试信息
(1)、新建实验项目xuefenghai
(2)、输入实验程序并补充完整
(3)、编译下载实验程序,并修改错误(按附录说明)
1、编译出错:
提示:MISSING
END
STATEMENT
原因:文件结尾处没有写END。
修改后正确:
2、全速运行程序出现以下现象:
原因:驱动器的选择出现错误。
(4)全速运行程序,查看实验现象。
实验前的数据
内容1运行后的数据
内容2运行数据如下:
6、单步执行,分析各程序的功能特点。
若单步执行,则实验结果会从30H逐步执行,实现逐步清零。同时R0从30H逐渐递增到3CH,R7从0CH逐渐递减到00H。
7、整理实验设备
六、实验思考题
1、实验内容1对哪些单元进行清零,程序是否执行正确?
答:实验1从30H到3CH进行清零,程序执行正确。
2、说明MOV、MOVX、MOVC三条指令的区别。
答:MOV:
单片机内部的寄存器或者存储器之间相互传递数据(内部RAM),MOVX:
单片机内部的A累加器与片外的数据存储器(片外RAM)或I/O传送数据的指令,MOVC:
单片机内部的A累加器向ROM(程序存储器)读取数据,因为程序存储器是固定的不可以写的,所以,A只能读数据,却不能向它写数据。
3、如果要在单片机内部填充N个双字节数,请写出相关程序?
ORG
0
LJMP
START
ORG
100
START:
MOV
DPTR,#0001H;填充的内容
MOV
R0,#30H
;填充的区域的首地址
MOV
R7,#N
;填充的区域的字节数
RamClear:
MOV
@R0,DPH
;填充数据
INC
R0
MOV
@R0,DPL
INC
R0;
;下一单元
DJNZ
R7,RamClear
;没有完成,则返回
SJMP
$
;填充完成
END
七、实验心得体会
通过这次实验,让我重新认识了单片机的内部信息,以及他那强大的功能,也让我认识到要想学好单片机,必须学会这些实验,以及要对这些实验现象等要有很多深层次的认识。只有这样我们才算是没白学过这门课。