新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC單片機內部A/D轉換

        PIC單片機內部A/D轉換

        作者: 時間:2014-01-13 來源:網絡 收藏

        //需求,將板子上電位器接RA0,設置PIC的AD相關,顯示電壓
        #includepic.h>
        __CONFIG(0x3831);//配置位18323831
        #define uint unsigned int
        #define uchar unsigned char

        //共陰數碼管(板子上用了達林頓管ULN2003,反向器)
        const unsigned char table[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f};

        //加小數點的共陰數碼管顯示,非常不錯
        const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
        0x87,0xff,0xef};
        void init();//數碼管,和AD相關設置
        uint get_ad();//獲取電壓值,其中包括AD讀取,及AD值轉電壓值的處理,返回值為uint型,精度保留小數點后3位
        void delay_ms(int z);
        void disp(uchar num1,uchar num2,uchar num3,uchar num4);//數碼管動態掃描
        void main()
        {
        uint lednum;//
        uchar num1,num2,num3,num4;//高兩位接RA1和RA0用不到了
        init();
        while(1)
        {
        lednum=get_ad();
        num1=lednum/1000;//求模即取整
        num2=lednum/100%10;
        num3=lednum/10%10;
        num4=lednum%10;
        disp(num1,num2,num3,num4);
        }
        }
        void init()//數碼管,和AD相關設置
        {
        TRISA=0x01;//RA0設置為輸入,用于AD模擬信號輸入
        TRISD=0;//接數碼管段選IO設置為輸出
        PORTA=0;
        PORTD=0;
        ADCON0=0x41;//選擇8分頻(4M/8=0.5MHz)時鐘頻率即8倍時鐘周期,開AD
        ADCON1=0x8E;//選擇結果右對齊,ADRESH高6位讀作0,選擇A通道以電源VDD VSS作參考電壓
        delay_ms(10);//延時等待AD穩定

        }
        //獲取電位器電壓,PIC內部AD
        uint get_ad()//一般做工程的時候帶個通道參數,讀取幾通道直接帶通道數就可以
        {
        //實際中要進行數字濾波(如20個數取平均值,然后將其返回去,濾波算法有很多,平均值是一種而已)
        uint adval;//存放AD的值
        float advalf;//存放AD值轉換為的電壓值
        ADGO=1;//開始轉換,ADGO與GODONE宏定義一致
        while(ADGO);//完,硬件自動清零ADGO
        adval=ADRESH;//先讀AD高8位寄存器的低二位
        adval=adval8|ADRESL;
        advalf=adval/1023.0*5.0;//1023為電位器顯示的最大值,假設板子電壓為5v時
        adval=advalf*1000;//精度取小數點后三位,如4.2356,則讀為4.235
        return(adval);

        }
        void disp(uchar num1,uchar num2,uchar num3,uchar num4)//數碼管動態顯示
        {
        PORTD=table1[num1];
        PORTA=0x20;//0010 0000
        delay_ms(2);
        PORTD=table[num2];
        PORTA=0x10;//0001 0000
        delay_ms(2);
        PORTD=table[num3];
        PORTA=0x08;//0000 1000
        delay_ms(2);
        PORTD=table[num4];
        PORTA=0x04;//0000 0100
        delay_ms(2);
        }
        void delay_ms(int z)
        {
        int x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 旅游| 松原市| 西昌市| 汝州市| 名山县| 长乐市| 安国市| 金川县| 静海县| 安吉县| 乃东县| 清苑县| 桐乡市| 宾阳县| 临洮县| 黄浦区| 赣州市| 云安县| 壤塘县| 蓝田县| 和田县| 临沧市| 麻阳| 察雅县| 青河县| 亚东县| 洛扎县| 陇川县| 色达县| 兰溪市| 固安县| 治多县| 道孚县| 亳州市| 哈密市| 九龙坡区| 大港区| 西林县| 中卫市| 慈溪市| 南康市|