找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3720|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

求助51單片機(jī)怎樣通過(guò)索引獲取地址中的數(shù)據(jù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
50黑幣
我的目的是在數(shù)據(jù)數(shù)組中存放著一組數(shù)據(jù),然后通過(guò)另一個(gè)數(shù)組所謂索引儲(chǔ)存著數(shù)據(jù)數(shù)組的地址,然后在主函數(shù)中只需要通過(guò)指針訪問(wèn)索引中的數(shù)據(jù)數(shù)組的地址就可以獲得數(shù)據(jù)。
麻煩大神幫忙找下問(wèn)題點(diǎn),提供點(diǎn)思路
/////////////////////////////////
#include "reg51.h"
#include "intrins.h"
//測(cè)試工作頻率為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;                                //啟動(dòng)定時(shí)器
    ES = 1;                                     //使能串口中斷
    EA = 1;
}
void UART1_Interrupt() interrupt 4
{
    if (TI)
    {
        TI = 0;                                 //清中斷標(biāo)志
        P10 = !P10;                             //測(cè)試端口
    }
    if (RI)
    {
        RI = 0;                                 //清中斷標(biāo)志
        P11 = !P11;                             //測(cè)試端口
    }
}
void main()
{
   unsigned int j,*addr;
       
   UART1_init();
       
        j=address[1];//將address中儲(chǔ)存的地址賦給j
        *addr=j;//將j的地址賦給指針
        SBUF=*addr;
       
    while (1);
}
////////////////////////////////////////////////////////////
{

最佳答案

查看完整內(nèi)容

你這樣用指針就把你的程序玩壞了。 unsigned char code dat[4]={0x11, 0x22, 0x33, 0x44}; unsigned char *pAddr; 如果讓pAddr = &dat[0]; 那么*pAddr和pAddr[0]則為0x11; 如果繼續(xù)進(jìn)行如下操作:pAddr++; 那么*pAddr和pAddr[0]則為0x22; 如果此時(shí)重新給指針賦值:pAddr = &dat[3]; 那么*pAddr和pAddr[0]則為0x44; 如果繼續(xù)進(jìn)行如下操作:pAddr--; 那么*pAddr和pAddr[0]則為0x33; 且*(pAddr+1)和pAddr[1]則 ...
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:804115 發(fā)表于 2020-8-3 09:41 | 只看該作者
你這樣用指針就把你的程序玩壞了。
unsigned char code dat[4]={0x11, 0x22, 0x33, 0x44};
unsigned char *pAddr;

如果讓pAddr = &dat[0];
那么*pAddr和pAddr[0]則為0x11;

如果繼續(xù)進(jìn)行如下操作:pAddr++;
那么*pAddr和pAddr[0]則為0x22;

如果此時(shí)重新給指針賦值:pAddr = &dat[3];
那么*pAddr和pAddr[0]則為0x44;

如果繼續(xù)進(jìn)行如下操作:pAddr--;
那么*pAddr和pAddr[0]則為0x33;
且*(pAddr+1)和pAddr[1]則為0x44;

總結(jié):將指針指向某個(gè)數(shù)組地址后,該指針則存儲(chǔ)其對(duì)應(yīng)數(shù)組的起始地址,指針如果增加或者減小,它存儲(chǔ)的地址就相應(yīng)的偏移,且偏移的大小由指針定義時(shí)的類型來(lái)決定。我們這個(gè)例子是uchar型,所以是8bit。我們隨時(shí)可以用*或者數(shù)組的方式從對(duì)應(yīng)的地址取出數(shù)據(jù)。取出數(shù)據(jù)的寬度是指針類型的寬度,與數(shù)組無(wú)關(guān)。

例如:
對(duì)于32位的單片機(jī):
unsigned char code dat[4]={0x11, 0x22, 0x33, 0x44};
unsigned int *pAddr;
那么pAddr[0]或者*pAddr的值是多少呢?
在小端模式下:答案是0x44332211
在小端模式下:答案是0x11223344
你可以測(cè)試一下 51是什么模式。

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:298952 發(fā)表于 2020-8-3 10:40 | 只看該作者
那個(gè)中斷中的P10和P11那句請(qǐng)忽略
回復(fù)

使用道具 舉報(bào)

地板
ID:275826 發(fā)表于 2020-8-3 10:50 | 只看該作者
定義指針變量就可以查數(shù)組元素了
回復(fù)

使用道具 舉報(bào)

5#
ID:298952 發(fā)表于 2020-8-3 14:26 | 只看該作者
已解決
#include "reg51.h"
#include "intrins.h"
//測(cè)試工作頻率為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;                                //啟動(dòng)定時(shí)器
    ES = 1;                                     //使能串口中斷
    EA = 1;
}
void UART1_Interrupt() interrupt 4
{
    if (TI)
    {
        TI = 0;                                 //清中斷標(biāo)志
    }
    if (RI)
    {
        RI = 0;                                 //清中斷標(biāo)志
    }
}
void main()
{
        unsigned int i;
   unsigned int *addr;
       
   UART1_init();

        addr=address[0];
        for(i=0;i<4;i++)
        {
        num[i]=*addr;//將address中儲(chǔ)存的地址賦給j
       
                addr++;
        }
       
       
    while (1);
}

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:298952 發(fā)表于 2020-8-3 14:28 | 只看該作者
修改索引數(shù)組數(shù)據(jù)類型,索引數(shù)據(jù)類型改為32位
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表