📄 ad_da_module.c
字号:
/****************************************************************************************************
描 述: ADS1110 / DAC7512 读写及处理程序模块 , 需引用 24C32_Module.c 和 Time_Module.c 文件.
文件名: AD_DA_Module.c
日 期: 2007年3月5日
*****************************************************************************************************
说 明:
与之配套的电路为单端输入,信号的范围应是0V至2.048V,要损失一位分辨率.
ADS1110的输出码所需要的位数又取决于数据速率:
(数据速率->位数->延时) 15SPS->16位->67ms、30SPS->15位->33ms、60SPS->14位->17ms、240SPS->12位->4ms。
对最小码的最小输出码、PGA的增益设置以及VIN+与VIN-的正负输入电压而言,输出码可由以下公式计算出:
输出码 = -1×最小码×PGA×(VIN+ - VIN-)/
公式中,须重点注意使用了负的最小输出码。ADS1110输出码的格式为二进制2的补码,因此最小和最大的绝对值不同。
主要函数及其功能:
void Start_I2C(void); //产生I2C总线的起始条件
void Stop_I2C(void); //产生I2C总线的停止条件
void WriteByte_I2C(unsigned char dat_add); //向I2C总线写1个字节的数据或地址
unsigned char ReadByte_I2C(void); //从I2C总线读1个字节的数据
bit GetAck_I2C(void); //读取从机应答位(应答或非应答)
void PutAck_I2C(bit ack); //主机产生应答位(应答或非应答)
bit SetADC (unsigned char writedata); //写 ADS1110 的配置寄存器,配置值低4位中有关
//数据速率(SPS) 和 增益设置(PGA) 的值无效, 只能在 AD_DA_Module.c 文件中修改 SPS 和 PGA 的值
bit ReadADC (unsigned int *readdata); //读 ADS1110 的AD转换值
bit Deal_ADC(unsigned int *ad_value); //读 ADS1110 的AD转换值并进行标度变换
void WriteDAC(unsigned int dacdata); //设置 DAC7512 的输出模拟量
void Deal_DAC(unsigned int da_value); //设置(经过标度变换的设置值,为十进制表示) DAC7512 的输出模拟量
void hex_to_decimalist(unsigned int *value); //十六进制数转化为十进制数
extern bit Deal_ADC(unsigned int *ad_value); //读 ADS1110 的AD转换值并进行标度变换
extern void Deal_DAC(unsigned int da_value); //设置(经过标度变换的设置值,为十进制表示) DAC7512 的输出模拟量
修改历史记录列表:
<修改日期> <修改内容简述>
07/03/05 改Deal_ADC()为ReadADC(),Deal_ADC()为新功能
07/03/08 修改SetADC()
07/03/09 增加hex_to_decimalist()
07/03/26 加入 I2C总线公共函数 , 修改 Deal_ADC()
07/04/01 修改 Deal_ADC(),修改 默认 PGA = 1
07/04/01 修改 Deal_ADC(),读AD错误使 DA输出值 为2048
07/04/02 增加测试
07/04/03 修改 Deal_ADC(),使AD读出值 数值上 = 端口输入电压
07/04/04 修改 Deal_DAC(),使DA输出值 数值上 = 充放电电流
07/05/28 为了解决DATA空间溢出,将Deal_DAC()里的临时变量unsigned long TempData1,TempData2定义到xdata
****************************************************************************************************/
#include <sst89x5x4.h>
#include <stdio.h>//4.2增加测试
//****在此设定ADS1110的I2C总线端口, 可根据实际使用改变***********************************************
sbit SCL_I2C = P1^4; //I2C总线时钟线
sbit SDA_I2C = P1^5; //I2C总线数据线
//---------------------------------------------------------------------------------------------------
//****在此设定ADS1110的数据速率和可编程增益放大器的值, 可根据实际使用改变****************************
unsigned char SPS = 1; //即240SPS ; 240SPS <-> 1; 60SPS <-> 4; 30SPS <-> 8; 15SPS <-> 16
unsigned char PGA = 1; //即 2PGA ; 1PGA <-> 1; 2PGA <-> 2; 4PGA <-> 4; 8PGA <-> 8
//---------------------------------------------------------------------------------------------------
//****在此设定DAC7512端口, 可根据实际使用改变********************************************************
sbit DAC_DIN = P3^3; //DAC7512数据线
sbit DAC_SCLK= P3^4; //DAC7512时钟线
sbit DAC_SYNC= P3^5; //DAC7512控制线
//---------------------------------------------------------------------------------------------------
//***************************************************************************************************
//微秒级延时函数的外部定义(引用文件 Time_Module.c) *
//***************************************************************************************************
extern void Delay_us(unsigned char nValue); //微秒为单位,24MHz晶振
//***************************************************************************************************
//*********************************** 函数声明 **************************************************
//***************************************************************************************************
void Start_I2C(void); //产生I2C总线的起始条件
void Stop_I2C(void); //产生I2C总线的停止条件
void WriteByte_I2C(unsigned char dat_add); //向I2C总线写1个字节的数据或地址
unsigned char ReadByte_I2C(void); //从I2C总线读1个字节的数据
bit GetAck_I2C(void); //读取从机应答位(应答或非应答)
void PutAck_I2C(bit ack); //主机产生应答位(应答或非应答)
bit SetADC (unsigned char writedata); //写 ADS1110 的配置寄存器,配置值低4位中有关
//数据速率(SPS) 和 增益设置(PGA) 的值无效, 只能在 AD_DA_Module.c 文件中修改 SPS 和 PGA 的值
bit ReadADC (unsigned int *readdata); //读 ADS1110 的AD转换值
bit Deal_ADC(unsigned int *ad_value); //读 ADS1110 的AD转换值并进行标度变换
void WriteDAC(unsigned int dacdata); //设置 DAC7512 的输出模拟量
void Deal_DAC(unsigned int da_value); //设置(经过标度变换的设置值,为十进制表示) DAC7512 的输出模拟量
//void hex_to_decimalist(unsigned int *value); //十六进制数转化为十进制数
//---------------------------------------------------------------------------------------------------
//***************************************************************************************************
//*********************************** 函数实现 **************************************************
//***************************************************************************************************
//*************************************************************************************************
//函数:void Start_I2C(void)
//功能:产生I2C总线的起始条件
//说明:SCL_I2C处于高电平期间,当SDA_I2C出现下降沿时启动I2C总线
// 本函数也用来产生重复起始条件
//*************************************************************************************************
void Start_I2C(void)
{
SDA_I2C = 1;
Delay_us(5);
SCL_I2C = 1; //起始条件建立时间大于4.7us
Delay_us(5);
SDA_I2C = 0;
Delay_us(5);
SCL_I2C = 0; //钳住I2C总线准备发送或接收数据
Delay_us(5);
}
//*************************************************************************************************
//函数:void Stop_I2C(void)
//功能:产生I2C总线的停止条件
//说明:SCL_I2C处于高电平期间,当SDA_I2C出现上升沿时停止I2C总线
//*************************************************************************************************
void Stop_I2C(void)
{
SDA_I2C = 0;
Delay_us(5);
SCL_I2C = 0;
Delay_us(5);
SCL_I2C = 1;
Delay_us(5);
SDA_I2C = 1;
Delay_us(5);
SCL_I2C = 0;
//对于某些器件来说,在下一次产生起始条件之前,额外增加一定的延时是必须的
Delay_us(50);
}
//*************************************************************************************************
//函数:void WriteByte_I2C(unsigned char dat_add)
//功能:向I2C总线写1个字节的数据或地址
//参数:dat_add是要写到总线上的数据或地址
//*************************************************************************************************
void WriteByte_I2C(unsigned char dat_add)
{
unsigned char t = 8;
do
{
SDA_I2C = (bit)(dat_add & 0x80); //发送位数据
Delay_us(4);//3.7增加
dat_add <<= 1;
SCL_I2C = 1;
Delay_us(5);
SCL_I2C = 0;
Delay_us(5);
} while ( --t != 0 );
}
//*************************************************************************************************
//函数:unsigned char ReadByte_I2C(void)
//功能:从I2C总线读取1个字节的数据
//返回:读取的1个字节数据
//*************************************************************************************************
unsigned char ReadByte_I2C(void)
{
unsigned char dat;
unsigned char t = 8;
SDA_I2C = 1; //在读取数据之前,要把SDA拉高,使之处于输入状态
Delay_us(5);
do
{
SCL_I2C = 1;
Delay_us(5);
dat <<= 1;
if ( SDA_I2C ) dat++;
SCL_I2C = 0;
Delay_us(5);
} while ( --t != 0 );
return dat;
}
//*************************************************************************************************
//函数:bit GetAck_I2C(void)
//功能:读取从机应答位(应答或非应答),用于判断:从机是否成功接收主机数据
//返回:
// 0; 从机应答
// 1; 从机非应答
//说明:从机在收到每一个字节后都要产生应答位,主机如果收到非应答则应当终止传输
//*************************************************************************************************
bit GetAck_I2C(void)
{
bit ack;
SDA_I2C = 1; //释放数据线准备接收应答位
Delay_us(5);
SCL_I2C = 1;
Delay_us(5);
ack = SDA_I2C; //读取应答位
SCL_I2C = 0;
Delay_us(5);
return ack;
}
//*************************************************************************************************
//函数:void PutAck_I2C(bit ack)
//功能:主机产生应答位(应答或非应答),用于通知从机:主机是否成功接收从机数据
//参数:
// ack=0; 主机应答
// ack=1; 主机非应答
//说明:主机在收到每一个字节后都要产生应答,在收到最后一个字节后,应当产生非应答
//*************************************************************************************************
void PutAck_I2C(bit ack)
{
SDA_I2C = ack; //发送应答位
Delay_us(5);
SCL_I2C = 1;
Delay_us(5);
SCL_I2C = 0;
Delay_us(5);
}
//***************************************************************************************************
//函数原型: bit SetADC(unsigned char writedata) *
//功 能: 主机通过I2C总线向ADS1110的配置寄存器写入配置值(其中SPS和PGA值无效) *
//参数说明: writedata; 配置值, 其中低4位中有关 数据速率(SPS) 和 增益设置(PGA) 的值无效 *
// 只能在此文件的前面修改 SPS 和 PGA 的值 *
//返 回 值: *
// 0;写入成功 *
// 1;写入失败 *
//***************************************************************************************************
bit SetADC(unsigned char writedata)
{
unsigned char s,p;
switch(SPS)
{
case 1: //240SPS
s = 0;
break;
case 4: //60SPS
s = 4;
break;
case 8: //30SPS
s = 8;
break;
case 16: //15SPS
s = 12;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -