修改索引数组数据类型,索引数据类型改为32位 |
已解决 #include "reg51.h" #include "intrins.h" //测试工作频率为11.0592MHz unsigned int dat[4]={0xb5b5,0xb5b6,0xb5b7,0xb5b8}; long code address[1]={&dat}; int num[4]; sfr T2L = 0xd7; sfr T2H = 0xd6; sfr AUXR = 0x8e; void UART1_init() { SCON = 0x50; T2L = 0xe8; //65536-11059200/115200/4=0FFE8H T2H = 0xff; AUXR = 0x15; //启动定时器 ES = 1; //使能串口中断 EA = 1; } void UART1_Interrupt() interrupt 4 { if (TI) { TI = 0; //清中断标志 } if (RI) { RI = 0; //清中断标志 } } void main() { unsigned int i; unsigned int *addr; UART1_init(); addr=address[0]; for(i=0;i<4;i++) { num[i]=*addr;//将address中储存的地址赋给j addr++; } while (1); } |
定义指针变量就可以查数组元素了 |
那个中断中的P10和P11那句请忽略 |
你这样用指针就把你的程序玩坏了。 unsigned char code dat[4]={0x11, 0x22, 0x33, 0x44}; unsigned char *pAddr; 如果让pAddr = &dat[0]; 那么*pAddr和pAddr[0]则为0x11; 如果继续进行如下操作:pAddr++; 那么*pAddr和pAddr[0]则为0x22; 如果此时重新给指针赋值:pAddr = &dat[3]; 那么*pAddr和pAddr[0]则为0x44; 如果继续进行如下操作:pAddr--; 那么*pAddr和pAddr[0]则为0x33; 且*(pAddr+1)和pAddr[1]则为0x44; 总结:将指针指向某个数组地址后,该指针则存储其对应数组的起始地址,指针如果增加或者减小,它存储的地址就相应的偏移,且偏移的大小由指针定义时的类型来决定。我们这个例子是uchar型,所以是8bit。我们随时可以用*或者数组的方式从对应的地址取出数据。取出数据的宽度是指针类型的宽度,与数组无关。 例如: 对于32位的单片机: unsigned char code dat[4]={0x11, 0x22, 0x33, 0x44}; unsigned int *pAddr; 那么pAddr[0]或者*pAddr的值是多少呢? 在小端模式下:答案是0x44332211 在小端模式下:答案是0x11223344 你可以测试一下 51是什么模式。 |