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

標題: 單片機怎么把AD讀出來的10位二進制的數轉化為10進制數? [打印本頁]

作者: czjlovezy    時間: 2018-12-9 19:33
標題: 單片機怎么把AD讀出來的10位二進制的數轉化為10進制數?
怎么把AD讀出來的10位二進制的數轉化為10進制數?我用的STC12C5A60S2單片機。

作者: HC6800-ES-V2.0    時間: 2018-12-10 08:19
你的問題有兩個方面:
第一:將讀到的AD值(10位),放到一個int類型的變量里。
第二:逐位(只管有用的10位),做數學計算。
舉例:
假設取得的10位數據是1010101010,那么變量中的值就是0000001010101010
這個值的十進制數的值(從最左高位算起),就是1*2^9+0*2^8+1*2^7+0*2^6+1*2^5+0*2^4+1*2^3+0*2^2+1*2^1+0*2^0=512+0+128+0+32+0+8+0+2+0=682
這就是二進制與十進制的換算過程。

作者: jefelee    時間: 2018-12-10 08:25

STC12C5A60S2 AD 轉換
  STC系列單片機中的STC89LE516AD/X2提供了8路8位精度的高速A/D轉換器,位于P1口上,從而省去了片外ADC的麻煩。這8路ADC為電壓輸入型,可做按鍵掃描,電池電壓檢測,頻譜檢測等。ADC轉換過程需要17個機器周期。通過對相關功能寄存器的適當配置,就可以控制其工作。下面就對相關功能寄存器進行介紹。

    A/D轉換寄存器總表:



(1)       P1_ADC_EN:特殊功能寄存器

P1.x作為A/D轉換輸入通道來用允許特殊功能寄存器。相應位為“1”時,對應的P1.x口作為A/D轉換使用,內部上拉電阻自動斷開。



ADC_START是模擬/數字轉換(ADC)啟動控制位,設置為1時,開始轉換。

      ADC_FLAG是模擬/數字轉換結束標志位,當A/D轉換完成后,ADC_FLAG=1。

(3)       ADC_DATA: A/D轉換結果特殊功能寄存器

模擬/數字轉換結果計算公式為 結果=256×Vin/Vcc

Vin是模擬輸入通道輸入電壓,Vcc為單片機實際工作電壓,用單片機工作電壓作為模擬參考電壓。

         

    內置ADC的使用例程:

          STC_ADC.h:

sfr P1_ADC_EN=0x97;

sfr ADC_CONTR=0xc5;

sfr ADC_DATA=0xc6;



int GetAD(unsigned char channel)//channel為要取的通道號(0~7)

{

    unsigned char AD_finished=0;

    ADC_DATA=0;

    ADC_CONTR=channel;

    ADC_CONTR|=0x08;

    while(!AD_finished)

      AD_finished=(ADC_CONTR&0x10);

    ADC_CONTR&=0xF7;

    return (ADC_DATA);

}



void AD_Init(unsigned char ADin)// ADC 初始化,ADin為八位2進制數,分別對應AD7~0,置1代表打開此路

{

P1=P1|ADin;//要設置為A/D轉換的P1.x口,先設為高

P1_ADC_EN=ADin;

}











      _main.c:

#include

#include <stc_adc.h>



/*

-------------------------------------------------

    此程序用以說明STC單片機ADC的使用方法

-------------------------------------------------

*/



void delay(unsigned time)

{

while(time--);

}



void main()

{

AD_Init(0x63);//0110,0011,要設置為A/D轉換的P1.x口,先設置為高

             //0110,0011,P1的P1.0,P1.1,P1.5,P1.6設置為A/D轉換輸入腳

                     //斷開P1.0,P1.1,P1.5,P1.6內部上拉電阻

while(1)

{

  P2=GetAD(0);

  delay(10000);

  P2=GetAD(1);

  delay(10000);

  P2=GetAD(5);

  delay(10000);

  P2=GetAD(6);

  delay(10000);

}

}


作者: czjlovezy    時間: 2018-12-10 16:37
HC6800-ES-V2.0 發表于 2018-12-10 08:19
你的問題有兩個方面:
第一:將讀到的AD值(10位),放到一個int類型的變量里。
第二:逐位(只管有用的10位 ...

那在程序中怎么實現?比如說從左到右的二位1*2^1要先把數全部向左移使高位全部清零然后右移回來讓地位也全部清零再相乘?
作者: czjlovezy    時間: 2018-12-10 16:41
HC6800-ES-V2.0 發表于 2018-12-10 08:19
你的問題有兩個方面:
第一:將讀到的AD值(10位),放到一個int類型的變量里。
第二:逐位(只管有用的10位 ...

我之前有把AD的值讀到一個16位的變量中,然后把這個變量直接和10進制數相乘,然后這個結果是幾進制的?
作者: wu_expect    時間: 2020-3-27 23:38
czjlovezy 發表于 2018-12-10 16:41
我之前有把AD的值讀到一個16位的變量中,然后把這個變量直接和10進制數相乘,然后這個結果是幾進制的?

與多少進制的數相運算自動變成多少進制!
作者: 左岸的花會開    時間: 2020-3-28 17:15
數據幾進制沒有區別,只是機器碼與人類習慣的區別,跟數值大小沒有任何關系的,就相當于十六0X10與十進制16,是相等的,你可以直接拿你轉換出來的二進制數據直接與十進制進行比較的,你要是拿轉換出來的數據進行其他處理的話,就另說了,如果要自己比較就是數學運算轉化一下
作者: 余生不負    時間: 2020-3-28 18:55
STC單片機讀出來的數據本來就是十進制數,0-1023
作者: www12www    時間: 2020-4-1 22:42
adad/1024*οVrefλλ
作者: boboxuexi    時間: 2020-4-2 08:03
為什么要轉換?




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