乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      模數(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)論公約

        類似文章 更多