性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

一口Linux
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專題目錄 查看專題
SATA、mSATA、M.2、PCIe!SSD接口那點(diǎn)事
深入解析什么是磁盤陣列技術(shù)?常用的磁盤陣列有哪幾種?
家庭用電都是交流電,為何會(huì)有零線和火線的區(qū)別?
一分鐘讓你了解芯片工作的心臟——晶振
I2c通訊介紹及代碼演示
EEPROM存儲(chǔ)數(shù)據(jù)的原理
作者動(dòng)態(tài) 更多
linux系統(tǒng)監(jiān)控工具小神器:btop
2天前
有沒有權(quán)貴開后門讓子女做軟件開發(fā)人員?
1星期前
一文包你學(xué)會(huì)網(wǎng)絡(luò)數(shù)據(jù)抓包
03-15 09:26
C語言初學(xué)者編程水平上不來?不妨嘗試這10個(gè)C語言例子
03-14 20:31
Linux rootfs:如何開機(jī)就自動(dòng)添加某個(gè)用戶?
03-09 22:18

I2c通訊介紹及代碼演示

I2c通訊介紹及代碼演示

1.啟動(dòng)和停止波形圖

2.程序

就SDA有區(qū)別

啟動(dòng)   停止

Sda=1 Sda=0

Scl=1  Scl=1

Sda=1  Sda=1

Scl=0  Scl=0

?

/*
------------------------------------------------
啟動(dòng)IIC總線

------------------------------------------------*/
void Start(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}
/*
------------------------------------------------
停止IIC總線

------------------------------------------------*/
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Sda=1;
_nop_();
Scl=0;
}

3.應(yīng)答與非應(yīng)答

應(yīng)答   非應(yīng)答

Sda=0  Sda=1

Scl=1   Scl=1

Scl=1   Scl=0

/*
------------------------------------------------
應(yīng)答IIC總線

------------------------------------------------*/
void Ack(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*
------------------------------------------------
非應(yīng)答IIC總線

------------------------------------------------*/
void NoAck(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}

4.發(fā)送與接收

發(fā)送數(shù)據(jù)  接收數(shù)據(jù)

Scl=0      Sda=1(執(zhí)行1次)

數(shù)據(jù)       Scl=0

Scl=1(執(zhí)行1次)   Scl=1

                            數(shù)據(jù)

/*
------------------------------------------------
發(fā)送一個(gè)字節(jié)

------------------------------------------------*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl=0;
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*
------------------------------------------------
讀入一個(gè)字節(jié)并返回

------------------------------------------------*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();
Scl=1;
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}

5.i2C總體程序

sbit Sda=P2^0; //定義總線連接端口
sbit Scl=P2^1;
/*
------------------------------------------------
啟動(dòng)IIC總線

------------------------------------------------*/
void Start(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}
/*
------------------------------------------------
停止IIC總線

------------------------------------------------*/
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Sda=1;
_nop_();
Scl=0;
}
/*
------------------------------------------------
應(yīng)答IIC總線

------------------------------------------------*/
void Ack(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*
------------------------------------------------
非應(yīng)答IIC總線

------------------------------------------------*/
void NoAck(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*
------------------------------------------------
發(fā)送一個(gè)字節(jié)

------------------------------------------------*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl=0;
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*
------------------------------------------------
讀入一個(gè)字節(jié)并返回

------------------------------------------------*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();
Scl=1;
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
/*
------------------------------------------------
寫入DA數(shù)模轉(zhuǎn)換值

------------------------------------------------*/
void DAC(unsigned char Data)
{
Start();
Send(AddWr); //寫入芯片地址
Ack();
Send(0x40); //寫入控制位,使能DAC輸出
Ack();
Send(Data); //寫數(shù)據(jù)
Ack();
Stop();
}
/*
------------------------------------------------
讀取AD模數(shù)轉(zhuǎn)換的值,有返回值

------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Data;
Start(); //寫入芯片地址
Send(AddWr);
Ack();
Send(0x40|Chl);//寫入選擇的通道,本程序只用單端輸入,差分部分需要自行添加
//Chl的值分別為0、1、2、3,分別代表1-4通道
Ack();
Start();
Send(AddRd); //讀入地址
Ack();
Data=Read(); //讀數(shù)據(jù)
Scl=0;
NoAck();
Stop();
return Data; //返回值
}

5.i2C總體程序

sbit Sda=P2^0; //定義總線連接端口
sbit Scl=P2^1;
/*
------------------------------------------------
啟動(dòng)IIC總線

------------------------------------------------*/
void Start(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}
/*
------------------------------------------------
停止IIC總線

------------------------------------------------*/
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Sda=1;
_nop_();
Scl=0;
}
/*
------------------------------------------------
應(yīng)答IIC總線

------------------------------------------------*/
void Ack(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*
------------------------------------------------
非應(yīng)答IIC總線

------------------------------------------------*/
void NoAck(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*
------------------------------------------------
發(fā)送一個(gè)字節(jié)

------------------------------------------------*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl=0;
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*
------------------------------------------------
讀入一個(gè)字節(jié)并返回

------------------------------------------------*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();
Scl=1;
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
/*
------------------------------------------------
寫入DA數(shù)模轉(zhuǎn)換值

------------------------------------------------*/
void DAC(unsigned char Data)
{
Start();
Send(AddWr); //寫入芯片地址
Ack();
Send(0x40); //寫入控制位,使能DAC輸出
Ack();
Send(Data); //寫數(shù)據(jù)
Ack();
Stop();
}
/*
------------------------------------------------
讀取AD模數(shù)轉(zhuǎn)換的值,有返回值

------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Data;
Start(); //寫入芯片地址
Send(AddWr);
Ack();
Send(0x40|Chl);//寫入選擇的通道,本程序只用單端輸入,差分部分需要自行添加
//Chl的值分別為0、1、2、3,分別代表1-4通道
Ack();
Start();
Send(AddRd); //讀入地址
Ack();
Data=Read(); //讀數(shù)據(jù)
Scl=0;
NoAck();
Stop();
return Data; //返回值
}

拿去套用就行

i2C總流程

/*
------------------------------------------------
寫入DA數(shù)模轉(zhuǎn)換值

------------------------------------------------*/
void DAC(unsigned char Data)
{
Start();
Send(AddWr); //寫入芯片地址
Ack();
Send(0x40); //寫入控制位,使能DAC輸出
Ack();
Send(Data); //寫數(shù)據(jù)
Ack();
Stop();
}
/*
------------------------------------------------
讀取AD模數(shù)轉(zhuǎn)換的值,有返回值

------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Data;
Start(); //寫入芯片地址
Send(AddWr);
Ack();
Send(0x40|Chl);//寫入選擇的通道,本程序只用單端輸入,差分部分需要自行添加
//Chl的值分別為0、1、2、3,分別代表1-4通道
Ack();
Start();
Send(AddRd); //讀入地址
Ack();
Data=Read(); //讀數(shù)據(jù)
Scl=0;
NoAck();
Stop();
return Data; //返回值
}

這個(gè)是我ad四路掃描程序部分

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 2
收藏 1
關(guān)注 181
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