#include "C:\Keil\C51\INC\STC\STC15F2K60S2.H"
#include "ads1256.h"
void sendStr(unsigned char *s);
void sendChar(unsigned char ch);
unsigned char SPI_SendByte(unsigned char SPI_SendData);
//-----------------------------------------------------------------//
// 功 能:延时
// 入口参数: 延时时间 delay * us
// 出口参数: /
// 全局变量: /
// 备 注:
//-----------------------------------------------------------------//
void Delay(unsigned int dal)
{
unsigned int i;
for(i = 0;i < dal;i ++);
}
//-----------------------------------------------------------------//
// 功 能:ADS1256 写数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
ADS_CS = 0;
while(ADS_DRDY);//当ADS1256_DRDY为低时才能写寄存器
//向寄存器写入数据地址
SPI_SendByte(ADS1256_CMD_WREG | (regaddr & 0xF));
//写入数据的个数n-1
SPI_SendByte(0);
//向regaddr地址指向的寄存器写入数据databyte
SPI_SendByte(databyte);
ADS_CS = 1;
}
//-----------------------------------------------------------------//
// 功 能:
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注:
//-----------------------------------------------------------------//
unsigned long ADS1256ReadData(void)
{
unsigned char i=0;
unsigned long sum=0;
unsigned long r=0;
ADS_CS = 0;
while(ADS_DRDY); //当ADS1256_DRDY为低时才能写寄存器
SPI_SendByte(ADS1256_CMD_SYNC);
SPI_SendByte(ADS1256_CMD_WAKEUP);
SPI_SendByte(ADS1256_CMD_RDATA);
ADS_SCLK = 0;
for(i=0;i<3;i++)
{
sum = sum << 8;
r = SPI_SendByte(0);
sum |= r;
}
ADS_CS = 1;
return sum;
}
//-----------------------------------------------------------------//
// 功 能:ADS1256初始化子程序
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: /
//-----------------------------------------------------------------//
void ADS1256_Init(void)
{
ADS_CS = 0;
// 发送复位命令
// ADS_RESET = 0;
// Delay(DELAY_10ms);
ADS_REST = 1;
ADS1256WREG(ADS1256_STATUS,0x04); // 高位在前、校准、使用缓冲
ADS1256WREG(ADS1256_MUX,0x08); // 初始化端口A0为‘+’,AINCOM位‘-’
ADS1256WREG(ADS1256_ADCON,0x00); // 放大倍数1
ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_5SPS); // 数据5sps
ADS1256WREG(ADS1256_IO,0x00); // IO状态输入
ADS_CS = 1;
}
//-----------------------------------------------------------------//
// 功 能:读取ADS1256单路数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: /
//-----------------------------------------------------------------//
void ADS_sum(unsigned char road)
{
unsigned long results=0;
unsigned long Result_sum=0;
unsigned long fVoltage;
unsigned char buf[12],i,rod;
ADS1256WREG(ADS1256_MUX,road); //设置通道
// SPI_SendByte(ADS1256_CMD_SELFCAL); //偏移和增益自动校准
// SPI_SendByte(ADS1256_CMD_SYSOCAL); //系统失调校准
// SPI_SendByte(ADS1256_CMD_SYSGCAL); //系统增益校准
if(road/16 == 0) //根据手册P21 本次读取的数据是上一次转换的值
rod = (7 + 0x30); //进行通道-1计算
else
rod = ((road/16 + 0x30) -1);
sendStr("第");
sendChar(rod);
sendStr("路:");
results = ADS1256ReadData();//读取AD值,返回24位数据。
///////发送AD转换后实际电压值到串口,因为计算精度问题,电压值有小的偏差/////////
Result_sum = results >> 1;
if(Result_sum<0x400000) //测得电压值为正的情况
{
fVoltage=Result_sum*119; //119=2*2.5/2^22*100000000 2.5为基准电压 1000000000为为了计算的准确性转换为整形计算
buf[0]=(unsigned char)(fVoltage/100000000);
buf[0]=buf[0]+0x30;
buf[1]='.';
buf[2]=(unsigned char)((fVoltage%100000000)/10000000);
buf[2]=buf[2]+0x30;
buf[3]=(unsigned char)((fVoltage%10000000)/1000000);
buf[3]=buf[3]+0x30;
buf[4]=(unsigned char)(fVoltage%1000000/100000);
buf[4]=buf[4]+0x30;
buf[5]=(unsigned char)(fVoltage%100000/10000);
buf[5]=buf[5]+0x30;
buf[6]=(unsigned char)(fVoltage%10000/1000);
buf[6]=buf[6]+0x30;
buf[7]=(unsigned char)(fVoltage%1000/100);
buf[7]=buf[7]+0x30;
buf[8]=(unsigned char)(fVoltage%100/10);
buf[8]=buf[8]+0x30;
buf[9]=(unsigned char)(fVoltage%10);
buf[9]=buf[9]+0x30;
buf[10]='V'; //V
buf[11]=0x20;
}
else //测得电压值为负的情况
{
//buf[0]='-'; //取‘-’号
Result_sum=0xfffff-Result_sum; //取反运算
fVoltage=Result_sum*119; //119=2*2.5/2^22*100000000 2.5为基准电压 1000000000为为了计算的准确性转换为整形计算
buf[0]=(unsigned char)(fVoltage/100000000);
buf[0]=buf[0]+0x30;
buf[1]='.';
buf[2]=(unsigned char)((fVoltage%100000000)/10000000);
buf[2]=buf[2]+0x30;
buf[3]=(unsigned char)((fVoltage%10000000)/1000000);
buf[3]=buf[3]+0x30;
buf[4]=(unsigned char)(fVoltage%1000000/100000);
buf[4]=buf[4]+0x30;
buf[5]=(unsigned char)(fVoltage%100000/10000);
buf[5]=buf[5]+0x30;
buf[6]=(unsigned char)(fVoltage%10000/1000);
buf[6]=buf[6]+0x30;
buf[7]=(unsigned char)(fVoltage%1000/100);
buf[7]=buf[7]+0x30;
buf[8]=(unsigned char)(fVoltage%100/10);
buf[8]=buf[8]+0x30;
buf[9]=(unsigned char)(fVoltage%10);
buf[9]=buf[9]+0x30;
buf[10]='V'; //V
buf[11]='-';
}
i=0;
while(i<12)
{
sendChar(buf[i]);
i++;
}
}
/*********发送AD转换后的十六进制码到串口,使用时打开*************/
/*
void ADS_sum(unsigned char road)
{
unsigned long results=0;
results = ADS1256ReadData();//读取AD值,返回24位数据。
sendChar((unsigned long)(results >> 16) & 0x0000ff); //发送最高位
sendChar((unsigned long)(results >> 8) & 0x0000ff); //发送中间位
sendChar((unsigned long)results & 0x0000ff); //发送低位
}
*/
- 1
- 2
前往页