資源簡介
程序的作用是控制 PCA9685 來實(shí)現(xiàn)控制舵機(jī)的功能 這個程序的底層邏輯 改編自 Arduino版本的代碼 現(xiàn)在改變成51代碼 使用的時候不要忘了 設(shè)置好自己的控制器地址 默認(rèn)地址 0x80!!!

代碼片段和文件信息
#include?“my.h“
/*?產(chǎn)生總線起始信號?*/
void?I2CStart()
{
????I2C_SDA?=?1;?//首先確保SDA、SCL都是高電平
????I2C_SCL?=?1;
????I2CDelay();
????I2C_SDA?=?0;?//先拉低SDA
????I2CDelay();
????I2C_SCL?=?0;?//再拉低SCL
}
/*?產(chǎn)生總線停止信號?*/
void?I2CStop()
{
????I2C_SCL?=?0;?//首先確保SDA、SCL都是低電平
????I2C_SDA?=?0;
????I2CDelay();
????I2C_SCL?=?1;?//先拉高SCL
????I2CDelay();
????I2C_SDA?=?1;?//再拉高SDA
????I2CDelay();
}?
void?IIC_Ack(void)
{
I2C_SCL=0;
I2C_SDA=0;
I2CDelay();
I2C_SCL=1;
I2CDelay();
I2C_SCL=0;
}
/*?I2C總線寫操作,dat-待寫入字節(jié),返回值-從機(jī)應(yīng)答位的值?*/
bit?I2CWrite(unsigned?char?dat)
{
????bit?ack;??//用于暫存應(yīng)答位的值
????unsigned?char?mask;??//用于探測字節(jié)內(nèi)某一位值的掩碼變量
????for?(mask=0x80;?mask!=0;?mask>>=1)?//從高位到低位依次進(jìn)行
????{
????????if?((mask&dat)?==?0)??//該位的值輸出到SDA上
????????????I2C_SDA?=?0;
????????else
????????????I2C_SDA?=?1;
????????I2CDelay();
????????I2C_SCL?=?1;??????????//拉高SCL
????????I2CDelay();
????????I2C_SCL?=?0;??????????//再拉低SCL,完成一個位周期
????}
//????I2C_SDA?=?1;???//8位數(shù)據(jù)發(fā)送完后,主機(jī)釋放SDA,以檢測從機(jī)應(yīng)答
//????I2CDelay();
//????I2C_SCL?=?1;???//拉高SCL
//????ack?=?I2C_SDA;?//讀取此時的SDA值,即為從機(jī)的應(yīng)答值
//????I2CDelay();
//????I2C_SCL?=?0;???//再拉低SCL完成應(yīng)答位,并保持住總線
????return?0;//(~ack);?//應(yīng)答值取反以符合通常的邏輯:
???????????????????//0=不存在或忙或?qū)懭胧。?=存在且空閑或?qū)懭氤晒?br/>}
/*?I2C總線讀操作,并發(fā)送非應(yīng)答信號,返回值-讀到的字節(jié)?*/
unsigned?char?I2CReadNAK()
{
????unsigned?char?mask;
????unsigned?char?dat;
????I2C_SDA?=?1;??//首先確保主機(jī)釋放SDA
????for?(mask=0x80;?mask!=0;?mask>>=1)?//從高位到低位依次進(jìn)行
????{
????????I2CDelay();
????????I2C_SCL?=?1;??????//拉高SCL
????????if(I2C_SDA?==?0)??//讀取SDA的值
????????????dat?&=?~mask;?//為0時,dat中對應(yīng)位清零
????????else
????????????dat?|=?mask;??//為1時,dat中對應(yīng)位置1
????????I2CDelay();
????????I2C_SCL?=?0;??????//再拉低SCL,以使從機(jī)發(fā)送出下一位
????}
????I2C_SDA?=?1;???//8位數(shù)據(jù)發(fā)送完后,拉高SDA,發(fā)送非應(yīng)答信號
????I2CDelay();
????I2C_SCL?=?1;???//拉高SCL
????I2CDelay();
????I2C_SCL?=?0;???//再拉低SCL完成非應(yīng)答位,并保持住總線
????return?dat;
}
/*?I2C總線讀操作,并發(fā)送應(yīng)答信號,返回值-讀到的字節(jié)?*/
unsigned?char?I2CReadACK()
{
????unsigned?char?mask;
????unsigned?char?dat;
????I2C_SDA?=?1;??//首先確保主機(jī)釋放SDA
????for?(mask=0x80;?mask!=0;?mask>>=1)?//從高位到低位依次進(jìn)行
????{
????????I2CDelay();
????????I2C_SCL?=?1;??????//拉高SCL
????????if(I2C_SDA?==?0)??//讀取SDA的值
????????????dat?&=?~mask;?//為0時,dat中對應(yīng)位清零
????????else
????????????dat?|=?mask;??//為1時,dat中對應(yīng)位置1
????????I2CDelay();
????????I2C_SCL?=?0;??????//再拉低SCL,以使從機(jī)發(fā)送出下一位
????}
????I2C_SDA?=?0;???//8位數(shù)據(jù)發(fā)送完后,拉低SDA,發(fā)送應(yīng)答信號
????I2CDelay();
????I2C_SCL?=?1;???//拉高SCL
????I2CDelay();
????I2C_SCL?=?0;???//再拉低SCL完成應(yīng)答位,并保持住總線
????return?dat;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????2993??2018-08-15?18:58??Servo_Controler\I2C.c
?????文件???????1145??2018-08-15?20:32??Servo_Controler\main.c
?????文件???????1620??2018-08-15?19:07??Servo_Controler\my.h
?????文件???????2189??2018-08-15?19:08??Servo_Controler\PCA9685.c
????.......?????14127??2018-08-15?20:32??Servo_Controler\Servo_Controler.uvproj
?????文件???????6027??2018-08-15?18:53??Servo_Controler\代碼.txt
?????目錄??????????0??2018-08-15?20:33??Servo_Controler
-----------?---------??----------?-----??----
????????????????28101????????????????????7
評論
共有 條評論