欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)將ADC的轉(zhuǎn)換值裝入數(shù)組打印出來出錯(cuò),是什么原因? [打印本頁]

作者: 憶1709    時(shí)間: 2021-6-12 13:07
標(biāo)題: 單片機(jī)將ADC的轉(zhuǎn)換值裝入數(shù)組打印出來出錯(cuò),是什么原因?
51單片機(jī),將ADC的轉(zhuǎn)換結(jié)果通過PC串口打印出來,發(fā)現(xiàn)打印值不對(duì)。
如下代碼:
unsigned char arry[2];    //定義1個(gè)字符型數(shù)組GetAdc_Result();             //運(yùn)行ADC轉(zhuǎn)換函數(shù),這一步ADC_RES和ADC_RESL這兩個(gè)8位結(jié)果寄存器會(huì)存入轉(zhuǎn)換值
arry[0] = ADC_RES;         //將ADC_RES寄存器的值存入數(shù)組第0個(gè)元素
arry[1] = ADC_RESL;       //將ADC_RESL寄存器的值存入數(shù)組第1個(gè)元素
SendUart(arry[0]);          //串口打印ADC_RES
SendUart(arry[1]);          //串口打印ADC_RESL

實(shí)際驗(yàn)證,用串口打印arry[0]和arry[1],打印出來的值不對(duì),分別是0x80和0x00,非實(shí)際ADC值,不知道是什么原因:

我做了如下分析:


① 嘗試將ADC_RES和ADC_REL改為16進(jìn)制的數(shù)字,比如改成0x01,0x02,打印出來就是0x01,0x02,說明串口工作沒問題,數(shù)組調(diào)用也沒問題。
② 不采用數(shù)組形式,將ADC轉(zhuǎn)換值直接打印,如下,打印出來值跟ADC實(shí)際值相符,說明ADC轉(zhuǎn)換沒有問題。
unsigned char arry[2];    //定義1個(gè)字符型數(shù)組GetAdc_Result();             //運(yùn)行ADC轉(zhuǎn)換函數(shù),這一步ADC_RES和ADC_RESL這兩個(gè)8位結(jié)果寄存器會(huì)存入轉(zhuǎn)換值
SendUart(ADC_RES);          //串口打印ADC_RES
SendUart(ADC_RESL);          //串口打印ADC_RESL

那就奇了怪了,串口工作正常,ADC轉(zhuǎn)換正常,數(shù)組調(diào)用也正常,將轉(zhuǎn)換值裝進(jìn)數(shù)組就不正常了,到底是哪里出現(xiàn)了問題呢?頭疼。
望大神指點(diǎn)下,實(shí)在找不到原因了,多謝!

作者: wulin    時(shí)間: 2021-6-12 17:26
10位AD轉(zhuǎn)換值0x0000~0x03ff,在默認(rèn)狀態(tài)ADC_RES保存高8位,ADC_RESL保存低2位。
AD_V=ADC_RES<<2|ADC_RESL;
arry[0] = AD_V>>8;         //將16位數(shù)據(jù)AD_V高8位存入數(shù)組第0個(gè)元素
arry[1] = AD_V;       //將16位數(shù)據(jù)AD_V低8位存入數(shù)組第1個(gè)元素
SendUart(arry[0]);          //串口打印ADC_RES
SendUart(arry[1]);          //串口打印ADC_RESL

作者: 706718242    時(shí)間: 2021-6-12 21:02
adc幾位的?你的數(shù)組是8位的,adc的值超過數(shù)組大小就出錯(cuò)了。
作者: 706718242    時(shí)間: 2021-6-12 21:04
直接把寄存器的值打印試試
作者: liuzx66    時(shí)間: 2021-6-13 21:14
看下ADC_RES和ADC_RESL這兩個(gè)的定義,把數(shù)組定義成一樣的類型
作者: maijinzhi    時(shí)間: 2021-6-13 22:29
要注意傳送的是高位先,還是低位
作者: 熱愛編程    時(shí)間: 2021-6-13 23:09
先去確認(rèn)你的結(jié)果寄存器的值是對(duì)的。
作者: 憶1709    時(shí)間: 2021-6-14 16:28
wulin 發(fā)表于 2021-6-12 17:26
10位AD轉(zhuǎn)換值0x0000~0x03ff,在默認(rèn)狀態(tài)ADC_RES保存高8位,ADC_RESL保存低2位。
AD_V=ADC_RES8;         / ...


