|
本帖最后由 wubaqian 于 2019-9-3 11:06 編輯
//**************************************
//I2C起始信號(hào)
//**************************************
void I2C_Start()
{
SDAOUT; //數(shù)據(jù)線設(shè)為輸出方向
SDA1; //拉高數(shù)據(jù)線
SCL_OUT; //時(shí)鐘線設(shè)為輸出方向
SCL1; //拉高時(shí)鐘線
delayus(5); //延時(shí)
SDA0; //產(chǎn)生下降沿
delayus(5); //延時(shí)
SCL0; //拉低時(shí)鐘線
}
//**************************************
//I2C停止信號(hào)
//**************************************
void I2C_Stop()
{
SCL0; //拉低時(shí)鐘線,才可以改變數(shù)據(jù)
delayus(5); //延時(shí)
SDAOUT; //SDA設(shè)為輸出方向
SDA0; //拉低數(shù)據(jù)線
SCL1; //拉高時(shí)鐘線
delayus(5); //延時(shí)
SDA1; //產(chǎn)生上升沿
delayus(5); //延時(shí)
}
//**************************************
//I2C發(fā)送應(yīng)答信號(hào)
//入口參數(shù):ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(uchar ack)
{
SDAOUT; //SDA設(shè)為輸出方向
SCL0; //拉低時(shí)鐘線后才可以改變數(shù)據(jù)
if(ack) SDA1;
else SDA0;
// SDA = ack; //寫應(yīng)答信號(hào)
SCL1; //拉高時(shí)鐘線
delayus(5); //延時(shí)
SCL0; //拉低時(shí)鐘線
delayus(5); //延時(shí)
}
//**************************************
//I2C接收應(yīng)答信號(hào)
//cy=1,從機(jī)發(fā)送出的是NACK信號(hào)。
//cy=0,從機(jī)發(fā)送出的是ACK信號(hào)。
//**************************************
uchar I2C_RecvACK()
{
uchar cy;
SCL0;//時(shí)鐘線拉低,等待變?yōu)樯仙厝?shù)據(jù)
SCL1; //拉高時(shí)鐘線,開始讀取數(shù)據(jù)
SDAIN; //將SDA設(shè)為輸入方向
delayus(5); //延時(shí)
if(SDADATA)//接受到NACK信號(hào),發(fā)送停止信號(hào)
{
cy=1;
}
else
{
cy=0;
}
SCL0; //拉低時(shí)鐘線,讀取完畢
delayus(5); //延時(shí)
SDAOUT; //SDA設(shè)為輸出方向
return cy;
}
//**************************************
//向I2C總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)(寫數(shù)據(jù))
//**************************************
void I2C_SendByte(uchar dat)
{
uchar i;
SCL0;//拉低時(shí)鐘線,才能改變數(shù)據(jù)。
for (i=0; i<8; i++)
{
if((dat<<i)&0x80)//讀取最高位的數(shù)據(jù),如果最高位為1,則置1,否則置零
{
SDA1;
}
else
{
SDA0;
}
SCL1; //拉高時(shí)鐘線,穩(wěn)定數(shù)據(jù)
delayus(5); //延時(shí)
SCL0; //拉低時(shí)鐘線,準(zhǔn)備再次改變數(shù)據(jù)
delayus(5); //延時(shí)
}
I2C_RecvACK();
}
//**************************************
//從I2C總線接收一個(gè)字節(jié)數(shù)據(jù)
//**************************************
uchar I2C_RecvByte()
{
uchar i;
uchar dat = 0,cy;
SDAIN;
SCL0;//時(shí)鐘線拉低,允許數(shù)據(jù)改變
for (i=0; i<8; i++)
{
dat <<= 1; //從最低位開始接收數(shù)據(jù)
SCL1; //拉高時(shí)鐘線,讀取數(shù)據(jù),不允許數(shù)據(jù)發(fā)生變化
delayus(5); //延時(shí)
if(SDADATA)
{
cy=1;
}
else
{
cy=0;
}
dat |= cy; //讀數(shù)據(jù)
SCL0; //拉低時(shí)鐘線,允許數(shù)據(jù)變化
delayus(5); //延時(shí)
}
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位數(shù)據(jù)高字節(jié)
//iic
I2C_Start(); //起始信號(hào)
I2C_SendByte(SlaveAddress); //器件尋址,器件代嗎:1100; 地址位A2,A1,A0為 0 , 1 , 1最后一位為0-> 1100 0010
I2C_SendByte(temp); //發(fā)送高字節(jié)數(shù)據(jù)
I2C_SendByte(Dn); //將低8位送到DAC寄存器
I2C_Stop(); //發(fā)送停止信號(hào)
}
在此只提供部分程序,詳細(xì)內(nèi)容請(qǐng)下載后查看:
另外需要注意:
MCP4725引腳的連接方法:
VCC(VDD):+ 2.7V 至+ 5.5V
SDA:P2.2
SCL:P2.0
GND:接地
硬件連接條件:
1.找到硬件帶芯片的那一面上的三個(gè)金屬點(diǎn),它們分別是GND,A0,VCC。將中間的金屬點(diǎn)連接至VVC金屬點(diǎn)。自此,MCP4725的物理地址變?yōu)?xC2。
可使用功能:1.改變MCP4725_WriteData_Voltage(1.21);括號(hào)內(nèi)的數(shù)值,即可改變VOUT的輸出電壓。單位為V
|
-
-
proj MCP4725 DAC.zip
2019-9-3 11:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
83.99 KB, 下載次數(shù): 54, 下載積分: 黑幣 -5
|