新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 咱們的ADC0809電壓表

        咱們的ADC0809電壓表

        作者: 時間:2016-11-28 來源:網絡 收藏
        ///////通道編號的數碼管顯示函數///////
        void disp_in(uchar a)
        {
        ADD_A = 0;
        ADD_B = 0;
        ADD_C = 0;
        P0 = numtable[a];
        delay(3);
        }
        ///////通道1的AD轉換函數///////
        void ADC_1()
        {
        STA_ALE = 0;
        STA_ALE = 1;
        ADD_A = 1;
        ADD_B = 0;
        ADD_C = 1;
        ADC_B = 0;
        ADC_A = 0;
        STA_ALE = 0;
        }
        ///////通道2的AD轉換函數///////
        void ADC_2()
        {
        STA_ALE = 0;
        STA_ALE = 1;
        ADD_A = 1;
        ADD_B = 0;
        ADD_C = 1;
        ADC_B = 0;
        ADC_A = 1;
        STA_ALE = 0;
        }
        ///////判別是哪條通道AD轉換函數///////
        void ADC(uchar ad_dat)
        {
        if (1 == keynum)
        {
        ADC_1();
        disp();
        disp_in(1);
        }
        else if (2 == keynum)
        {
        ADC_2();
        disp();
        disp_in(2);
        }
        else if (3 == keynum)
        {
        TR1 = 1;
        if (!shift)
        {
        ADC_1();
        disp();
        disp_in(1);
        }
        if (shift)
        {
        ADC_2();
        disp();
        disp_in(2);
        }
        }
        else if (16 == keynum)
        {
        ADC_2();
        disp();
        disp_in(2);
        }
        while ( 0 == OE_EOC )
        {
        keyscan();
        if (1 == keynum)
        {
        disp();
        disp_in(1);
        }
        else if (2 == keynum)
        {
        disp();
        disp_in(2);
        }
        else if (3 == keynum)
        {
        TR1 = 1;
        if (!shift)
        {
        disp();
        disp_in(1);
        }
        if (shift)
        {
        disp();
        disp_in(2);
        }
        }
        }
        temp = ad_dat*0.0196078;
        val_int = (uchar) temp;
        val_decimal = (uchar) ((temp - val_int)*100);
        }
        ///////定時器初始化函數//////
        void timer_init()
        {
        IE = 0x8a;
        TMOD = 0x12;
        TH0 = 0x14;
        TL0 = 0x00;
        TR0 = 1;
        TH1 = -50000/256;
        TL1 = -50000%6;
        }
        ///////主函數//////
        int main ()
        {
        timer_init();//初始化定時器
        while(1)
        {
        keyscan();//矩陣鍵盤掃描賦值
        if (1 == keynum || 2 == keynum || 3== keynum) //當有鍵按下時,啟動ADC轉換
        ADC(P2);
        else //否則顯示四個0
        {
        disp();
        disp_in(0);
        }
        }
        return 0;
        }
        ///////1S顯示切換的定時中斷函數(T1)//////
        void TIMER(void) interrupt 3
        {
        static uchar timer;
        timer++;
        if (20 == timer)
        {
        timer = 0;
        shift = !shift;//用于兩位的1S顯示切換
        }
        }
        ///////提供給ADC芯片CLOCK的定時函數(T0)//////
        void OTHER_CLOCK(void) interrupt 1
        {
        CLK = !CLK;
        }
        說說主要遇到的問題和學到的東西:一個是因為用了等待查詢方式來讀取ADC0809的AD轉換結果,加上矩陣鍵盤和38譯碼器選址,導致兩個問題:
        1.各個功能的邏輯關系混亂。雖然只有幾個功能模塊,但是也思考了一番才有了新的程序架構。還有就是始終沒能適應自頂向下的編程思維,比如會習慣先編出ADC的START信號或者選址函數,再去想用在哪里。而不是先直接構造一個ADC處理的框架,再去想細節的實現。
        2.還有數碼管動態顯示不停閃爍。調試的時候,也老想著,應該就是這樣了吧,改不了了吧,呵呵,可是解決之后再次覺得天無絕人之路啊,
        ADD_A = 1;
        ADD_B = 0; 這段語句起初P0 = numtable_DE[val_int];是放在首位的,結果想想是不是因為用38
        ADD_C = 0; 譯碼器控制位選擾亂了下一位的段選,移一下位就搞定了……真是奇妙
        P0 = numtable_DE[val_int];
        delay(1);
        團隊合作的效率這次體現得很明顯,特別是繁瑣的畫圖,可是因為大家實踐比較少,結果很不幸犯了很基礎的錯誤,導致成品沒有成功。不知道以后還有機會合作不
        上一頁 1 2 下一頁

        關鍵詞: ADC0809電壓

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 咸阳市| 会同县| 台中市| 冷水江市| 昌平区| 盐亭县| 常州市| 荃湾区| 屯门区| 清河县| 平顺县| 繁昌县| 舟山市| 建始县| 浦北县| 南部县| 内江市| 高州市| 江北区| 平阴县| 务川| 西城区| 博爱县| 林甸县| 阿荣旗| 工布江达县| 河津市| 吉隆县| 清远市| 同江市| 巴彦县| 台南市| 三门县| 湛江市| 乌兰浩特市| 镇远县| 新巴尔虎左旗| 韶山市| 聂荣县| 文山县| 同德县|