8路24位 高精度ADC芯片 ads1256 C51单片机驱动程序

#ifndef __ADS1256_H_
#define    __ADS1256_H_


// define commands 
#define ADS1256_CMD_WAKEUP   0x00 
#define ADS1256_CMD_RDATA    0x01 
#define ADS1256_CMD_RDATAC   0x03 
#define ADS1256_CMD_SDATAC   0x0f 
#define ADS1256_CMD_RREG     0x10 
#define ADS1256_CMD_WREG     0x50 
#define ADS1256_CMD_SELFCAL  0xf0 
#define ADS1256_CMD_SELFOCAL 0xf1 
#define ADS1256_CMD_SELFGCAL 0xf2 
#define ADS1256_CMD_SYSOCAL  0xf3 
#define ADS1256_CMD_SYSGCAL  0xf4 
#define ADS1256_CMD_SYNC     0xfc 
#define ADS1256_CMD_STANDBY  0xfd 
#define ADS1256_CMD_REST    0xfe 
 
// define the ADS1256 register values 
#define ADS1256_STATUS       0x00   
#define ADS1256_MUX          0x01   
#define ADS1256_ADCON        0x02   
#define ADS1256_DRATE        0x03   
#define ADS1256_IO           0x04   
#define ADS1256_OFC0         0x05   
#define ADS1256_OFC1         0x06   
#define ADS1256_OFC2         0x07   
#define ADS1256_FSC0         0x08   
#define ADS1256_FSC1         0x09   
#define ADS1256_FSC2         0x0A 
 
 
// define multiplexer codes 
#define ADS1256_MUXP_AIN0   0x00 
#define ADS1256_MUXP_AIN1   0x10 
#define ADS1256_MUXP_AIN2   0x20 
#define ADS1256_MUXP_AIN3   0x30 
#define ADS1256_MUXP_AIN4   0x40 
#define ADS1256_MUXP_AIN5   0x50 
#define ADS1256_MUXP_AIN6   0x60 
#define ADS1256_MUXP_AIN7   0x70 
#define ADS1256_MUXP_AINCOM 0x80 
 
#define ADS1256_MUXN_AIN0   0x00 
#define ADS1256_MUXN_AIN1   0x01 
#define ADS1256_MUXN_AIN2   0x02 
#define ADS1256_MUXN_AIN3   0x03 
#define ADS1256_MUXN_AIN4   0x04 
#define ADS1256_MUXN_AIN5   0x05 
#define ADS1256_MUXN_AIN6   0x06 
#define ADS1256_MUXN_AIN7   0x07 
#define ADS1256_MUXN_AINCOM 0x08   
 
 
// define gain codes 
#define ADS1256_GAIN_1      0x00 
#define ADS1256_GAIN_2      0x01 
#define ADS1256_GAIN_4      0x02 
#define ADS1256_GAIN_8      0x03 
#define ADS1256_GAIN_16     0x04 
#define ADS1256_GAIN_32     0x05 
#define ADS1256_GAIN_64     0x06 
//#define ADS1256_GAIN_64     0x07 
 
//define drate codes 
#define ADS1256_DRATE_30000SPS   0xF0 
#define ADS1256_DRATE_15000SPS   0xE0 
#define ADS1256_DRATE_7500SPS   0xD0 
#define ADS1256_DRATE_3750SPS   0xC0 
#define ADS1256_DRATE_2000SPS   0xB0 
#define ADS1256_DRATE_1000SPS   0xA1 
#define ADS1256_DRATE_500SPS    0x92 
#define ADS1256_DRATE_100SPS    0x82 
#define ADS1256_DRATE_60SPS     0x72 
#define ADS1256_DRATE_50SPS     0x63 
#define ADS1256_DRATE_30SPS     0x53 
#define ADS1256_DRATE_25SPS     0x43 
#define ADS1256_DRATE_15SPS     0x33 
#define ADS1256_DRATE_10SPS     0x23 
#define ADS1256_DRATE_5SPS      0x13 
#define ADS1256_DRATE_2_5SPS    0x03

signed long ADS1256ReadData(unsigned char channel);
void ADS1256_Init(void);   //初始化ADS1256
void Init_ADS1256_GPIO(void); //

#endif


#include <stdio.h>
#include "STC15F2K60S2.H"
#include "ADS1256.h"

    

    /*端口定义*/ 

    sbit SCK  = P1^2;
    sbit DIN  = P1^3;
    sbit DOUT = P1^4;
    sbit DRDY = P1^5;
    sbit CS   = P1^6;

    #define CS_0()        CS = 0
    #define CS_1()        CS = 1
    #define SCK_0()        SCK = 0
    #define SCK_1()        SCK = 1

    #define ADS1256_DIN_0()    DIN = 0
    #define ADS1256_DIN_1()    DIN = 1

    #define ADS1256_DRDY   DRDY
    #define ADS1256_DOUT   DOUT

