音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

指針問題

作者:MENHONGXI 欄目:ARM技術
指針問題
  我用了一個12位的AD,定義了一個指針*P,P[1]存高四位,P[0]存低八位,采集后存到一個整型變量SAVE,請問指針如何指向SAVE的字節(jié)?然后存入SAVE處理.

2樓: >>參與討論
computer00
試試這個
SAVE=P[1];
SAVE=(SAVE<<8)+P[0];

* - 本貼最后修改時間:2006-7-31 18:52:01 修改者:computer00

3樓: >>參與討論
MENHONGXI
圈圈
我用的是兩通道AD,我的程序大概如下,指針一般指向地址,怎么讓他指向save的字節(jié),這樣返回*p就可以了,如何處理?
unsigned int save;
main()
{
    save= a_b(0,??) 選擇0通道 采集到save處理.
 。
}
unsigned int a_b(unsigned CHAR channl,unsigned int *p)
{
   SWITCH(channl)
   {
      case 0:  
      case 1:
   }
   。校郏保;
  取P[0];
return *p;

}

4樓: >>參與討論
computer00
還是看不明白。你直接對save操作不就萬事詩口口了?
 
5樓: >>參與討論
MENHONGXI
忘了說了我用的是51的片子
忘了說了我用的是51的片子.
就是如何讓指針指向整型變量的字節(jié) ,P[1]指向第一個字節(jié),P[0]指向第2個字節(jié),這樣采集數(shù)據(jù)是字節(jié)移位采集,然后返回*P,就是一整型,CPU處理的肯定快.如何處理?

6樓: >>參與討論
xxqarm
你定義的SAVE是全局變量,直接操作就行了
圈圈的方法就行了,但是P[1]要右移8位,函數(shù)不須返回什么指針了.

7樓: >>參與討論
lenglx
c51的整數(shù)是大端在前的.
unsigned CHAR buf[2];
unsigned CHAR bufb[2];
buf[0]=hh;//高字節(jié)
buf[1]=ll;//低字節(jié)
...

unsigned int save = *((unsinged int *)buf);



//

8樓: >>參與討論
greatbin
考慮代碼兼容性,用00的寫法。樓上的沒有兼容性
 
9樓: >>參與討論
menhongxi
我寫的程序大概如下

//我寫的程序大概如下。 AD: 兩通道,12位。
//                     CPU:AT89C52
//編譯器 KeilC
//郵箱:menhongxi@yahoo.com.cn
/********************************************************************************************************/
#include <reg52.h>
#include <stdio.h>
#include <string.h>  
#include <intrins.h>
#include <ctype.h>
/*
*********************************************************************************************************
**AD I/O enactment
*********************************************************************************************************
*/
sbit DOUT =     P2^0;    //采集數(shù)據(jù)
sbit CS_SHDN =    P2^1;    //選通MCP3202     
sbit DIN     =     P2^2;    //寫命令選擇通道
sbit DCLK =     P2^3;    //使能

/*********************************************************************************************************/
unsigned int temperature_press (unsigned CHAR channel,unsigned int *p);    //通道選擇與溫度壓力讀取
void channel_order (unsigned CHAR order);    //讀取溫度或壓力命令寫入
void delay_us(unsigned CHAR n_us);            //微秒級延時

/*********************************************************************************************************/

unsigned int dout_buf;       //定義一整型變量,存儲采集到的數(shù)據(jù)
main()
{
    unsigned int dout;//存儲采集到的數(shù)據(jù)
    TMOD=0x01;
    CS_SHDN=0; //選通MCP3202
    while(1)
    {    
                
        dout=temperature_press(0,&dout_buf); //???這樣肯定不對
        //采集后做相應處理
                
        dout=temperature_press(1,&dout_buf); //???這樣肯定不對
        //采集后做相應處理        
    }

}

