gaoqianzhe
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-01-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3663回复:3

用过TLC0832的大侠请帮我看看这是怎么回事?

楼主#
更多 发布于:2003-04-04 22:37
我做了一个TLC0832进行AD转换的程序,可是不知道为什么,0通道的数据老是不对,我下面的程序运行时结果总是0FFH.如果在主程序里只进行通道1 的转换,结果是正确的,加上通道0后就不行了,只用通道0 也是不对,有做过的高手请点小弟,多谢!

#include <absacc.h>
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char

sbit ADCS = 0x90^0 ;    //L1 lighter
sbit ADCLK = 0x90^1 ;
sbit ADSO = 0x90^2 ;
sbit ADSI = 0x90^3 ;

// **********************************************

void delayus(uchar us)
{
    uchar i;
    for( ; us; us--)
    {
        for( i = 10; i; i-- )
            ;
    }
    return;
}

// **********************************************

uchar readAD( uchar channel )
{
    uchar i,ch1,ch2;
convert:
    delayus( 100 );
    ADSI = 1;
    ADSO = 1;
    ADCLK = 1;
    ADCS = 0;
    _nop_();
    ADCS = 1;
    
    
    ADCLK = 0;
    ADCS = 0;    //start AD
    _nop_();
    ADSI = 1;    //start bit
    _nop_();
    ADCLK = 1;    //1 0->1
    
    _nop_();
    ADCLK = 0;
    ADSI = 1;    //SGL=1 (单极性对地)
    _nop_();
    ADCLK= 1;
    
    _nop_();
    ADCLK = 0;
    if( channel & 0x01 )
        ADSI = 1;
    else    ADSI = 0;    //通道选择
    _nop_();
    ADCLK= 1;
    
    _nop_();
    ADCLK = 0;
    _nop_();
    ADCLK = 1;
    _nop_();
    ADCLK = 0;

    for( i=8; i; i-- )        // d7 d6 ... d0
    {
        _nop_();
        ch1 = ch1 << 1;
        if( ADSO )
            ch1++;
        
        ADCLK = 1;
        _nop_();
        ADCLK =0;
    }
    ch2 = 0x0;
    if( ch1 & 0x01 )
        ch2 = 0x80;
    for( i=7; i; i-- )        // d0 d1 ... d7
    {
        ch2 = ch2 >> 1;
        if( ADSO )
            ch2 = ch2 | 0x80;
        
        ADCLK = 1;
        _nop_();
        ADCLK = 0;
    }

    _nop_();
    ADCLK = 1;
    _nop_();
    ADCLK = 0;
    _nop_();
    ADCLK = 1;
    _nop_();
    ADCLK = 0;
    _nop_();
    ADCLK = 1;
    _nop_();
    ADCLK = 0;
    _nop_();
    ADCS = 1;
    if( ch1 == ch2 )
        return ch1;
    else
        goto convert;
}

// **********************************************

main()
{
    uchar ch[10],i;
    
    while(1)
    {
        i=0;
        ch[i++] = readAD( 0x00 );
//此处用0X00和0X01进行0和1两个通道交替转换,结果除第一次外全是
//0FFH,如果全用0X00只用0通道也是一样,只有只用通道1才是正确的
        ch[i++] = readAD( 0x01 );
        ch[i++] = readAD( 0x00 );
        ch[i++] = readAD( 0x01 );
        ch[i++] = readAD( 0x00 );
        ch[i++] = readAD( 0x01 );
        ch[i++] = readAD( 0x00 );
        ch[i++] = readAD( 0x01 );
        ch[i++] = readAD( 0x00 );
        ch[i++] = readAD( 0x01 );
    }
}

最新喜欢:

drizzledrizzl...
LINGXI
驱动牛犊
驱动牛犊
  • 注册日期2004-06-22
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-10 07:58
检查一下电路,也许是通道0的输入有问题?或者换一个A/D试试看,程序应该没什么问题的。
raymanii
驱动牛犊
驱动牛犊
  • 注册日期2003-12-14
  • 最后登录2005-12-21
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-29 01:09
_nop_(); 这句全部都是没用的,delayus( 100 ); 也没用。
lbcat
驱动牛犊
驱动牛犊
  • 注册日期2002-03-19
  • 最后登录2007-09-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-07-29 16:09
下面是引用raymanii于2005-07-29 01:09发表的:
_nop_(); 这句全部都是没用的,delayus( 100 ); 也没用。


这是用来延时的,怎么会没用???
游客

返回顶部