新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STC12C5A60S2單片機的10位AD轉換程序

        STC12C5A60S2單片機的10位AD轉換程序

        作者: 時間:2016-12-02 來源:網絡 收藏
        //****************************************STC12C5A60S2 AD轉換***********************************************//
        #include"stc12c5a.h" //頭文件在STC公司主頁上下載
        #include"stdio.h"
        #include"intrins.h"
        //------------------------------------------------------------------------------
        void AD_init();
        void serial_init();
        void delay(unsigned int a);
        float AD_work(unsigned char channel);
        unsigned int AD_get(unsigned char channel);
        //------------------------------------------------------------------------------
        void main()
        {
        AD_init(); //A/D轉換初始化
        serial_init(); //串口初始化
        while(1)
        {
        unsigned char i;
        for(i=0;i<8;i++) //循環發送P1.0-P1.7的轉換數值
        {
        TI=1; //使用printf函數前須先將發送標志位TI置1
        printf("The P1.%bd voltage is %f",i,AD_work(i));
        TI=0;
        delay(1000); //延時約1s
        }
        }
        }
        //------------------------------------------------------------------------------
        unsigned int AD_get(unsigned char channel)
        {
        ADC_CONTR=0x88|channel; //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
        _nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR寄存器
        while(!(ADC_CONTR&0x10)); //等待轉換完成
        ADC_CONTR&=0xe7; //關閉AD轉換,ADC_FLAG位由軟件清0
        return(ADC_RES*4+ADC_RESL); //返回AD轉換完成的10位數據(16進制)
        }
        //------------------------------------------------------------------------------
        float AD_work(unsigned char channel)
        {
        float AD_val; //定義處理后的數值AD_val為浮點數
        unsigned char i;
        for(i=0;i<100;i++)
        AD_val+=AD_get(channel); //轉換100次求平均值(提高精度)
        AD_val/=100;
        AD_val=(AD_val*5)/1024; //AD的參考電壓是單片機上的5v,所以乘5即為實際電壓值
        return AD_val;
        }
        //------------------------------------------------------------------------------
        void delay(unsigned int a) //延時約1ms
        {
        unsigned int i;
        while (--a!=0)
        for(i=600;i>0;i--); //1T單片機i=600,若是12T單片機i=125
        }
        //------------------------------------------------------------------------------
        void serial_init()
        {
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd; //設置9600波特率
        SCON=0x50; //串口方式1,允許接收
        TR1=1;
        }
        //------------------------------------------------------------------------------
        void AD_init()
        {
        P1ASF=0xff; //P1口全部作為模擬功能AD使用
        ADC_RES=0; //清零轉換結果寄存器高8位
        ADC_RESL=0; //清零轉換結果寄存器低2位
        ADC_CONTR=0x80;//開啟AD電源
        delay(2); //等待1ms,讓AD電源穩定
        }
        /*


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 应用必备| 镇坪县| 北辰区| 和龙市| 依安县| 保山市| 新宁县| 桐柏县| 齐齐哈尔市| 顺昌县| 财经| 通辽市| 亳州市| 惠州市| 黎平县| 尼玛县| 昂仁县| 会泽县| 开平市| 柘荣县| 汾西县| 嘉善县| 崇明县| 沽源县| 和田县| 司法| 武强县| 苗栗县| 无为县| 乌什县| 尤溪县| 五家渠市| 临桂县| 雷山县| 天气| 信阳市| 嘉黎县| 库车县| 凤山市| 木里| 昭苏县|