找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2622|回复: 5
打印 上一主题 下一主题
收起左侧

求助51单片机怎样通过索引获取地址中的数据

[复制链接]
跳转到指定楼层
楼主
50黑币
我的目的是在数据数组中存放着一组数据,然后通过另一个数组所谓索引储存着数据数组的地址,然后在主函数中只需要通过指针访问索引中的数据数组的地址就可以获得数据。
麻烦大神帮忙找下问题点,提供点思路
/////////////////////////////////
#include "reg51.h"
#include "intrins.h"
//测试工作频率为11.0592MHz
unsigned char code dat[1]={0x55};
unsigned char code address[1]={&dat};
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;                                 //清中断标志
        P10 = !P10;                             //测试端口
    }
    if (RI)
    {
        RI = 0;                                 //清中断标志
        P11 = !P11;                             //测试端口
    }
}
void main()
{
   unsigned int j,*addr;
       
   UART1_init();
       
        j=address[1];//将address中储存的地址赋给j
        *addr=j;//将j的地址赋给指针
        SBUF=*addr;
       
    while (1);
}
////////////////////////////////////////////////////////////
{

最佳答案

查看完整内容

你这样用指针就把你的程序玩坏了。 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]则 ...
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:804115 发表于 2020-8-3 09:41 | 只看该作者
你这样用指针就把你的程序玩坏了。
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是什么模式。

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:298952 发表于 2020-8-3 10:40 | 只看该作者
那个中断中的P10和P11那句请忽略
回复

使用道具 举报

地板
ID:275826 发表于 2020-8-3 10:50 | 只看该作者
定义指针变量就可以查数组元素了
回复

使用道具 举报

5#
ID:298952 发表于 2020-8-3 14:26 | 只看该作者
已解决
#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);
}

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:298952 发表于 2020-8-3 14:28 | 只看该作者
修改索引数组数据类型,索引数据类型改为32位
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表