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

代碼片段和文件信息
#include?“my.h“
/*?產生總線起始信號?*/
void?I2CStart()
{
????I2C_SDA?=?1;?//首先確保SDA、SCL都是高電平
????I2C_SCL?=?1;
????I2CDelay();
????I2C_SDA?=?0;?//先拉低SDA
????I2CDelay();
????I2C_SCL?=?0;?//再拉低SCL
}
/*?產生總線停止信號?*/
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-待寫入字節,返回值-從機應答位的值?*/
bit?I2CWrite(unsigned?char?dat)
{
????bit?ack;??//用于暫存應答位的值
????unsigned?char?mask;??//用于探測字節內某一位值的掩碼變量
????for?(mask=0x80;?mask!=0;?mask>>=1)?//從高位到低位依次進行
????{
????????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位數據發送完后,主機釋放SDA,以檢測從機應答
//????I2CDelay();
//????I2C_SCL?=?1;???//拉高SCL
//????ack?=?I2C_SDA;?//讀取此時的SDA值,即為從機的應答值
//????I2CDelay();
//????I2C_SCL?=?0;???//再拉低SCL完成應答位,并保持住總線
????return?0;//(~ack);?//應答值取反以符合通常的邏輯:
???????????????????//0=不存在或忙或寫入失敗,1=存在且空閑或寫入成功
}
/*?I2C總線讀操作,并發送非應答信號,返回值-讀到的字節?*/
unsigned?char?I2CReadNAK()
{
????unsigned?char?mask;
????unsigned?char?dat;
????I2C_SDA?=?1;??//首先確保主機釋放SDA
????for?(mask=0x80;?mask!=0;?mask>>=1)?//從高位到低位依次進行
????{
????????I2CDelay();
????????I2C_SCL?=?1;??????//拉高SCL
????????if(I2C_SDA?==?0)??//讀取SDA的值
????????????dat?&=?~mask;?//為0時,dat中對應位清零
????????else
????????????dat?|=?mask;??//為1時,dat中對應位置1
????????I2CDelay();
????????I2C_SCL?=?0;??????//再拉低SCL,以使從機發送出下一位
????}
????I2C_SDA?=?1;???//8位數據發送完后,拉高SDA,發送非應答信號
????I2CDelay();
????I2C_SCL?=?1;???//拉高SCL
????I2CDelay();
????I2C_SCL?=?0;???//再拉低SCL完成非應答位,并保持住總線
????return?dat;
}
/*?I2C總線讀操作,并發送應答信號,返回值-讀到的字節?*/
unsigned?char?I2CReadACK()
{
????unsigned?char?mask;
????unsigned?char?dat;
????I2C_SDA?=?1;??//首先確保主機釋放SDA
????for?(mask=0x80;?mask!=0;?mask>>=1)?//從高位到低位依次進行
????{
????????I2CDelay();
????????I2C_SCL?=?1;??????//拉高SCL
????????if(I2C_SDA?==?0)??//讀取SDA的值
????????????dat?&=?~mask;?//為0時,dat中對應位清零
????????else
????????????dat?|=?mask;??//為1時,dat中對應位置1
????????I2CDelay();
????????I2C_SCL?=?0;??????//再拉低SCL,以使從機發送出下一位
????}
????I2C_SDA?=?0;???//8位數據發送完后,拉低SDA,發送應答信號
????I2CDelay();
????I2C_SCL?=?1;???//拉高SCL
????I2CDelay();
????I2C_SCL?=?0;???//再拉低SCL完成應答位,并保持住總線
????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
評論
共有 條評論