单片机向外部存储器写数据

来源:百度知道 编辑:UC知道 时间:2024/09/20 22:43:21
小弟想向单片机外部存储器写数据,程序如下:
#include <reg51.h>
#define uint unsigned int
void main()
{
uint xdata *data pXRAM;
pXRAM=0x90f0;
*pXRAM=10;

}
意思是向外部存储器地址为0x90f0的地方写数据10。
但是我反汇编以后看到,如下:
C:0x0000 020003 LJMP C:0003
C:0x0003 787F MOV R0,#0x7F
C:0x0005 E4 CLR A
C:0x0006 F6 MOV @R0,A
C:0x0007 D8FD DJNZ R0,C:0006
C:0x0009 758107 MOV SP(0x81),#0x07
C:0x000C 02000F LJMP main(C:000F)
3: void main()
4: {
5: uint xdata *pXRAM;
6: pXRAM=0x90f0;
C:0x000F 9090F0 MOV DPTR,#0x90F0
7: *pXRAM=10;
8:
C:0x0012 E4 CLR A
C:0x0013 F0 MOVX @DPTR,A
C:0x0014 A3 INC DPTR
C:0x0015 740A MOV A,#0x0A
C:0x0017 F0 MOVX @DPTR,A
9: }
C:0x0018 22

高度同意2、3楼的,1楼解释有误。

原理2、3楼讲的挺清楚的,看他们的就行了。

其实你理解的误区就在uint处,它是16位的,所以地址0x90f0和0x90f1是一个整体,所以0x90f0里的“0”和0x90f1里的“0x0A”也要合成一个整体看待,就是“000a”,还是‘10’,符合要求。

如果按你的思路,要得到你想要的结果的话,只需将uint换位uchar(8位)即可。

pXRAM是16位uint整数指针,*pXRAM是整数,占2字节,高8位为0,低8位才是10。RAM里低地址是高位,高地址是低位。 编译是正确的。

不是,你十进制10转为二进制为10000,存储地址是从0x90f0 开始,即它存的就是,00010000,即0x10

没错的,因为是你自己将pXRAM定义成指向uint型的指针,所以给它所指的地方赋值时,就应该写进去一个uint型的数啊。10对应的16位unsigned int型数就是高字节为0,低字节为0x0A。