×
单片机 > 单片机程序设计 > 详情

AD转换器ADS11XX驱动程序

发布时间:2020-06-08 发布时间:
|

//-----------------------函数声明IIC通用变量定义-------------------------------------------------------- 
#include  
#include  
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驱动程序



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
LPC4350的功能特性和应用分析