欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

51單片機(jī)ADC0804模數(shù)轉(zhuǎn)換學(xué)習(xí)

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年07月10日   【字體:

數(shù)模轉(zhuǎn)換器ADC0804與單片機(jī)連接的原理圖:


 

這是TX-1C實(shí)驗(yàn)板上的ADC0804和單片機(jī)連接的電路原理圖。

左邊的是ADC0804,右邊的是74HC573鎖存器,鎖存器同時(shí)又連接了單片機(jī)沒(méi)畫(huà)出。ADC0804的引腳CSAD是片選引腳,因?yàn)槭堑碗娖接行援?dāng)

0時(shí),我們就可以選中它工作了。RD也是低電平有效,是讀信號(hào)的,WR也是低電平有效,當(dāng)送0時(shí)就可以啟動(dòng)A/D開(kāi)始轉(zhuǎn)換了。INTR是轉(zhuǎn)換結(jié)

束引腳,同樣也是低電平有效,當(dāng)INTR0時(shí),表示轉(zhuǎn)換結(jié)束了。DB0-DB7是轉(zhuǎn)換后的數(shù)字信號(hào)輸出端口。AGNDDGND是接地的。CLK R

CLK IN(即194引腳)是用來(lái)給ADC0804產(chǎn)生內(nèi)部時(shí)鐘脈沖的(接了一個(gè)RC震蕩電路)67端口是模擬信號(hào)的輸入端,比如我們滑動(dòng)電位器就

能使模擬信號(hào)發(fā)生改變,這樣經(jīng)過(guò)A/D轉(zhuǎn)換后,輸出的數(shù)字信號(hào)也就改變了。20引腳是接參考電平的。



 

下面這個(gè)程序是用單片機(jī)控制ADC0804進(jìn)行模數(shù)轉(zhuǎn)換,當(dāng)擰動(dòng)實(shí)驗(yàn)板上的電位器(也就是一個(gè)滑動(dòng)變阻器)時(shí),數(shù)碼管的前三位以十進(jìn)制方式動(dòng)態(tài)顯示A/D轉(zhuǎn)換后的數(shù)字量。代碼如下:


#include <reg52.h>         
//52系列單片機(jī)頭文件
#include <intrins.h>        //因?yàn)橄旅娴某绦蛴玫搅薩nop_()函數(shù),因此包含這個(gè)頭文件
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;           //申明U1鎖存器的鎖存端
sbit wela=P2^7;           //申明U2鎖存器的鎖存端
sbit adwr=P3^6;           //定義AD的WR(寫(xiě)信號(hào))端口
sbit adrd=P3^7;           //定義AD的RD(讀信號(hào))端口
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint);        //延時(shí)函數(shù)聲明
void display(uchar,uchar,uchar)   //顯示函數(shù)聲明

/*--------------------------模數(shù)轉(zhuǎn)換核心程序--------------------------------*/
void main()         
{

    uchar a,A1,A2,A3,adval;
    wela=1;            //打開(kāi)位選鎖存器,這樣就把單片機(jī)的P0口與鎖存器連通了
    P0=0x7f;           //這里因?yàn)槠x 接的是P0口的第7位,P0=0x7f即把第七位置0,片選選定,也即是選定ADC0804工作
    wela=0;                //關(guān)閉位選鎖存器
   
    while(1)           //進(jìn)入死循環(huán)不停地做模數(shù)轉(zhuǎn)換
    {
        adwr=1;        /*-----------------------------------------*/  
        _nop_();
        adwr=0;              / *啟動(dòng)AD轉(zhuǎn)換(根據(jù)時(shí)序圖來(lái)的)*/
        _nop_();
        adwr=1;       /*-----------------------------------------*/  
        
        for(a=10;a>0;a--)      
        {                                                                                                                                                      
            display(A1,A2,A3);     //兼具顯示和延時(shí)的作用,因?yàn)檗D(zhuǎn)換需要經(jīng)過(guò)一定的時(shí)間,用這個(gè)for循環(huán)可以起到延時(shí)的作用
        }
        
        P1=0xff;                    //讀取P1口之前先給其寫(xiě)全1
        
        adrd=1;                    //rd置1(根據(jù)時(shí)序圖可知)
        _nop_();                    //延時(shí)一個(gè)機(jī)器周期(根據(jù)時(shí)序圖可知)
        adrd=0;                     //rd置0(根據(jù)時(shí)序圖可知)
        _nop_();                    //延時(shí)一個(gè)機(jī)器周期
        adval=P1;            //A/D轉(zhuǎn)換后的數(shù)據(jù)賦給adval
        adrd=1;             //轉(zhuǎn)換后的數(shù)字信號(hào)(二進(jìn)制的信號(hào)應(yīng)該已經(jīng)譯成了十進(jìn)制了)讀出(也是根據(jù)時(shí)序圖可知)
        
        A1=adval/100;      /*-----------------------------------------*/  
        A2=adval%100/10;    /*分離轉(zhuǎn)換后的十進(jìn)制數(shù),用來(lái)給數(shù)碼管顯示*/
        A3=adval%10;       /*-----------------------------------------*/  

     }
}
/*-------------------------------------------------------------------------------*/

void delayms(uint xms)               
{
    uint i,j;
    for(i=xms;i>0;i--)              //i=xms即延時(shí)約xms毫秒
        for(j=110;j>0;j--);
}

void display(uchar bai,uchar shi,uchar ge)  //顯示子函數(shù)
{
    dula=1;
    P0=table[bai];   
    dula=0;
    P0=0xff;        
    wela=1;            
    P0=0x7e;        
    wela=0;
    delayms(5);        

    dula=1;
    P0=table[shi];
    dula=0;
    P0=0xff;
    wela=1;
    P0=0x7d;
    wela=0;
    delayms(5);

    dula=1;
    P0=table[ge];
    dula=0;
    P0=0xff;
    wela=1;
    P0=0x7b;
    wela=0;
    delayms(5);
}
程序中所說(shuō)的時(shí)序圖如下:

 

 

 


 

 

 

 

從時(shí)序圖可知首先要選定片選,即置CS=0,程序中一直讓cs為0,這樣一直選定其工作。對(duì)轉(zhuǎn)換沒(méi)有影響。再看WR的時(shí)序圖WR先是高-->低-->高,從低-->高這個(gè)過(guò)程中至少要延時(shí)tw(WR)L(ns),程序中用的的_nop()_函數(shù)就是延時(shí)一個(gè)機(jī)器周期,本實(shí)驗(yàn)板得機(jī)器周期為1000ns遠(yuǎn)大于tw(WR)L(ns)。再看RD

RD的時(shí)序是高-->低-->高,RD為低后延時(shí)tACC后就有數(shù)據(jù)了,adval=P1;            //A/D轉(zhuǎn)換后的數(shù)據(jù)賦給adval
于是再把wR拉高這樣就把數(shù)據(jù)讀走了。因?yàn)镮NTR是自動(dòng)變化的,所以不需要人為設(shè)定。。(以上個(gè)人理解不知道是否正確^-^)



 

呵呵,不同的轉(zhuǎn)換器時(shí)序圖應(yīng)該也不一樣,程序代碼也有差別,但本質(zhì)是一樣的。
 

關(guān)閉窗口

相關(guān)文章