void delay_ms(u16);

/*void Init_ADS1256_GPIO(void)
{
    ********************************************
         提示:写单片机程序配置I/O口时要注意方向,
        I/O口配置输出时推荐配置为推挽模式,有些老
        的51单片机没有推挽模式,推荐加 1K上拉电阻.
     ********************************************
    P1M1 = 0;
    P1M0 =0x4C; //配置 I O
    CS_1();
}*/

static void ADS1256_DelaySCLK(void)
{
    unsigned short i;

    /*
        取 5 时,实测高电平200ns, 低电平250ns <-- 不稳定
        取 10 以上,可以正常工作, 低电平400ns 高定400ns <--- 稳定
    */
    for (i = 0; i < 20; i++);
}
/*
*********************************************************************************************************
*    函 数 名: SPI_WriteByte
*    功能说明: 向SPI总线发送8个bit数据。 不带CS控制。
*    形    参: _data : 数据
*    返 回 值: 无
*********************************************************************************************************
*/
void SPI_WriteByte(unsigned char TxData)
{
    unsigned char i;
    /* ADS1256 要求 SCL高电平和低电平持续时间最小 200ns  */
    for(i = 0; i < 8; i++)
    {
        if (TxData & 0x80)
            ADS1256_DIN_1();
        else
            ADS1256_DIN_0();
        
        SCK_1();
        //ADS1256_DelaySCLK();
        TxData <<= 1;
        SCK_0();            /* <----  ADS1256 是在SCK下降沿采样DIN数据, 数据必须维持 50nS */
        //ADS1256_DelaySCLK();
    }
    

/*
*********************************************************************************************************
*    函 数 名: SPI_ReadByte
*    功能说明: 从SPI总线接收8个bit数据。 不带CS控制。
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
unsigned char SPI_ReadByte(void)
{
    unsigned char i;
    unsigned char read = 0;

    //ADS1256_DelaySCLK();

    /* ADS1256 要求 SCL高电平和低电平持续时间最小 200ns  */
    for (i = 0; i < 8; i++)
    {
        SCK_1();
        ADS1256_DelaySCLK();
        read = read<<1;
        SCK_0();
        if (ADS1256_DOUT)
        {
            read++;
        }
        ADS1256_DelaySCLK();
    }
    return read;
}

//-----------------------------------------------------------------//
//    功    能:ADS1256 写数据
//    入口参数: /
//    出口参数: /
//    全局变量: /
//    备    注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
    
    CS_0();
    while(ADS1256_DRDY);//当ADS1256_DRDY为低时才能写寄存器
    //向寄存器写入数据地址
    SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
    //写入数据的个数n-1
    SPI_WriteByte(0x00);
    //向regaddr地址指向的寄存器写入数据databyte
    SPI_WriteByte(databyte);
    CS_1();
}


//初始化ADS1256
void ADS1256_Init(void)
{

    //*************自校准****************
       while(ADS1256_DRDY);
    CS_0();
    SPI_WriteByte(ADS1256_CMD_SELFCAL);
    while(ADS1256_DRDY);
    CS_1();
    //**********************************

    ADS1256WREG(ADS1256_STATUS,0x06);               // 高位在前、校准、使用缓冲
//    ADS1256WREG(ADS1256_STATUS,0x04);               // 高位在前、不使用缓冲
//    ADS1256WREG(ADS1256_MUX,0x08);                  // 初始化端口A0为‘+’,AINCOM位‘-’
    ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_1);      // 放大倍数1
    ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_10SPS); // 数据5sps
    ADS1256WREG(ADS1256_IO,0x00);  
                 
    //*************自校准****************
    while(ADS1256_DRDY);
    CS_0();
    SPI_WriteByte(ADS1256_CMD_SELFCAL);
    while(ADS1256_DRDY);
    CS_1(); 
    //**********************************

}


//读取AD值
signed long ADS1256ReadData(unsigned char channel)  
{

    signed long sum=0;
    char i;
    unsigned long r=0;
    
    while(ADS1256_DRDY);//当ADS1256_DRDY为低时才能写寄存器 
    ADS1256WREG(ADS1256_MUX,channel);        //设置通道
    CS_0();
    SPI_WriteByte(ADS1256_CMD_SYNC);//外同步AD信号,启动转换
    SPI_WriteByte(ADS1256_CMD_WAKEUP);//完成同步并退出待机模式      
    while(ADS1256_DRDY);    
    SPI_WriteByte(ADS1256_CMD_RDATA);
    delay_ms(1);
    
    for(i=0;i<3;i++)
    {
        sum = sum << 8;
        r = SPI_ReadByte();  
          sum |= r;
    }    

    CS_1();

    if (sum>0x7FFFFF)           // if MSB=1, 
    {
        sum -= 0x1000000;       // do 2's complement
    }

    return sum;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GJZGRB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值