//**************************************
//I2C起始信号
//**************************************
void I2C_Start()
{
SDAOUT; //数据线设为输出方向
SDA1; //拉高数据线
SCL_OUT; //时钟线设为输出方向
SCL1; //拉高时钟线
delayus(5); //延时
SDA0; //产生下降沿
delayus(5); //延时
SCL0; //拉低时钟线
}
//**************************************
//I2C停止信号
//**************************************
void I2C_Stop()
{
SCL0; //拉低时钟线,才可以改变数据
delayus(5); //延时
SDAOUT; //SDA设为输出方向
SDA0; //拉低数据线
SCL1; //拉高时钟线
delayus(5); //延时
SDA1; //产生上升沿
delayus(5); //延时
}
//**************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(uchar ack)
{
SDAOUT; //SDA设为输出方向
SCL0; //拉低时钟线后才可以改变数据
if(ack) SDA1;
else SDA0;
// SDA = ack; //写应答信号
SCL1; //拉高时钟线
delayus(5); //延时
SCL0; //拉低时钟线
delayus(5); //延时
}
//**************************************
//I2C接收应答信号
//cy=1,从机发送出的是NACK信号。
//cy=0,从机发送出的是ACK信号。
//**************************************
uchar I2C_RecvACK()
{
uchar cy;
SCL0;//时钟线拉低,等待变为上升沿取数据
SCL1; //拉高时钟线,开始读取数据
SDAIN; //将SDA设为输入方向
delayus(5); //延时
if(SDADATA)//接受到NACK信号,发送停止信号
{
cy=1;
}
else
{
cy=0;
}
SCL0; //拉低时钟线,读取完毕
delayus(5); //延时
SDAOUT; //SDA设为输出方向
return cy;
}
//**************************************
//向I2C总线发送一个字节数据(写数据)
//**************************************
void I2C_SendByte(uchar dat)
{
uchar i;
SCL0;//拉低时钟线,才能改变数据。
for (i=0; i<8; i++)
{
if((dat<<i)&0x80)//读取最高位的数据,如果最高位为1,则置1,否则置零
{
SDA1;
}
else
{
SDA0;
}
SCL1; //拉高时钟线,稳定数据
delayus(5); //延时
SCL0; //拉低时钟线,准备再次改变数据
delayus(5); //延时
}
I2C_RecvACK();
}
//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
{
uchar i;
uchar dat = 0,cy;
SDAIN;
SCL0;//时钟线拉低,允许数据改变
for (i=0; i<8; i++)
{
dat <<= 1; //从最低位开始接收数据
SCL1; //拉高时钟线,读取数据,不允许数据发生变化
delayus(5); //延时
if(SDADATA)
{
cy=1;
}
else
{
cy=0;
}
dat |= cy; //读数据
SCL0; //拉低时钟线,允许数据变化
delayus(5); //延时
}
SDAOUT;
return dat;
}
//MCP4725
//使用快速模式写命令写DAC寄存器
void MCP4725_WriteData_Voltage(float Vout) //电压单位V
{
unsigned char temp;
unsigned int Dn;
Dn = ( 4096 * Vout)/5;
temp = (0x0F00 & Dn) >> 8; //12位数据高字节
//iic
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //器件寻址,器件代吗:1100; 地址位A2,A1,A0为 0 , 1 , 1最后一位为0-> 1100 0010
I2C_SendByte(temp); //发送高字节数据
I2C_SendByte(Dn); //将低8位送到DAC寄存器
I2C_Stop(); //发送停止信号
}
在此只提供部分程序,详细内容请下载后查看:
另外需要注意:
MCP4725引脚的连接方法:
VCC(VDD):+ 2.7V 至+ 5.5V
SDA:P2.2
SCL:P2.0
GND:接地
硬件连接条件:
1.找到硬件带芯片的那一面上的三个金属点,它们分别是GND,A0,VCC。将中间的金属点连接至VVC金属点。自此,MCP4725的物理地址变为0xC2。
可使用功能:1.改变MCP4725_WriteData_Voltage(1.21);括号内的数值,即可改变VOUT的输出电压。单位为V