⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad_da_module.c

📁 16位AD(ADS1110),12位DA(DAC7512)底层驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************************************
描	述:			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 + -