音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

有誰用過AD7896? 12位串行AD轉(zhuǎn)換IC。

作者:xzhenggen 欄目:單片機
有誰用過AD7896? 12位串行AD轉(zhuǎn)換IC。
我按照時序電路寫了一個子程序測試為什么測不準?請各位大俠出來指點一下.
#include "reg51.h"
#include "absacc.h"
#include "math.h"
#include "intrins.h"
#define uCHAR unsigned CHAR
#define uint unsigned  int

sbit SCLK=P1^1;
sbit WDI=P1^2;
sbit SDATA=P1^0;

void delay(uCHAR n)
{
    uCHAR i;
    for(i=0;i<n;i++)
    {
        _nop_();
    }
}


uint read7896(void)
{
    CHAR i;
    uint result;
    uCHAR hbyte, lbyte;

    WDI=0;
    delay(3);
    SCLK=0;
    
    WDI=1;
    delay(3);
    WDI=0;
    for(i=0;i<15;i++)
    {
        _nop_();
    }
    SCLK=1;
    SCLK=0;
    
    hbyte=0;
    for(i=0;i<4;i++)
    {
        SDATA=1;
        SCLK=1;
        if(SDATA) hbyte=0x01;
        SCLK=0;
        if(i!=3) hbyte<<=1;
    }
    lbyte=0;
    for(i=0;i<8;i++)
    {
        SDATA=1;
        SCLK=1;
        if(SDATA) lbyte=0x01;
        SCLK=0;
        if(i!=7) lbyte<<=1;
        
    }
    _nop_();
    _nop_();
    
    WDI=1;
    result=0;
    result=hbyte;
    result<<=8;
        result|=lbyte;
    return (result);
}


void main(void)
{
    uint ad;
        while(1){
    ad=read7896();
         }    
    
    
}

我總覺得我這個子程序有問題,但就是不知錯在哪里?有哪位高手出來指點一下,在此多謝了。。

2樓: >>參與討論
shiyang800
串行 AD   不需要初始化?!
 
3樓: >>參與討論
xzhenggen
串行 AD (AD7896)  的DATASHEET里面沒有說怎樣初始化
 
4樓: >>參與討論
xzhenggen
重新修改,還是有問題,不知為何?
#include "reg51.h"
#include "absacc.h"
#include "math.h"
#include "intrins.h"
#define uCHAR unsigned CHAR
#define uint unsigned  int
#define N 128
sbit SCLK=P1^1;
sbit WDI=P1^2;
sbit SDATA=P1^0;
uint xdata Array[N];
void delay(uCHAR n)
{
    uCHAR i;
    for(i=0;i<n;i++)
    {
        _nop_();
    }
}

uint read7896(void)
{
    CHAR i;
    uint result;
    uCHAR hbyte, lbyte;

    WDI=0;
    delay(1);
    SCLK=0;
    
    WDI=1;
    delay(1);
    WDI=0;
    for(i=0;i<15;i++)
    {
        _nop_();
    }
    //SCLK=1;
    //SCLK=0;
    //while(AD_BUSY);
    hbyte=0;
    for(i=0;i<8;i++)
    {
        SDATA=1;
        SCLK=1;
        if(SDATA) hbyte=0x01;
        SCLK=0;
        if(i!=7) hbyte<<=1;
    }
    lbyte=0;
    for(i=0;i<8;i++)
    {
        SDATA=1;
        SCLK=1;
        if(SDATA) lbyte=0x01;
        SCLK=0;
        if(i!=7) lbyte<<=1;
        
    }
    //_nop_();
    //_nop_();
    
    //WDI=1;
    result=0;
    result=hbyte;
    result<<=8;
        result|=lbyte;
    return (result);
}


void main(void)
{
    uint ad;
        while(1){
    ad=read7896();
         }    
    
    
}




../uploadfile/200705141411293513.jpg

5樓: >>參與討論
xzhenggen
請圈圈高手出來指點一下。
 
6樓: >>參與討論
computer00
沒用過這個芯片,不過你這個讀數(shù)據(jù)的程序好象不大對頭...
    hbyte=0;
    for(i=0;i<8;i++)
    {
        SDATA=1;
        SCLK=1;
        if(SDATA) hbyte=0x01;
        SCLK=0;
        if(i!=7) hbyte<<=1;
    }
    lbyte=0;
    for(i=0;i<8;i++)
    {
        SDATA=1;
        SCLK=1;
        if(SDATA) lbyte=0x01;
        SCLK=0;
        if(i!=7) lbyte<<=1;
        
    }

改成這樣試試:

    SDATA=1;
    for(i=0;i<8;i++)
    {
        hbyte<<=1;
        SCLK=1;
        if(SDATA) hbyte++;
        SCLK=0;
    }

    for(i=0;i<8;i++)
    {
        lbyte<<=1;
        SCLK=1;
        if(SDATA) lbyte++;
        SCLK=0;        
    }