/*
*********************************************************************************************************
** 函數(shù)名稱 :temperature_press()
** 函數(shù)功能 :通道選擇,采集數(shù)據(jù)
** 入口參數(shù) :
** 出口參數(shù) :
*********************************************************************************************************
** 問題        : 不知道這樣組織函數(shù)對不對,怎么使*p 指向dout_buf的字節(jié)。
               把p分成p[1]與p[0]用,這樣返回*p就是整型數(shù)據(jù)    這樣CPU處理是最快的,因為采集時是字節(jié)間移位。
               因為我好象在哪見過這樣處理,但不知道怎么用了,好長時間了。

** 處理     :(1)如果采集高四位,向左移八位,在加上低八位,這樣不是最好。
              (2)直接(i=12;i>0;i--) 采集更不怎么好。
*********************************************************************************************************
*/
unsigned int temperature_press (unsigned CHAR channel,unsigned int *p )
{
    unsigned CHAR i;    //記數(shù)
    SWITCH(channel)
     {
        case 0:    channel_order(0x02);break;    //選擇溫度
        case 1:    channel_order(0x03);break;    //選擇壓力
    }

    for(i=4;i>0;i--)    //采集高四位  ,數(shù)據(jù)采集先采集高位,后采集低位
    {
        p[1]=p[1]<<1;
        DCLK=1;
        delay_us(2);
        DCLK=0;
        if(DOUT) p[1]=p[1]|0x01;
    }
        
    for(i=8;i>0;i--)       //采集低八位
    {
        p[0]=p[0]<<1;
        DCLK=1;
        delay_us(2);
        DCLK=0;
        if(DOUT) p[0]=p[0]|0x01;            
    }

  return *p;
}
/*
*********************************************************************************************************
** 函數(shù)名稱 :channel_order()
** 函數(shù)功能 :寫入采集溫度或壓力選擇通道命令
** 入口參數(shù) :
** 出口參數(shù) :
*********************************************************************************************************
*/

void channel_order (unsigned CHAR order)  
{
    unsigned CHAR i;
    unsigned CHAR com;    
        
    order<<=6;          //兩位數(shù)據(jù),先寫高位,在寫低位
    for(i=2;i>0;i--)
    {
        com=order&0x80;
        order=order<<1;                
        DCLK=1;
        delay_us(2);
        DCLK=0;
        if(com)    DIN=1;
        else    DIN=0;
    }
                    
}
/*
*********************************************************************************************************
** 函數(shù)名稱 :delay_us()
** 函數(shù)功能 :微秒級延時
** 入口參數(shù) :
** 出口參數(shù) :
*********************************************************************************************************
*/
void delay_us(unsigned CHAR n_us)
{
    TH0=0;
    TL0=0;
    TR0=1;
    while(TL0 < n_us){;}
    TR0=0;
}

10樓: >>參與討論
computer00
如果你這樣搞的話,函數(shù)就不用返回任何值了。
因為結(jié)果已經(jīng)在你傳入的指針中.

temperature_press(0,&dout_buf);

結(jié)果已經(jīng)在dout_buf中.

如果要放到dout中,只要temperature_press(0,&dout);即可,無須函數(shù)返回值.


這樣的函數(shù)只能在特定的CPU中使用, 可移植性不強,并且如果是在16位或者32位的系統(tǒng)中,這樣弄速度反而會更慢.


我認為在你的采集系統(tǒng)中,對速度要求并不嚴格,所以直接按16位的來操作即可.


unsigned int temperature_press (unsigned CHAR channel)
{
unsigned CHAR i;    //記數(shù)
unsigned result;

SWITCH(channel)
  {
   case 0:    channel_order(0x02);break;    //選擇溫度
   case 1:    channel_order(0x03);break;    //選擇壓力
  }

for(i=12;i>0;i--)    //讀AD
  {   
   DCLK=1;
   result<<=1;
   delay_us(2);   //如果覺得result<<=1產(chǎn)生的延時已經(jīng)夠了,那么該延時函數(shù)不要也可
   DCLK=0;
   if(DOUT)
    {
     result++;
    }
  }
return result;
}



只樣直接調(diào)用即可,不用考慮是什么處理器,

#define TEMPERATURE 0

dout=temperature_press(TEMPERATURE);


參與討論
昵稱:
討論內(nèi)容:
 
 
相關帖子
怎么用easyjtag調(diào)試LPC2136
“NO disassembly could be read at the requested address ”
請問周工的ADS1.2程序的代碼能在RealView2.2下運行嗎?
請教2103問題
LPC2148內(nèi)部程序能否加密?我想用它接NAND做U盤
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號