|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(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 于 2006/7/31 14:52:00 發(fā)布:
試試這個 SAVE=P[1]; SAVE=(SAVE<<8)+P[0]; * - 本貼最后修改時間:2006-7-31 18:52:01 修改者:computer00 |
|
| 3樓: | >>參與討論 |
| 作者: MENHONGXI 于 2006/7/31 15:15:00 發(fā)布:
圈圈 我用的是兩通道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 于 2006/7/31 15:29:00 發(fā)布:
還是看不明白。你直接對save操作不就萬事詩口口了? |
|
| 5樓: | >>參與討論 |
| 作者: MENHONGXI 于 2006/7/31 15:40:00 發(fā)布:
忘了說了我用的是51的片子 忘了說了我用的是51的片子. 就是如何讓指針指向整型變量的字節(jié) ,P[1]指向第一個字節(jié),P[0]指向第2個字節(jié),這樣采集數(shù)據(jù)是字節(jié)移位采集,然后返回*P,就是一整型,CPU處理的肯定快.如何處理? |
|
| 6樓: | >>參與討論 |
| 作者: xxqarm 于 2006/7/31 17:48:00 發(fā)布:
你定義的SAVE是全局變量,直接操作就行了 圈圈的方法就行了,但是P[1]要右移8位,函數(shù)不須返回什么指針了. |
|
| 7樓: | >>參與討論 |
| 作者: lenglx 于 2006/7/31 19:23:00 發(fā)布:
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 于 2006/7/31 21:47:00 發(fā)布:
考慮代碼兼容性,用00的寫法。樓上的沒有兼容性 |
|
| 9樓: | >>參與討論 |
| 作者: menhongxi 于 2006/8/1 8:24:00 發(fā)布:
我寫的程序大概如下 //我寫的程序大概如下。 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 于 2006/8/1 8:43:00 發(fā)布:
如果你這樣搞的話,函數(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); |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |