新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STC12C5620AD系列A/D轉(zhuǎn)換C語(yǔ)言程序

        STC12C5620AD系列A/D轉(zhuǎn)換C語(yǔ)言程序

        作者: 時(shí)間:2016-11-22 來(lái)源:網(wǎng)絡(luò) 收藏
        #include "STC12C5620AD.H"

        //---------------------------------------------------------------------
        typedef unsigned char INT8U;
        typedef unsigned int INT16U;
        //---------------------------------------------------------------------
        //以下選擇 ADC 轉(zhuǎn)換速率,只能選擇其中一種
        // SPEED1 SPEED0 A/D轉(zhuǎn)換所需時(shí)間
        #define AD_SPEED 0x60 //0110,0000 1 1 270個(gè)時(shí)鐘周期轉(zhuǎn)換一次,
        // CPU工作頻率27MHz時(shí),
        // A/D轉(zhuǎn)換速度約100KHz
        //#define AD_SPEED 0x40 //0100,0000 1 0 540個(gè)時(shí)鐘周期轉(zhuǎn)換一次
        //#define AD_SPEED 0x20 //0010,0000 0 1 810個(gè)時(shí)鐘周期轉(zhuǎn)換一次
        //#define AD_SPEED 0x00 //0000,0000 0 0 1080個(gè)時(shí)鐘周期轉(zhuǎn)換一次
        //---------------------------------------------------------------------
        void initiate_RS232 (void); // 串口初始化
        void Send_Byte(INT8U one_byte); // 發(fā)送一個(gè)字節(jié)
        INT16U get_AD_result(INT8U channel);
        void delay(INT8U delay_time); // 延時(shí)函數(shù)
        //---------------------------------------------------------------------
        void main()
        {
        INT16U ADC_10bit;

        本文引用地址:http://www.104case.com/article/201611/319667.htm

        initiate_RS232(); //波特率 = 9600

        ADC_CONTR |= 0x80; //1000,0000 打開(kāi) A/D 轉(zhuǎn)換電源
        while(1)
        {
        Send_Byte(0xAA);
        Send_Byte(0xAA);

        ADC_10bit = get_AD_result(2);//P1.2 為 A/D 當(dāng)前通道
        Send_Byte(ADC_10bit >> 8); //發(fā)送高 8 位測(cè)量結(jié)果
        delay(0x1);

        ADC_10bit = get_AD_result(3);//P1.3 為 A/D 當(dāng)前通道, 測(cè)量并發(fā)送結(jié)果
        Send_Byte(ADC_10bit >> 8); //發(fā)送高 8 位測(cè)量結(jié)果

        delay(0x30); //延時(shí)
        }
        }
        //---------------------------------------------------------------------
        void delay(INT8U delay_time) // 延時(shí)函數(shù)
        {
        INT16U n;
        while(delay_time--)
        {
        n = 6000;
        while(--n);
        }
        }
        //---------------------------------------------------------------------
        void initiate_RS232 (void) // 串口初始化
        {
        ES = 0; // 禁止串口中斷
        TMOD = 0x20; // 設(shè)置 T1 為波特率發(fā)生器
        SCON = 0x50; // 0101,0000 8位數(shù)據(jù)位, 無(wú)奇偶校驗(yàn)
        TH1 = 0xFB; // 18.432MHz 晶振, 波特率 = 9600
        TL1 = 0xFB;
        RI = 0;
        TR1 = 1;
        ES = 1; // 允許串口中斷
        }
        //---------------------------------------------------------------------
        void Send_Byte(INT8U one_byte) // 發(fā)送一個(gè)字節(jié)
        {
        TI = 0; // 清零串口發(fā)送中斷標(biāo)志
        SBUF = one_byte;
        while (!TI);
        TI = 0; // 清零串口發(fā)送中斷標(biāo)志
        }
        //---------------------------------------------------------------------
        INT16U get_AD_result(INT8U channel)
        {
        ADC_DATA = 0;

        channel &= 0x07; //0000,0111 清0高5位
        ADC_CONTR = AD_SPEED;
        ADC_CONTR = 0xE0; //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位
        ADC_CONTR |= channel; //選擇 A/D 當(dāng)前通道
        delay(1); //使輸入電壓達(dá)到穩(wěn)定
        ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 啟動(dòng)A/D轉(zhuǎn)換,
        while (1) //等待A/D轉(zhuǎn)換結(jié)束
        {
        if (ADC_CONTR & 0x10) //0001,0000 測(cè)試A/D轉(zhuǎn)換結(jié)束否
        { break; }
        }
        ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 關(guān)閉A/D轉(zhuǎn)換,

        return (ADC_DATA<<8 | ADC_LOW2); //返回 A/D 10 位轉(zhuǎn)換結(jié)果



        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 衡南县| 田东县| 平远县| 吴忠市| 石门县| 贵德县| 翼城县| 康平县| 安义县| 石渠县| 谢通门县| 社会| 和静县| 措美县| 姚安县| 元阳县| 贵港市| 怀宁县| 河曲县| 玛多县| 铜梁县| 沈阳市| 筠连县| 泰宁县| 石泉县| 盘锦市| 天全县| 太仆寺旗| 昌黎县| 茶陵县| 玛纳斯县| 怀远县| 来宾市| 耿马| 界首市| 新野县| 和平县| 镇巴县| 三亚市| 北流市| 固始县|