程序框圖
單片機IIC控制流程框圖
代碼實現(xiàn)
IIC實現(xiàn)代碼(前面的宏定義適用于MSP430)
#define uchar unsigned char
#define uint unsigned int
//=====================================延時函數(shù)=================================
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//=====================================IIC地址設(shè)置=================================
#define WHO_AM_I 0x75 //IIC地址寄存器(默認數(shù)值0x68,只讀)--(6050)
#define SlaveAddress 0x80 //IIC寫入時的地址字節(jié)數(shù)據(jù),+1為讀取--(PCA9685)
//=====================================IIC端口定義=================================
#define SCL1 P1OUT|=BIT4
#define SCL0 P1OUT&= ~BIT4
#define SDA1 P1OUT|=BIT5 //IIC數(shù)據(jù)引腳
#define SDA0 P1OUT&= ~BIT5
#define SDAIN P1DIR&= ~BIT5
#define SDAOUT P1DIR|=BIT5
#define SDADATA (P1IN&BIT5)
//================================I2C起始信號================================
void I2C_Start()
{
SDA1; //拉高數(shù)據(jù)線
SCL1; //拉高時鐘線
delay_us(5); //延時
SDA0; //產(chǎn)生下降沿
delay_us(5);
SCL0; //拉低時鐘線
}
//================================I2C停止信號================================
void I2C_Stop()
{
SDA0; //拉高數(shù)據(jù)線
SCL1;
delay_us(5);
SDA1; //產(chǎn)生上升沿
delay_us(5);
}
//================================I2C發(fā)送應(yīng)答信號 入口參數(shù):ack (0:ACK 1:NAK)================================
void I2C_SendACK(uchar ack)
{
SDAOUT;
if(ack)
SDA1;
else
SDA0;
//SDA=ack; //讀應(yīng)答信號
SCL1;
delay_us(5);
SCL0; //拉低時鐘線
delay_us(5);
}
//================================I2C接收應(yīng)答信號================================
uchar I2C_RecvACK()
{
uchar cy;
SCL1;
SDAIN;
delay_us(5);
if(SDADATA)
{
cy=1;
}
else
{
cy=0;
}
//cy=SDA; //讀應(yīng)答信號
SCL0;
delay_us(5);
SDAOUT;
return cy;
}
//================================向I2C總線發(fā)送一個字節(jié)數(shù)據(jù)================================
void I2C_SendByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++) //8位計數(shù)器
{
if((dat< {
SDA1;
}
else
{
SDA0;
}
//SDA=cy; //送數(shù)據(jù)口
SCL1;
delay_us(5);
SCL0;
delay_us(5);
}
I2C_RecvACK();
}
//================================從I2C總線接收一個字節(jié)數(shù)據(jù)================================
uchar I2C_RecvByte()
{
uchar i;
uchar dat=0,cy;
SDA1; //使能內(nèi)部上拉,準備讀取數(shù)據(jù),
SDAIN; //8位計數(shù)器
for(i=0;i<8;i++)
{
dat<<=1;
SCL1;
delay_us(5);
if(SDADATA)
{
cy=1;
}
else
{
cy=0;
}
dat|=cy; //讀數(shù)據(jù)
SCL0;
delay_us(5);
}
SDAOUT;
return dat;
}
//=======================向I2C設(shè)備寫入一個字節(jié)數(shù)據(jù)======================================
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
{
I2C_Start(); //起始信號
I2C_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫信號
I2C_SendByte(REG_Address); //內(nèi)部寄存器地址
I2C_SendByte(REG_data); //內(nèi)部寄存器數(shù)據(jù)
I2C_Stop(); //發(fā)送停止信號
}
//======================從I2C設(shè)備讀取一個字節(jié)數(shù)據(jù)=====================================
uchar Single_ReadI2C(uchar REG_Address)
{
uchar REG_data;
I2C_Start(); //起始信號
I2C_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫信號
I2C_SendByte(REG_Address); //發(fā)送存儲單元地址,從0開始
I2C_Start(); //起始信號
I2C_SendByte(SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號
REG_data=I2C_RecvByte(); //讀出寄存器數(shù)據(jù)
I2C_SendACK(1); //接收應(yīng)答信號
I2C_Stop(); //停止信號
return REG_data;
}
//======================================合成數(shù)據(jù)======================================
int GetData(uchar REG_Address)
{
char H,L;
H=Single_ReadI2C(REG_Address);
L=Single_ReadI2C(REG_Address+1);
return (H<<8)+L; //合成數(shù)據(jù)
}
單片機調(diào)用程序(對應(yīng)于pca9685驅(qū)動板從機)
設(shè)置PWM頻率
void setPWMFreq(float freq)
{
uint prescale,oldmode,newmode;
float prescaleval;
freq_re=freq;
freq *= 0.96; // 用于糾正頻率偏差
prescaleval = 25000000;
prescaleval /= 4096;
prescaleval /= freq;
prescaleval -= 1;
// prescale = floor(prescaleval + 0.5);
prescale=(int)(prescaleval + 0.5 );
oldmode = Single_ReadI2C(PCA9685_MODE1);
newmode = (oldmode&0x7F) | 0x10; // sleep
Single_WriteI2C(PCA9685_MODE1, newmode); //調(diào)用之前寫的IIC寫入函數(shù),go to sleep
Single_WriteI2C(PCA9685_PRESCALE, prescale); // set the prescaler
Single_WriteI2C(PCA9685_MODE1, oldmode);
delay_ms(2);
Single_WriteI2C(PCA9685_MODE1, oldmode | 0xa1);
}
設(shè)置pca9685各個舵機輸出寄存器的值
// =========================輸出通道設(shè)置,占空比設(shè)置從0到ON跳成高 再到off跳成低====================================
void setPWM(uint num, uint on, uint off) //0--4096
{
Single_WriteI2C(LED0_ON_L+4*num,on);
Single_WriteI2C(LED0_ON_H+4*num,on>>8);
Single_WriteI2C(LED0_OFF_L+4*num,off);
Single_WriteI2C(LED0_OFF_H+4*num,off>>8);
}
// =========================num通道,ms高電平毫秒====================================
void setPWM_ms(uint num,float time_ms)
{
uint time;
time=(uint)((time_ms*freq_re/1000)*4096);
setPWM(num, 0, time) ;
}
/******************************************************************************************************
* 名 稱:setARC()
* 功 能:設(shè)置舵機角度
* 入口參數(shù):舵機口num,角度arc
* 出口參數(shù):無
* 說 明:
* 范 例:無
******************************************************************************************************/
void setARC(uint num,float arc)
{
float time_ms=arc*2/180+0.5;
setPWM_ms(num,time_ms);
}
上一篇:#pragma vector語句在IAR for MSP430中斷程序編程過程中的使用
下一篇:基于MSP430與RC522的RFID簡單應(yīng)用(1)
推薦閱讀
史海拾趣
在穩(wěn)固國內(nèi)市場的同時,Electrocube Inc公司積極開拓國際市場。公司參加了多個國際電子展會,與全球知名電子企業(yè)建立了廣泛的合作關(guān)系。通過不斷的市場拓展,Electrocube Inc公司的產(chǎn)品已經(jīng)遠銷歐美、亞洲等多個國家和地區(qū),實現(xiàn)了跨越式的發(fā)展。
隨著技術(shù)的不斷成熟和產(chǎn)品的日益完善,Exclara開始將目光投向全球市場。公司積極拓展海外市場,通過參加國際展會、與當?shù)睾献骰锇榻?zhàn)略合作關(guān)系等方式,不斷提升品牌知名度和市場份額。同時,公司也在全球范圍內(nèi)建立了完善的銷售網(wǎng)絡(luò)和售后服務(wù)體系,以確??蛻裟軌蛳硎艿絻?yōu)質(zhì)的產(chǎn)品和服務(wù)。
隨著環(huán)保意識的不斷提高,綠色制造成為電子行業(yè)的重要發(fā)展趨勢。川晶科技積極響應(yīng)國家綠色發(fā)展的號召,通過引進先進的環(huán)保設(shè)備和技術(shù),實現(xiàn)了生產(chǎn)過程的綠色化、低碳化。公司不斷優(yōu)化生產(chǎn)工藝,減少能源消耗和廢棄物排放,推動產(chǎn)品向綠色、環(huán)保方向發(fā)展。川晶科技的綠色制造實踐得到了業(yè)界的廣泛贊譽,成為行業(yè)內(nèi)的綠色標桿。
在電子行業(yè)中,品質(zhì)控制和質(zhì)量管理是企業(yè)生存和發(fā)展的關(guān)鍵。凱勵公司深知這一點,建立了嚴格的質(zhì)量管理體系和檢測機制。公司從原材料采購到生產(chǎn)制造、產(chǎn)品檢測等各個環(huán)節(jié)都嚴格把控品質(zhì),確保產(chǎn)品的穩(wěn)定性和可靠性。此外,凱勵公司還引進了先進的生產(chǎn)設(shè)備和檢測儀器,提高了生產(chǎn)效率和產(chǎn)品質(zhì)量。
在20世紀中期,GI作為一家新興的電子設(shè)備制造商,以其對新興技術(shù)的敏銳洞察力和創(chuàng)新精神而嶄露頭角。公司創(chuàng)始人意識到半導(dǎo)體技術(shù)的巨大潛力,決定投入大量資源進行研發(fā)。通過不懈努力,GI成功推出了多款基于半導(dǎo)體技術(shù)的創(chuàng)新產(chǎn)品,如早期的晶體管收音機和電視機,這些產(chǎn)品不僅在當時市場上引起了轟動,也為公司后續(xù)的快速發(fā)展奠定了堅實基礎(chǔ)。這一階段的成功,標志著GI在電子行業(yè)技術(shù)創(chuàng)新的道路上邁出了堅實的一步。
Corsair Electrical Connectors Inc公司自創(chuàng)立之初,便專注于電氣連接器的制造。公司創(chuàng)始人憑借其深厚的行業(yè)經(jīng)驗和敏銳的市場洞察力,準確把握了連接器在電子行業(yè)中的重要地位,并決定以此為切入點,打造一家專業(yè)的連接器制造商。在創(chuàng)立初期,Corsair面臨著資金短缺、技術(shù)落后等多重困難,但創(chuàng)始人憑借堅定的信念和不懈的努力,帶領(lǐng)公司逐步走上了正軌。
NorFlash應(yīng)用問題(39VF1601型號) 1)NorFlash可供使用的地址空間應(yīng)該從0x0000開始吧。那么為什么在手冊中在說明ID讀取時,如下:manufacturer\'s ID 0000H(address) 00BFH(data) ; Device ID 0001H(address) 2782H(data) 。感到不 ...… 查看全部問答∨ |
|
我的系統(tǒng)主要是對來自camera接口的數(shù)據(jù)進行圖像處理,并通過USB OTG口(作為device使用)上傳給PC機。不需要運行其它進程。 硬件選用s3c6410。經(jīng)過在s3c2442的PDA上跑圖像處理測試代碼,時間比較緊張,主要瓶頸在存儲器訪問上。因此我們打算給6410 ...… 查看全部問答∨ |
我由CDialog類派生了一個新類DlgMenu 然后定義了一個DlgMenu類型變量Dlg1; 寫了一個函數(shù):void Fun(CDialog myDlg) 當我這樣調(diào)用這個函數(shù)時Fun(Dlg1),為什么不行? 程序報錯:cannot convert parameter 1 from \'class DlgMenu ‘to \'class C ...… 查看全部問答∨ |
void main(void) { unsigned char xdata* data dptr; unsigned char i,VOUT=0; float Y,Y1,Y2,X; while(1) { dptr=0x7ff8; ...… 查看全部問答∨ |
要設(shè)計產(chǎn)品,首先要確定用誰的LED封裝結(jié)構(gòu);接下來考慮怎樣適應(yīng)這些封裝形式; 由我們選擇的機會不多,光學結(jié)構(gòu)是建立在這些封裝之上的;我們很多創(chuàng)意不能很好的發(fā)揮。下面介紹LED照明設(shè)計過程中的關(guān)鍵問題及分析。 一、半導(dǎo)體照明應(yīng)用中存在 ...… 查看全部問答∨ |
最近用IAR4.2開發(fā)ST,發(fā)現(xiàn)它默認的縮進只有兩個空格,像 if(a) { ? ?b; } 不知道能不能修改成默認有更多空格,比如四個,像 if(a) { ? ? ? ? b; } 求教!… 查看全部問答∨ |
430 能進行指數(shù)運算嗎? 如果能該怎樣實現(xiàn)?? #include <math.h> void main(void) { dou××e i; i=exp(1.5); } 但從 watch 中檢測 i 值 ,顯示 un××iala××e 怎么一回事?? 3ks… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 電動車電池成本降一半,續(xù)航卻減一半?寧德時代新電池能突圍嗎?
- 從“不可修”到可拆可換:CTP電池的售后怎么辦?
- 區(qū)域控制器ZCU國產(chǎn)化:從物料齊全到系統(tǒng)話語權(quán)
- 總額超260億-盤點全球移動機器人領(lǐng)域融資TOP10企業(yè)
- 安森美CEO談?wù)撾妱悠嚺cAI服務(wù)器前景
- LILYGO T-LoRa Pager:復(fù)古造型與前沿技術(shù)結(jié)合的物聯(lián)網(wǎng)手持設(shè)備
- VS Code+PlatformIO搭建ESP32 Arduino開發(fā)環(huán)境
- Esp32環(huán)境離線搭建參考
- ESP32使用舵機庫時的錯誤
- ESP32 S3接ST7789屏幕線序
- 汽車VCU知識問答第二站:了解VCU開發(fā)流程和任務(wù)分解、崗位需求
- 你有原創(chuàng),我有豪禮!(原創(chuàng)精選評選第7期)
- 【EEWORLD第二十六屆】2011年05月社區(qū)明星人物揭曉!
- 聽技術(shù)大咖侃談Type-C 測量那些事兒—— 即刻獲取能量,輕松闖關(guān)贏禮品!
- 【限時福利】學邊緣AI,得NXP FRDM-MCXN947開發(fā)板!表現(xiàn)優(yōu)異再加碼200元京東卡!Follow me第三季第2期報名中
- 6小時狂歡,誰是2016年TI杯全國大學生物聯(lián)網(wǎng)設(shè)計競賽最高人氣王,你說了算!
- 【搶樓贏禮】聊聊我用過的MOSFET!
- 下載有禮:2017年泰克亞太專家大講堂第一期:大數(shù)據(jù)與云存儲環(huán)境下的高速總線技術(shù)演進
- 了解泰克新品P7700探頭,答題贏好禮!