7樓: >>參與討論
xzhenggen
串行讀數(shù)據(jù)不是首先置時鐘信號為高電平嗎?
對于上升沿驅(qū)動的芯片,串行讀數(shù)據(jù)不是首先置時鐘信號為高電平嗎?
從數(shù)據(jù)輸出口讀取數(shù)據(jù)時,不是應先將時鐘信號從低電平跳變到高電平,以使1位數(shù)據(jù)輸出到其輸出引腳,從讀取該數(shù)據(jù)。
讀串行數(shù)據(jù)時不是先置時鐘信號為高電平的嗎?
然后再讀一位串行數(shù)據(jù);再置時鐘信號為低電平,以使下一位數(shù)據(jù)發(fā)生變化。

8樓: >>參與討論
xzhenggen
我到底該用這個DATASHEET的那個時序讀數(shù)?
 

9樓: >>參與討論
xzhenggen
第二個
 

10樓: >>參與討論
xzhenggen
第三個
 

11樓: >>參與討論
computer00
前面兩個圖,要看你所選擇的模式了
有高速采樣模式和自動睡眠模式.


而讀數(shù)據(jù),則都是按照下面的圖來讀.


從這個圖來看,數(shù)據(jù)是在前一個時鐘的下降沿發(fā)出的,經(jīng)過T4時間后,數(shù)據(jù)穩(wěn)定,這以后可以去讀數(shù)據(jù).

而在下一個時鐘的下降沿到來后,經(jīng)過T5時間后,數(shù)據(jù)消失.


按照我上面寫的讀數(shù)據(jù)程序,還需要將hbyte的最高位清0,因為從這個圖來看,讀最高位時,數(shù)據(jù)還是不確定的。

12樓: >>參與討論
xzhenggen
讀串行數(shù)據(jù)時不是先置時鐘信號為高電平的嗎?
 
13樓: >>參與討論
xzhenggen
我那我上面的子程序該如何修改?!
請圈圈再幫我看一看,多謝!

14樓: >>參與討論
xzhenggen
按圈圈的方式,修改如下,不知是不是這樣做??

#include "reg51.h"
#include "absacc.h"
#include "math.h"
#include "intrins.h"
#define uCHAR unsigned CHAR
#define uint unsigned  int

sbit SCLK=P1^1;
sbit WDI=P1^2;
sbit SDATA=P1^0;
//AD_BUSY 沒有用上。
void delay(uCHAR n)
{
    uCHAR i;
    for(i=0;i<n;i++)
    {
        _nop_();
    }
}

uint read7896(void)
{
    CHAR i;
    int j;
    uint result;
    //uCHAR hbyte, lbyte;
        result<<=4;/*精確12位,所以左移6位*/
    WDI=1;
    delay(3);
    SCLK=0;
    
    WDI=0;
    delay(3);
    WDI=1;
    for(i=0;i<15;i++)
    {
        _nop_();
    }
    
    
    SDATA=1;

     
    for(j=0;j<16;j++)
    {
        result<<=1;
        SCLK=1;
        _nop_();
        if(SDATA)result++;
        SCLK=0;
     }

    return (result);
}


void main(void)
{
    uint ad;
        while(1){
    ad=read7896();
         }    
    
    
}




15樓: >>參與討論
xzhenggen
暈死我了,圈圈說的,我怎么就弄不了的呢?!
有哪一位高手出來 指點一下。該如何修改子程序。。!。。。




數(shù)據(jù)是在前一個時鐘的下降沿發(fā)出的,經(jīng)過T4時間后,數(shù)據(jù)穩(wěn)定,這以后可以去讀數(shù)據(jù).
而在下一個時鐘的下降沿到來后,經(jīng)過T5時間后,數(shù)據(jù)消失.


16樓: >>參與討論
computer00
試試這樣行不.  或者去網(wǎng)上搜索一下,看有沒有現(xiàn)成的例子
uint read7896(void)
{
    CHAR i;
    int j;
    uint result;
    //uCHAR hbyte, lbyte;
     //   result<<=4;/*精確12位,所以左移6位*/

    SCLK=0;
    WDI=1;
    delay(30);
    WDI=0;
    delay(30);
    
    SDATA=1;
     
    for(j=0;j<16;j++)
    {
        result<<=1;
        SCLK=1;
        _nop_();
        if(SDATA)result++;
        SCLK=0;
     }
    return (result&0x0FFF);
}


17樓: >>參與討論
xzhenggen
多謝圈圈幫忙!我試一下。
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請教,SOIC封裝的AT89C2051是不是一定要用適配器編程?
at89s52的看門狗問題
轉(zhuǎn)讓一對數(shù)傳模塊
問個問題
買不到芯片怎么辦
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號