1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

標題: ADC0809模數轉換與顯示-詳細解釋版 [打印本頁]

作者: ziba108    時間: 2018-6-14 11:14
標題: ADC0809模數轉換與顯示-詳細解釋版
ADC0809模數轉換與顯示

ADC0809模數轉換并顯示過程對于初學者來講比較難理解的部分,所以把轉換程序詳細的

解釋對于初學者有很大的幫助。

程序解釋部分如下:

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

/*名稱:ADC0809數模轉換與顯示
  說明:ADC0809采樣通道3輸入的
  模擬量,轉換后的結果顯示在數碼管上。*/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

/*各數字的數碼管段碼,共陰*/
uchar code LEDData[]= {
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};

sbit OE  = P1^0;  //輸出使能,OE=0高阻,OE=1 ADC轉換結果輸出到單片機
sbit EOC = P1^1;  //轉換結束信號,EOC=0 表示ADC正在轉換 EOC=1 ADC轉換結束
sbit ST  = P1^2;  //啟動信號,上升沿復位清零ADC,下降沿啟動轉換,低電平保持轉換
sbit CLK = P1^3;  //時鐘信號,一般500KHz始終信號

/*延時*/
void DelayMS(uint ms) {
        uchar i;
        while(ms--) {
             for(i=0;i<120;i++);
        }
}

/*ADC0809輸入電壓0-5v對應數字信號00H-FFH,也就是0-255.
模擬輸入看成X,數字輸出看成Y則Y=255*X/5=51*X,前提條件
VREF+=5V,VREF-=0V.如:X=2.5V Y=51*2.5=127
*/
/*顯示轉換結果*/
void Display_Result(uchar d)  {
        P2 = 0xf7;  /*11110111,第4個數碼管顯示個位數*/
        P0 = LEDData[d%10];/*Y=51*2.5=127 個位=127%10=7*/
        DelayMS(5);
        P2 = 0xfb;  /*11111011,第3個數碼管顯示十位數*/
        P0 = LEDData[d%100/10];/*Y=51*2.5=127 十位=127%100/10=2*/
        DelayMS(5);
        P2 = 0xfd;  /*11111101,第2個數碼管顯示百位數*/
        P0 = LEDData[d/100];/*Y=51*2.5=127 百位=127/100=1*/
        DelayMS(5);
}

/*主程序*/
void main()  {
        TMOD = 0x02;/*M1=1,M0=0,T0定時器,工作模式2
                      如果TMOD = 0x01,M1=0,M0=1,T0定時器,工作模式1*/
/*
       TMOD=0x21; 00100001
       TM0D的高四位配置T1也就是你說的0010 這個是設置定時\計數器1的
       低四位配置T0也就是你說的0001是設置定時器0的.
       所以你說的TMOD = 0x21,00100001,是將定時器1設置與工作方式2.將定時器0設置成工作方式1.
*/
        TH0  = 0x14;/*20us發生溢出中斷一次,定時器專用寄存器,TH0高位*/
        TL0  = 0x00;/*定時器專用寄存器,TL0地位,
                    當TL0滿了后自動清零同時TH0進一位,當TL0,TH0都滿了會發生溢出中斷*/

        IE   = 0x82;/*10000010,EA=1,中斷總開關允許,ET=1,溢出中斷允許*/
        TR0  = 1;    /*啟動定時器*/
        P1   = 0x3f;/*選擇ADC0809的通道3(0111)*/
        while(1) {
                 ST = 0;ST = 1;ST = 0;/*啟動A/D轉換,上升沿復位清零ADC,下降沿啟動轉換,低電平保持轉換*/
                while(EOC == 0);     /*等待轉換完成,EOC=0 表示ADC正在轉換 EOC=1 ADC轉換結束*/
                OE = 1;              //輸出使能,OE=0高阻,OE=1 ADC轉換結果允許輸出到單片機
                Display_Result(P3);
                OE = 0;               //輸出使能,OE=0高阻
        }
}

/*T0定時器中斷給ADC0808提供時鐘信號*/
void Timer0_INT() interrupt 1 {
        CLK = !CLK;  /*每20us發生溢出中斷一次,給AD0809提供時鐘信號*/
}
-------------------------------------







作者: ziba108    時間: 2018-6-21 16:35
這個也很經典
http://www.raoushi.com/bbs/dpj-124435-1.html
作者: acne    時間: 2018-7-12 17:19
學些了
作者: yumozhang    時間: 2018-7-12 20:22
好東西,下去仔細看看
作者: kwglhm    時間: 2018-7-12 22:08
感謝!
作者: 51學習者n    時間: 2019-7-6 21:39
想問一下樓主,這個做出來量程應改為多少,為什么我電位器調成零數碼管還有數顯示,而且我把參考電壓調成2.5V后,量程變大了。可否解答
作者: NEkoii    時間: 2019-7-6 23:50
感謝樓主!
作者: wyhmtt    時間: 2019-7-29 15:28
很好很好
作者: wwcooler    時間: 2019-11-25 09:39
講的太詳細了!非常感謝這位師傅!
作者: xuanzehuiqu    時間: 2019-11-25 13:28
非常詳細,認真學習
作者: 雷鎮瑋    時間: 2020-5-13 23:59
感謝感謝 幫了大忙
作者: 1727207816    時間: 2020-5-14 10:11
為什么ADC0809的數字量輸出端口與單片機P3口的通道不是一一對應的?比如OUT1怎么對應P3.7了
作者: chen123456.    時間: 2020-5-16 23:03
謝謝樓主分享
作者: 254+123    時間: 2020-11-7 17:13
怎么還加一個數碼管顯示通道號




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