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

📄 ad1110_.c

📁 单片机与pc机通讯例程的mcu部分
💻 C
字号:
#include "Def_.h"

/*----------------------------------------------------
读取模拟电压值,ic元件为AD1110,IIC方式通讯
----------------------------------------------------*/

#define USE_AD_I2C_DRIVER		1
#if USE_AD_I2C_DRIVER
static unsigned char AdI2cSerIn(unsigned char x);
static unsigned char AdI2cSerOut(unsigned char ack);
static unsigned char AdI2cBusyCheck(unsigned char icAddr);
static void AdI2cStart(void);
static void AdI2cStop(void);
static void AdI2cClk(void);
static void AdI2cNop(void);


static void AdI2cNop(void)
/*
IIC延时函数
*/
{
	_nop_();
	_nop_();
}

static void AdI2cStart(void)
/*
IIC开始函数
*/
{
//while PAdI2cClk=1,PAdI2cDat=1->0
	PAdI2cClk=0;
	PAdI2cDat=1;
	AdI2cNop();
	PAdI2cClk=1;
	AdI2cNop();
	PAdI2cDat=0;
	AdI2cNop();
	PAdI2cClk=0;
}

static void AdI2cStop(void)
/*
IIC停止函数
*/
{
//while scl=1,sda=0->1
	PAdI2cClk=0;
	PAdI2cDat=0;
	AdI2cNop();
	PAdI2cClk=1;
	AdI2cNop();
	PAdI2cDat=1;
	AdI2cNop();
	PAdI2cClk=0;
}

static void AdI2cClk(void)
/*
IIC的时钟脉冲函数
*/
{
	AdI2cNop();
	PAdI2cClk=1;
	AdI2cNop();
	PAdI2cClk=0;
}

static unsigned char AdI2cSerIn(unsigned char x)
/*
向IIC写入一个字节信息
*/
{
	unsigned char i;
	unsigned char result;
	for(i=8;i;i--)
	{
		PAdI2cDat=x&0x80;
		x<<=1;
		AdI2cClk();
	}
	PAdI2cDat=1;
	AdI2cNop();
	if(PAdI2cDat)	result = 0;
	else			result = 1;
	AdI2cClk();
	return (result);
}


#define CHECK_IIC_TIMES		20
static unsigned char AdI2cBusyCheck(unsigned char icAddr)
/*	返回非零表示IIC忙线	*/
{
	unsigned char i;
	for(i=0;i<CHECK_IIC_TIMES;i++)
	{
		AdI2cStart();
		if(AdI2cSerIn(icAddr))	break;
	}
	if(CHECK_IIC_TIMES == i)	return 1;
	else						return 0;
}

static unsigned char AdI2cSerOut(unsigned char ack)
/*
从IIC读出一个字节信息
*/
{
	unsigned char i,val;
	PAdI2cDat=1;
	for(i=8;i;i--)
	{
		val<<=1;
		if(PAdI2cDat) val++;
		AdI2cClk();
	}
	if(ack)
	{
		PAdI2cDat=0;
		AdI2cClk();
	}
	return(val);
}

#endif


unsigned char RdAdI2cIc(unsigned char icAddr,unsigned int* x)
/*
读取AD1110的电压数字值
*/
{
	if(AdI2cBusyCheck(icAddr)) return 0;
	AdI2cStart();
	AdI2cSerIn(icAddr+1);
	*x = AdI2cSerOut(1)<<8;
	*x += AdI2cSerOut(1);
	AdI2cSerOut(0);
	AdI2cStop();
	return 1;
}

unsigned char AdWrCfg(unsigned char icAddr)
/*
写入AD1110的配置字
*/
{
	if(AdI2cBusyCheck(icAddr))	return 0;
	AdI2cSerIn(AD1110_CONFIG_CMD);
	AdI2cStop();
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -