日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

模數(shù)轉(zhuǎn)換IC ADC0809的使用制做之二

 ccbupt 2009-04-11
上一篇我們已經(jīng)講了ADC0809的原理與簡化電路,仔細(xì)檢查電路的正確性,尤其不能有短路現(xiàn)象?,F(xiàn)在我們將它實(shí)際接上S52板子,靜態(tài)電流為4mA,其中LED用了1mA,也就是說ADC0809靜態(tài)電流為3mA左右。



將ADC0809板插上S52板,數(shù)據(jù)口D0-D7我接的是P0,CLK接P1.0,OE、EOC、ST-ALE分別接P1.1、P1.2、P1.3,Vcc和GND接S52板上的電源和地。

下面講程序:
程序分為三個(gè)部分:主程序、LCD顯示、ADC0809轉(zhuǎn)換。

左邊的項(xiàng)目框里有三個(gè)程序文件:主程序ADC0809m.C、LCD顯示程序12864put.c、ADC0809轉(zhuǎn)換程序ADC0809C.asm。嗯?。。。最后一個(gè)文件是匯編文件?是的!KEIL允許同時(shí)加入C程序和匯編程序一塊兒編譯。我們先來看主程序:
#include <AT89X52.H>
#define uchar unsigned char
extern void LcmClear( void );       //清屏,外部函數(shù)
extern void LcmInit( void );        //初始化,外部函數(shù)
extern void LcmPutstr( uchar row,uchar y,uchar * str ); //在設(shè)定位置顯示字符串
extern uchar adc0809conv(void); //
uchar * uchartostr(unsigned char unm);    //將char值轉(zhuǎn)成字符串
uchar str[4];    //定義四個(gè)字節(jié)的數(shù)組,用來存放將數(shù)值轉(zhuǎn)成的字符

//****************************
//將char值轉(zhuǎn)成字符串函數(shù)
//****************************
uchar * uchartostr(uchar unm)
{
uchar x00,xx,x0,x,n; //定義百位,十位,個(gè)位變量
x00=unm/100;
xx=unm%100;
x0=xx/10;
x=xx%10;
n=0;
if(x00!=0)
{ str[n]=x00+48; //值加48即為字符
    n++;
}
if(!(x00==0&x0==0))
{ str[n]=x0+48;
    n++;
}
str[n]=x+48;
n++;
str[n]='\0';
   return str;
}

//****************
//    主函數(shù)
//****************

void Main( void )
{ uchar aa;    //定義一個(gè)臨時(shí)字符變量

    /* T2 set */
TR2=0x0;     //停止T2定時(shí)器
TR0=0x0;     //停止T0定時(shí)器
T2MOD=0x02; //0010(B) 設(shè)置T2為P1.0口輸出方波模式
C_T2=0;      //用內(nèi)部時(shí)鐘計(jì)數(shù)
TL2=0xfd;
TH2=0xff;
RCAP2L=0xfd;
RCAP2H=0xff;
TMOD=0x01; //設(shè)置T0為1定時(shí)模式(16位計(jì)數(shù))
TH0=0;
TL0=0;
TR2=1;    //打開T2定時(shí)器,開始輸出脈沖
aa=adc0809conv(); //啟動(dòng)一次ADC0809轉(zhuǎn)換并將值交給aa
LcmInit();         //初始化LCD
LcmClear();        //LCD清屏
LcmPutstr( 2,28,"ADC0809 TEST" );
LcmPutstr( 4,59,uchartostr(aa) ); //在第四行第59列輸出ADC0809轉(zhuǎn)換的值
LcmPutstr( 7,42,"TXZ001@" );
while(1)
    {
      
    }
}

下面我們?cè)賮砜碅DC0809轉(zhuǎn)換函數(shù):

NAME ADC0809C
?PR?adc0809conv?ADC0809C                 SEGMENT CODE
?DT?adc0809conv?ADC0809C                 SEGMENT DATA OVERLAYABLE
PUBLIC adc0809conv
RSEG ?DT?adc0809conv?ADC0809C
?adc0809conv?BYTE:
        put?040:   DS   1
RSEG ?PR?adc0809conv?ADC0809C
adc0809conv:            ;程序從這里開始
USING 0
st bit P1.3     ;設(shè)置ST接P1.3
eoc bit P1.2    ;設(shè)置EOC接P1.2
oe bit P1.1     ;設(shè)置OE接P1.1
port equ P0     ;設(shè)置數(shù)據(jù)讀取PORT接P0
setb TR0        ;啟動(dòng)T0定時(shí)器,用來計(jì)數(shù)(我是用T0來計(jì)算轉(zhuǎn)換一次需要多長時(shí)間)
clr oe          ;初始化ADC0809,OE置0
clr st          ;初始化ADC0809,ST置0
setb eoc        ;初始化ADC0809,EOC置1
mov port,#0     ;先擇通道0數(shù)據(jù)交給P0口
setb st         ;這三句將ST給出一個(gè)正脈沖來啟動(dòng)轉(zhuǎn)換
nop       ;
clr st          ;
mov r7,#10      ;這兩行是用來稍做延時(shí)
djnz r7,$       ;
wait1: jb eoc,wait1   ;這兩行是來檢測(cè)EOC由低到高發(fā)出了上升沿,以表示轉(zhuǎn)換結(jié)束
wait2: jnb eoc,wait2 ;
   mov port,#0FFh       ;將P0口復(fù)位,以便下一步讀取數(shù)據(jù)
