首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
AD转换器ADS11XX驱动程序
来源:本站整理  作者:佚名  2011-02-05 21:44:42



//-----------------------函数声明IIC通用变量定义--------------------------------------------------------
#include <reg51.h>
#include <intrins.h>
sbit SDA=P1^0;                          // 将p1.0口模拟数据口
sbit SCL=P1^1;                          // 将p1.1口模拟时钟口
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};                     
bit   bdata SystemError;                // 从机错误标志位
//-----------------------ADS专用变量定义--------------------------------------------------------
#define  READ_ADD  0x91          //写配置寄存器时对应的器件地址
#define  WRITE_ADD 0x90          //读转换结果时对应的器件地址
#define  CFG_setting 0x8C        //配置寄存器的预设值
unsigned char H_AD;      //H_AD 用于存储高八位A/D转换结果
unsigned char L_AD;      //L_AD 用于存储低八位A/D转换结构
//--------------------------------------------------------------------------------------------------
// 函数名称: iic_start()
// 函数功能: 启动I2C总线子程序
//--------------------------------------------------------------------------------------------------
void iic_start(void)
{     EA=0;            //时钟保持高,数据线从高到低一次跳变,I2C通信开始
    SDA = 1;         
    SCL = 1;
    delayNOP();      // 延时5us 
    SDA = 0;
    delayNOP();
    SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: iic_stop()
// 函数功能: 停止I2C总线数据传送子程序
//--------------------------------------------------------------------------------------------------
void iic_stop(void)

    SDA = 0;          //时钟保持高,数据线从低到高一次跳变,I2C通信停止
    SCL = 1;
    delayNOP();
    SDA = 1;
    delayNOP();
    SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: slave_ACK
// 函数功能: 从机发送应答位子程序
//--------------------------------------------------------------------------------------------------
void slave_ACK(void)
{
    SDA = 0;    
    SCL = 1;
    delayNOP();            
    SDA = 1;
    SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: slave_NOACK
// 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
//--------------------------------------------------------------------------------------------------
void slave_NOACK(void)

    SDA = 1;   
    SCL = 1;
    delayNOP();
    SDA = 0;
    SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: check_ACK
// 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
//--------------------------------------------------------------------------------------------------
void check_ACK(void)

    SDA = 1;      // 将p1.0设置成输入,必须先向端口写1
    SCL = 1;
    F0 = 0;
    if(SDA == 1)    // 若SDA=1表明非应答,置位非应答标志F0
        F0 = 1;
    SCL = 0;
}

//--------------------------------------------------------------------------------------------------
// 函数名称: IICSendByte
// 入口参数: ch
// 函数功能: 发送一个字节
//--------------------------------------------------------------------------------------------------
void IICSendByte(unsigned char ch)

    unsigned char idata n=8;     // 向SDA上发送一位数据字节,共八位
    while(n--)
    { 
        if((ch&0x80) == 0x80)    // 若要发送的数据最高位为1则发送位1
        {
            SDA = 1;    // 传送位1
            SCL = 1;
            delayNOP();
            SDA = 0;
            SCL = 0;    
        }
        else
        {  
            SDA = 0;    // 否则传送位0
            SCL = 1;
            delayNOP();
            SCL = 0;  
        }
        ch = ch<<1;    // 数据左移一位
    }
}
//--------------------------------------------------------------------------------------------------
// 函数名称: IICreceiveByte
// 返回接收的数据
// 函数功能: 接收一字节子程序
//--------------------------------------------------------------------------------------------------
unsigned char IICreceiveByte(void)
{
    unsigned char idata n=8;    // 从SDA线上读取一上数据字节,共八位
    unsigned char tdata;
    while(n--)
    {
        SDA = 1;
        SCL = 1;
        tdata = tdata<<1;    // 左移一位,或_crol_(temp,1)
        if(SDA == 1)
            tdata = tdata|0x01;    // 若接收到的位为1,则数据的最后一位置1
        else 
            tdata = tdata&0xfe;    // 否则数据的最后一位置0
        SCL=0;
    }
    return(tdata);
}
//--------------------------------------------------------------------------------------------------
// 函数名称:setting_ADS100
// 用户调用自程序
// 函数功能: 设置配置寄存器
//--------------------------------------------------------------------------------------------------
void setting_ADS100(unsigned char setting_data)     //写器件地址和配置字 
     { 
      iic_start();               //开始写 
      IICSendByte(WRITE_ADD);         //写器件地址(写) 
      check_ACK();                // 检查应答位
      if(F0 == 1)
        { 
        SystemError = 1;
        return;    // 若非应答表明器件错误或已坏,置错误标志位SystemError
         }
         IICSendByte(setting_data);
        check_ACK();    // 检查应答位
        if (F0 == 1)
        {
            SystemError=1;
            return;    // 若非应答表明器件错误或已坏,置错误标志位SystemError
        }
        iic_stop();         // 全部发完则停止
      }     
//--------------------------------------------------------------------------------------------------
// 函数名称:READ_ADS100
// 用户调用自程序
// 函数功能: 读A/D转换结果
//--------------------------------------------------------------------------------------------------
void READ_ADS100(void)       //从ADS1100中读出数据 
   {   
       iic_start();
    IICSendByte(READ_ADD);
    check_ACK();
    if(F0 == 1)
    {
        SystemError = 1;
        return;
    }
    H_AD=IICreceiveByte();
    slave_ACK();    // 收到一个字节后发送一个应答位
    L_AD=IICreceiveByte();
       slave_NOACK();    // 收到最后一个字节后发送一个非应答位
    iic_stop();
   } 
//--------------------------------------------------------------------------------------------------
// 函数名称:main
// 用户主函数
// 函数功能:主函数
//--------------------------------------------------------------------------------------------------
void main()
     {
     setting_ADS100(CFG_setting);
     READ_ADS100();
     }

AD转换器ADS11XX驱动程序

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:297,812.50000 毫秒