51单片机存储区分配如下:
存储区 | 地址规模 | 功用阐明 |
内部RAM (256Byte) |
00H-1FH | 内部运用DATA区,四个作业寄存器组(4*8=32Byte),用于内部参数传递 |
20H-2FH1 |
BDATA区,DATA 区的16 个字节的可位寻址区 | |
30H-7FH2 | 用户可用非位寻址DATA区,可在一个周期内直接寻址 | |
80H-FFH | IDATA区,用户可用的内部RAM 区的高128 个字节,有必要选用直接寻址 | |
80H-FFH3 | 能够进行位寻址的特别功用寄存器(SFR) | |
外部扩展RAM (最大64KByte) |
00H-FFH | PDATA区,外部存储区的256 个字节经过P0 口的地址对其寻址,需求两个指令周期 |
00H-FFFFH4 | XDATA区(外部存储区),运用DPTR 寻址 | |
ROM (最大64KByte) |
00H-FFFFH | CODE区(程序存储区),运用DPTR 寻址 |
1编程界说为: uchar bdata test;
咱们一般能够这么用:
先做一个位界说:sbit test0 = test^0;
然后再程序中运用:if(test0)…else…;表明判别test的第0bit位的值,然后履行相应程序。其它位的用法相似。
2编程界说为: uchar data test;
3编程界说为: uchar idata test;
假如你没有彻底弄懂一个MPU的SFR,那么只能说你没有弄懂这个MPU了。所以这儿不细说单片机的SFR,只提一点,它的地址是和IDATA区堆叠的,单片机内部时经过区别所拜访的存储区来处理地址堆叠问题的,由于IDATA 区只能经过直接寻址来拜访。在咱们的实时性要求不那么高,或许DATA区不够用的状况下咱们就应该启用IDATA区。
4编程界说为:uchar
也能够这么运用:(需包含头文件absacc.h)
A = XBYTE[0x8100]; //从地址8100H读一个字节
B = *((char xdata *) 0x0000); // 从地址0000H读一个字节
XBYTE[0x7500] = 0xf0; // 写一个字节到7500H
51单片机的最终一个存储空间为64K, 和CODE 区相同选用16 位寻址,归于外部数据存储区,即XDATA区。这个区一般包含一些RAM器材(如SRAM)或是一些需求经过总线接口的外围器材(特权在曾经的BLOG里屡次谈过这个扩展RAM的问题,这儿也不多触及了)。对XDATA的读写操作需求至少两个处理周期来装入地址,而读写又需求两个处理周期。