setb oe         ;將OE口置1,允許轉(zhuǎn)換后的數(shù)據(jù)讀出
clr TR0         ;停止T0計(jì)時(shí)器(T0是從0開始計(jì)數(shù)的,到這兒轉(zhuǎn)換結(jié)束停止計(jì)數(shù))
MOV R7,port    ;將轉(zhuǎn)換的數(shù)據(jù)交給主調(diào)用程序的變量aa

?C0001:
RET ;返回
END

匯編程序有點(diǎn)亂,沒關(guān)系,下一篇我會(huì)專門講混合編程。
那個(gè)LCD顯示函數(shù)就不在這兒列出了,前面都已講過也列出了程序。
下圖是本程序?qū)嶋H測(cè)量一節(jié)AA電池的實(shí)例圖:


可以看到,它的值為64,因?yàn)槲业腁DC0809參考電壓為5V,那么8位精度的轉(zhuǎn)換是將5v分為255份那么每份就是5÷255=0.0196v。我測(cè)量出一節(jié)電池的64值就為64×0.0196=1.25v。

調(diào)試注意點(diǎn):由于8個(gè)模擬測(cè)量通道的輸入阻抗很高,在程序運(yùn)行時(shí)如果8個(gè)模擬端是懸空的,模擬端的電位是隨周圍環(huán)境變化的,那測(cè)量出的很可能是亂跳的隨機(jī)值而并非你程序或電路問題。要避免這種情況的干擾,最好先用10K的電阻將模擬端接地。等你測(cè)量出每次都為0時(shí),再改變模擬端的電位試驗(yàn)測(cè)量的正確性。

隨便說說轉(zhuǎn)換速度的問題。
  ADC0809的轉(zhuǎn)換速度跟脈沖頻率有關(guān),它的允許范圍為10KHZ--1.28M,我們是用T2定時(shí)器來做脈沖輸出的,頻率就由公式 晶振頻率/(4×(65536-(RCAP2H,RCAP2L)),還記得上一篇我給出過的這個(gè)公式嗎?我的晶振是12MHZ,那么要給出1MHZ的脈沖就要在RCAP2里給65533的值,這樣12M÷4×3=1MHZ。同理,要輸出10KHZ的脈沖就要給65236的值。在主程序里:

  TL2=0xfd    ;這是計(jì)數(shù)器里的初值,F(xiàn)FFD就是65533,也就是輸出1MHZ的脈沖
  TH2=0xff    ;
  RCAP2L=0xfd    ;這是重載器,也一樣給上65533的值。
  RCAP2H=0xff    ;

如果要想輸出10KHZ的脈沖上面就要給上65236的值,也就是FED4。

在主程序里我還用了T0計(jì)數(shù)器:
  TMOD=0x01; //設(shè)置T0為1定時(shí)模式(16位計(jì)數(shù))
  TH0=0;
  TL0=0;
我給的初值為0,但我沒有在主程序里啟動(dòng)它。而是在ADC0809轉(zhuǎn)換函數(shù)里才啟動(dòng)和停止:

   setb TR0        ;啟動(dòng)T0定時(shí)器,用來計(jì)數(shù)(我是用T0來計(jì)算轉(zhuǎn)換一次需要多長時(shí)間)
   。。。。
   clr TR0         ;停止T0計(jì)時(shí)器(T0是從0開始計(jì)數(shù)的,到這兒轉(zhuǎn)換結(jié)束停止計(jì)數(shù))

這樣我就可以看它計(jì)數(shù)的值來知道一次轉(zhuǎn)換需要多長時(shí)間了。將轉(zhuǎn)換函數(shù)的最后一句:
MOV R7,port    換成 MOV R7,TL0 或 MOV R7,TH0 就會(huì)在LCD上顯示出轉(zhuǎn)換所用的時(shí)間了,因?yàn)榫д駷?2MHZ,一個(gè)脈沖就是一微秒。實(shí)際測(cè)試ADC0809在1MHZ時(shí)鐘時(shí)轉(zhuǎn)換一次為83微秒,而在10KHZ時(shí)鐘下轉(zhuǎn)換一次需要1769微秒也就是1.769毫秒,比ADC0804轉(zhuǎn)換速度要慢很多,ADC0804為22微秒。

怎么樣,單片機(jī)好玩吧!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多