![]() |
發布時間: 2021-6-12 13:07
正文摘要:51單片機,將ADC的轉換結果通過PC串口打印出來,發現打印值不對。 如下代碼: unsigned char arry[2]; //定義1個字符型數組GetAdc_Result(); / ... |
謝謝各位,已找到問題原因,犯了一個小錯: 以下獲取ADC值的函數內 while(ADC_CONTR&ADC_FLAG==0); 這里沒有加括號,正確應該是 while((ADC_CONTR&ADC_FLAG)==0); 修改后一切正常!! 細節決定成敗啊 ![]() 錯誤代碼: void GetADC_Result(uchar ch) { ADC_RES=0;ADC_RESL=0; ADC_CONTR = ADC_POWER| ADC_SPEEDHH| ADC_START|ch; //電源開/90個CLK轉換頻率/開轉換/設定通道 _nop_();_nop_();_nop_();_nop_(); while(ADC_CONTR&ADC_FLAG==0); //等待轉換完成,注意(ADC_CONTR&ADC_FLAG)要括起來 ADC_CONTR &= ~ADC_FLAG; //清FLAG } |
本帖最后由 liuzx66 于 2021-6-15 15:44 編輯 憶1709 發表于 2021-6-14 16:36 這個我看錯了,不好意思 |
本帖最后由 liuzx66 于 2021-6-15 15:46 編輯 憶1709 發表于 2021-6-14 16:36 我覺得你應該把錯誤貼出來看看,你這樣描述不清。比方說實際值是多少,顯示的是多少 |
憶1709 發表于 2021-6-14 16:28 這里右移2位會存在一個臨時變量中。 |
liuzx66 發表于 2021-6-13 21:14 數組定義的是unsigned char型,1個字節;ADC_RES和ADC_RESL分別也是1個字節大小,這里應該沒錯吧 |
wulin 發表于 2021-6-12 17:26 謝謝你的指點,但有些地方沒看明白 AD_V=ADC_RES<<2|ADC_RESL; ----這一行代碼將ADC_RES左移2位,那ADC_RES的高2位不就沒有了嗎,然后跟ADC_RESL進行位或,得到的結果不是丟掉了高2位的10位ADC數據中的低8位數據嗎?我看ADC_RES和ADC_RESL都是8位寄存器。 |
先去確認你的結果寄存器的值是對的。 |
要注意傳送的是高位先,還是低位 |
看下ADC_RES和ADC_RESL這兩個的定義,把數組定義成一樣的類型 |
直接把寄存器的值打印試試 |
adc幾位的?你的數組是8位的,adc的值超過數組大小就出錯了。 |
10位AD轉換值0x0000~0x03ff,在默認狀態ADC_RES保存高8位,ADC_RESL保存低2位。 AD_V=ADC_RES<<2|ADC_RESL; arry[0] = AD_V>>8; //將16位數據AD_V高8位存入數組第0個元素 arry[1] = AD_V; //將16位數據AD_V低8位存入數組第1個元素 SendUart(arry[0]); //串口打印ADC_RES SendUart(arry[1]); //串口打印ADC_RESL |