Ⅰ 单片机里面CPU读写存储器的步骤过程
1)存储器的读操作。例如,若要将存储器40H中的内容50H读出,其过程如下:
①CPU将地址码40H送到地址总线上,经存储器地址译码器选通地址为40H的存储单元:
②CPU发出“渎”信号,存储器读/写控制开关将数据传输方向拨向“读”;
③存储器将地址为40H的存储单元中的内容50H送到数据总线上;
④CPU将数据总线上的数据50H读人指定的某一寄存器。
对存储单元的读操作,不会破坏其原来的内容。相当于复制。
2)存储器的写操作。例如,若要将数据ABH写入存储器地址为CDH的存储单元中,其过程如下: 内容来自单片机之家www.dpj100.com
①CPU将地址码CDH送到地址总线上,经存储器地址译码器选通地址为CDH的存储单元;
②CPU将数据ABH送到数据总线上;
③CPU发出“写”信号,存储器读/写控制开关将数据传送方向拨向“写”;
④存储器将数据总线上的数据ABH送人已被选中的地址为CDH的存储单元中。
Ⅱ 单片机实验
1、
MOV R0,#20H
MOVX A,@R0
MOV 20H,A
2、
MOV DPTR,#2000H
MOVX A,@DPTR
MOV 20H,A
3、
MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV 20H,A
4、
MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV B,A
MUL AB
MOV R7,A
MOV R6,B;(溢出部分送R6)
5、高八位?低八位?什么意思?
地址高八位DPH,地址第八位DPL
MOV DPH,#20H
MOV DPL,#00H
Ⅲ 单片机实验编制程序对外部存储器进行读写操作
MOV A,#DATA(要写入的数据);
MOV DPTR,#Address(要存放数据的外部存储器单元地址);
MOVX @DPTR,A;
MOVX A,@DPTR;
CJNZ A,#DATA(判断时认为要传送的正确数据),LABEL
CLR P1.0
JMP END
LABEL:CLR P1.1
END:AJMP $
Ⅳ 51单片机扩展外部数据存储器6264,怎么用C语言实现对其操作
2.扩展RAM编程基础
(1)弄清扩展器件的地址
在图7.2.5中,U3的ABC接单片机A13,A14,A15,所以片选信号对应地址最高位,即:“CBAxxxxx xxxxxxxx”(x为任意)。U4片选接CS1,即Y1,CBA=001,可得U4的地址范围是0x2000~0x3fff。U5接CS3,即Y3,CBA=011,地址为0x6000~0x7fff。U6接CS4,即Y4,CBA=100,地址为0x8000~0x9fff。知道了器件地址,可以利用直接地址、外部数据指针来访问存储器。通过设置,也可以让编译器在扩展RAM中自动分配存储单元。
(2)直接地址访问
①向U4写数据:
XBYTE[0x2000+addr]=dat; //addr为U4内部地址,取值为0~0x1fff;dat为数据。
②读出U4数据:
dat=XBYTE[0x2000+addr];
也可以用页访问方式。页访问方式,实际就是先把16位地址高8位送P2口,通过低8位地址读写。
③按页读写U4:
P2=0x20+page; // page为页,取值为0x00~0x1F。
PBYTE[addr]=dat; // addr为页内地址,取值为0x00~0xFF。
dat=PBYTE[addr];
④读U6
dat=XBYTE[0x8000];//读U6,地址取0x8000~0x9fff任何值,都一样。
⑤写U5
XBYTE[0x6000]=dat; //写U5,地址取0x6000~0x7fff任何值,都一样。
(3)数据指针
如,读写U4,可以这样写:
unsigned char xdata *p=0x3000; //声明指针p,并初始指向0x3000单元
x=*p; //读指针所指向的位置
p=p+1; //指针指向下一单元
*p=0x16; //向指针所指向的位置写入数据
(4)让编译器自动分配存储空间
①为了能让编译器自动分配存储空间,并使用扩展RAM,必须设置扩展RAM地址。在Keil编程软件中,点击工具栏快捷图标“ ”,弹出目标选项对话框。按图7.2.6所示,设置RAM起始地址和长度。
②变量声明时使用xdata关键词。如:
unsigned char xdata a;//变量a使用扩展RAM空间。
特别注意,扩展RAM直接地址访问方式与自动分配存储空间方式最好不要混用,否则可能产生冲突。
摘自《单片机控制装置安装与调试》下册,雷林均主编
Ⅳ 分析at89s52单片机的存储器结构
1.程序存储器
设计人员编写的程序存放在微处理器的程序存储器中。
at89s52具有64kb程序存储器寻址空间,它是用于存放用户程序、数据和表格等信息,程序存储器的结构如图1所示。
图1 at89s52程序存储器的结构
at89s52片内片外的程序存储器在统一逻辑空间中,地址从0000h~ffffh,共有64k字节范围。引脚接高电平时,程序从片内程序存储器0000h开始执行,即访问片内存储器。当pc值超出片内rom容量时,会自动转向片外程序存储器空间执行。引脚接低电平时,迫使系统全部执行片外程序存储器0000h开始存放的程序。
2.数据存储器
at89s52 有256 字节片内数据存储器。地址为00h~ffh。这256个单元共分为两部分。其一是地址从00h~7fh单元(共128个字节)为用户数据ram。从80h~ffh地址单元(也是128个字节)为特殊寄存器(sfr)单元。高128 字节与特殊功能寄存器重叠,也就是说高128字节与特殊功能寄存器有相同的地址,而物理上是分开的。
在00h~1fh共32个单元中被均匀地分为四块,每块包含八个8位寄存器,均以r0~r7来命名,称这些寄存器为通用寄存器。这四块中的寄存器都称为r0~r7,利用psw的第3和第4位(rs0和rs1),即可选中这四组通用寄存器。
内部数据存储器的20h—2fh单元为位寻址区,可作为一般单元用字节寻址,也可对它们的位进行寻址,位寻址区地址如表1所示
表1 ram位寻址区地址表
3. 中断服务程序的入口地址
在程序存储区中,为中断服务程序保存了一段中断服务程序的入口地址:其中一组特殊单元是0003h—0032h,各个单元各有用途,它们被分为六段,每个段8个字节,专门留给中断服务程序使用,被称为中断矢量区。at89s52共有8个中断源,6个中断矢量,它们的定义如下表2所,
表2 中断服务程序的入口地址
4.特殊功能寄存器sfr(special? function register)
特殊功能寄存器是指有特殊用途的寄存器集合,也称为专用寄存器,本质上是一些具有特殊功能的片内ram单元,反映单片机的运行状态,很多功能也通过特殊功能寄存器来定义和控制程序的执行。
at89s52单片机内部高128(80~ffh)地址分配给特殊功能寄存器。这个地址空间和芯片内数据存储器的高128字节地址完全重叠,但两者在物理硬件上是完全独立的,用寻址方式来区分这个完全重叠的地址空间。使用直接寻址方式访问这个地址空间时,访问的是特殊功能寄存器;使用间接寻址方式访问这个地址空间时,访问的是数据存储器。
at89s52有32个特殊功能寄存器,它们被离散地分布在内部ram的80h~ffh地址中,这些寄存的功能已作了专门的规定,用户不能修改其结构。
5.几个注意问题
(1)地址的重叠性
单片机中的所有存储器都必须分配地址,可以寻址的地址范围为64kb,数据存储器与程序存储器都占用相同的地址。
程序存储器中片内片外0000h~0ffffh低4kb地址完全重叠,但是我们使用引脚进行区分:=0时,选择片外,=1时,选择片内,这样就完全区分开来了。
数据存储器中片内外0000h~00ffh的256个单元地址完全重叠,片内外数据的访问采用不同指令来区分:mov指令访问片内数据存储器,movx指令访问片外数据存储器。
(2)程序存储器(rom)与数据存储器(ram)的区分
程序存储器(rom)与数据存储器(ram)的区分在使用上是严格区分的,程序存储器只能放置程序指令及常数表格,对程序存储器中数据的访问只可以使用movc指令。而数据存储器则存放数据,片内外的操作指令分别用mov,movx进行操作。
(3)位地址空间的区域划分
片内ram中的20h~2fh的128位,以及sfr中的位地址,这些位寻址单元与位指令集构成了位处理器系统
Ⅵ 在单片机实验中,如何控制8255芯片的片选cs端口。万分感谢高手指教!!!
用到P0口和P2口的第二功能时,P0口输出低8位地址,P2口输出高8位地址,这样在输出地址的同时把CS拉低选中8255。首先输出地址,用74ls373把地址锁存以后,再通过P0口和8255数据进行数据交换!如果还有疑问可以去看看51教材P口的第二功能!!!我的回答希望对你有点帮助!!!
这两种方式的区别 在于:
前者是用IO口选通的;后者是把8255当做片外数据存储器用的。
举例说明:
1.做IO口
CLR P2.7
...........
2.做片外数据存储器
MOVX @DPTR 0xff7f ;地址随便编的,但P0的第七位要为0
.........
后者就是由74ls373送出地址。
只要让CS=0就可以。
比如接在P2.7上的,P2.7对应A15,所以用MOVX指令时,只要P2.7=0即选中8255,比如0x7FFFF,0x0000等这样的地址,只要A15=0即可。
在74LS373的Q7上的意思也一样,Q7对应的地址是A7,所以只要A7=0就能选中8255。
Ⅶ 单片机程序将外部数据存储器从7000H开始的连续的30个单元置为1
外部数据存储器的读写,用指令MOVX来实现,汇编语言来编制的话,是很容易理解的。下面给出汇编代码,供参考:
SETD:
MOVDPTR,#7000H
MOVR2,#30
LOOP:
MOVXA,#0ffh
MOVX@DPTR,A
INCDPTR
DJNZR2,LOOP
RET
如果用C语言的话,程序代码如下:
unsignedchar*str
unsignedchari;
str=0x7000;
for(i=0;i<30;i++)
{
*str=0xff;
str++;
}
Ⅷ 单片机实验数码转换实验代码如何补充,补充过程及注释解释
2.2.1 实验目的
1. 掌握不同进制数及编码相互转换的程序设计方法,加深对数码转换的理解;
2. 熟悉Keil C51 集成开发环境的操作及程序调试的方法。
2.2.2 实验设备
PC机一台,TD-NMC+教学实验系统、或“TD-PIT++教学实验系统+TD-51 系统平台”、或
“TD-PITE 教学实验系统+TD-51 系统平台”
2.2.3 实验内容
1. 将BCD 码整数0~255 存入片内RAM 的20H、21H、22H 中,然后转换为二进制整数
00H~FFH,保存到寄存器R4 中。
2. 将16 位二进制整数存入R3R4 寄存器中,转换为十进制整数,以组合BCD 形式存储在
RAM 的20H、21H、22H 单元中。
2.2.4 实验步骤
1. BCD 整数转换为二进制整数
实验参考例程:(Asm2-1.asm)
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV R0, #20H ;BCD 存放高位地址
MOV R7, #03H ;BCD 码0--255, 最多3 位
CLR A
MOV R4, A
LP1: MOV A, R4
MOV B, #0AH
MUL AB ;乘10
ADD A, @R0 ;加下一位的值
INC R0 ;指向下一单元
MOV R4, A ;结果存入R4
DJNZ R7, LP1 ;转换未结束则继续
SJMP MAIN ;设置断点, 观察实验结果R4 中的内容
END
实验步骤:
(1)输入程序,检查无误后,编译、链接程序,首先给系统复位,然后点击命令进入
调试状态;
(2)修改20H、21H、22H 单元的内容,如:00H,05H,08H;
(3)在SJMP MAIN 语句行设置断点,然后运行程序;
(4)程序遇到断点后停止程序运行,此时查看寄存器R4 的内容,应为3AH;
(5)重新修改20H、21H、22H 单元的内容,再次运行程序,验证程序的正确性;
(6)实验结束,按复位键将系统复位,点击退出调试状态。
2. 二进制整数转换为十进制整数
图2-2-1 程序流程图
实验参考例程:(Asm2-2.asm)
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV R0, #22H ;转换结果低位地址
MOV A, R0
PUSH ACC ;ACC 表示累加器A 的直接地址
MOV R7, #03H
CLR A
LP1: MOV @R0, A ;结果存储地址清零
DEC R0
DJNZ R7, LP1
POP ACC
MOV R0, A
MOV R7, #16
LP2: PUSH ACC
CLR C
MOV A, R4 ;R4中为二进制数的低位
RLC A
MOV R4, A
MOV A, R3 ;R3中为二进制数的高位
RLC A
MOV R3, A
MOV B, #03H
LP3: MOV A, @R0
ADDC A, @R0 ;执行乘2 操作
DA A ;十进制调整
MOV @R0, A ;结果保存
DEC R0
DJNZ B, LP3
POP ACC
MOV R0, A
DJNZ R7, LP2
LJMP MAIN ;设置断点观察结果, 可进行下一次转换
END
实验步骤:
(1)编写实验程序,程序流程图如图2-2-1 所示,编译、链接无误后,进入调试状态;
(2)修改R3R4 寄存器,例如A2H、FCH;
(3)在LJMP MAIN 语句行设置断点,然后运行程序;
(4)程序停止后,查看存储器20H 的内容,应为:04H、17H、24H;
(5)反复修改R3R4 寄存器的内容,运行实验程序,验证程序的正确性。
Ⅸ 急求:单片机实验
:
ORG 0030H
MOV 30H, #34H
MOV 31H, #56H
MOV 32H, #23H
MOV 33H, #90H
MOV 34H, #32H
MOV 35H, #68H
MOV 36H, #09H
MOV 37H, #75H
CALL SORT
SJMP $
;-----------------------------------------------------
SORT: ;最简短、高效的排序程序.
MOV B, #7 ;第一轮排序时,比较7次.
S1: MOV R0, #30H ;数据区的起始地址.
MOV R7, B
CLR PSW.5 ;清除"交换"标志位.
S2: MOV A, @R0 ;取前一个数.
INC R0
CLR C
SUBB A, @R0 ;减后一个数,前<后时,Cy=1
S3: JC S4 ;有借位时,不用交换,转移.
MOV A, @R0 ;取后一个数,准备交换.
DEC R0
XCH A, @R0 ;交换到前一个.
INC R0
XCH A, @R0 ;交换到后一个.
SETB PSW.5 ;设定"交换"标志位.
S4: DJNZ R7, S2 ;继续本轮比较.
JNB PSW.5, ENDS ;如本轮没有进行过交换,可提前结束.
DJNZ B, S1 ;下一轮,比较次数少一次.
ENDS:
RET
;-----------------------------------------------------
END