謝謝你的指點(diǎn),但有些地方?jīng)]看明白
AD_V=ADC_RES<<2|ADC_RESL;   

----這一行代碼將ADC_RES左移2位,那ADC_RES的高2位不就沒有了嗎,然后跟ADC_RESL進(jìn)行位或,得到的結(jié)果不是丟掉了高2位的10位ADC數(shù)據(jù)中的低8位數(shù)據(jù)嗎?我看ADC_RES和ADC_RESL都是8位寄存器。




作者: 憶1709    時(shí)間: 2021-6-14 16:33
706718242 發(fā)表于 2021-6-12 21:02
adc幾位的?你的數(shù)組是8位的,adc的值超過數(shù)組大小就出錯(cuò)了。

10位ADC,其高8位保存在ADC_RES這個(gè)結(jié)果寄存器中,其低2位保存在ADC_RESL這個(gè)結(jié)果寄存器中;如下:

1.png (29.77 KB, 下載次數(shù): 76)

1.png

作者: 憶1709    時(shí)間: 2021-6-14 16:36
liuzx66 發(fā)表于 2021-6-13 21:14
看下ADC_RES和ADC_RESL這兩個(gè)的定義,把數(shù)組定義成一樣的類型

數(shù)組定義的是unsigned char型,1個(gè)字節(jié);ADC_RES和ADC_RESL分別也是1個(gè)字節(jié)大小,這里應(yīng)該沒錯(cuò)吧
作者: cn_zhx    時(shí)間: 2021-6-15 15:13
憶1709 發(fā)表于 2021-6-14 16:28
謝謝你的指點(diǎn),但有些地方?jīng)]看明白
AD_V=ADC_RES

這里右移2位會(huì)存在一個(gè)臨時(shí)變量中。
作者: liuzx66    時(shí)間: 2021-6-15 15:40
本帖最后由 liuzx66 于 2021-6-15 15:46 編輯
憶1709 發(fā)表于 2021-6-14 16:36
數(shù)組定義的是unsigned char型,1個(gè)字節(jié);ADC_RES和ADC_RESL分別也是1個(gè)字節(jié)大小,這里應(yīng)該沒錯(cuò)吧

我覺得你應(yīng)該把錯(cuò)誤貼出來看看,你這樣描述不清。比方說實(shí)際值是多少,顯示的是多少
作者: liuzx66    時(shí)間: 2021-6-15 15:41
本帖最后由 liuzx66 于 2021-6-15 15:44 編輯
憶1709 發(fā)表于 2021-6-14 16:36
數(shù)組定義的是unsigned char型,1個(gè)字節(jié);ADC_RES和ADC_RESL分別也是1個(gè)字節(jié)大小,這里應(yīng)該沒錯(cuò)吧

這個(gè)我看錯(cuò)了,不好意思

作者: 憶1709    時(shí)間: 2021-6-15 15:56
謝謝各位,已找到問題原因,犯了一個(gè)小錯(cuò):
以下獲取ADC值的函數(shù)內(nèi) while(ADC_CONTR&ADC_FLAG==0); 這里沒有加括號(hào),正確應(yīng)該是 while((ADC_CONTR&ADC_FLAG)==0); 修改后一切正常!!


細(xì)節(jié)決定成敗啊!關(guān)鍵是我直接打印ADC_RES和ADC_RESL打印出來沒有問題,所以認(rèn)為ADC轉(zhuǎn)換部分是OK的.


錯(cuò)誤代碼:
void GetADC_Result(uchar ch)
{
  ADC_RES=0;ADC_RESL=0;
  ADC_CONTR = ADC_POWER| ADC_SPEEDHH| ADC_START|ch;   //電源開/90個(gè)CLK轉(zhuǎn)換頻率/開轉(zhuǎn)換/設(shè)定通道
  _nop_();_nop_();_nop_();_nop_();
  while(ADC_CONTR&ADC_FLAG==0); //等待轉(zhuǎn)換完成,注意(ADC_CONTR&ADC_FLAG)要括起來
  ADC_CONTR &= ~ADC_FLAG;  //清FLAG
}











歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1