日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年01月22日(星期三)

正在發(fā)生

2021年01月22日 | MSP430G2553軟件實現(xiàn)IIC

發(fā)布者:幸福如意 來源: eefocus關(guān)鍵字:MSP430G2553  軟件  IIC 手機看文章 掃描二維碼
隨時隨地手機看文章

程序框圖

單片機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);


}


關(guān)鍵字:MSP430G2553  軟件  IIC 引用地址:MSP430G2553軟件實現(xiàn)IIC

上一篇:#pragma vector語句在IAR for MSP430中斷程序編程過程中的使用
下一篇:基于MSP430與RC522的RFID簡單應(yīng)用(1)

推薦閱讀

  人到中年,談愛已老,離死還早,上有老下有小,壓力挑戰(zhàn)不少,而企業(yè)亦是如此。下面就隨網(wǎng)絡(luò)通信小編一起來了解一下相關(guān)內(nèi)容吧?! ?月18日,“而立之年”的華為召開市場大會頒獎典禮,宣布2018年銷售收入目標為1022億美元,按當前匯率相當于6558億人民幣,較之2017年的約6000億人民幣增長不到10%。這個增長預(yù)期相對之前動輒30%以上的增速顯然偏低,...
家用智能音箱的語音助手技術(shù)如亞馬遜Alex、Siri和谷歌助手等,其未來更大的市場應(yīng)用前景可能在汽車行業(yè)。據(jù)語音科技出版物Voicebot.ai的一份最新調(diào)研報告稱,美國有770萬成年司機駕駛汽車時每月至少使用一次使用車載語音助手,而家用智能音箱的用戶相比僅有457萬。據(jù)這份報告,造成此類情況的原因有幾個:美國擁有汽車的人數(shù)遠比擁有智能音箱的用戶數(shù)多。 ...
光時域反射儀是通過對測量曲線的分析,了解光纖的均勻性、缺陷、斷裂、接頭耦合等若干性能的儀器。它根據(jù)光的后向散射與菲涅耳反向原理制作,利用光在光纖中傳播時產(chǎn)生的后向散射光來獲取衰減的信息。光時域反射儀會打入一連串的光突波進入光纖來檢驗。檢驗的方式是由打入突波的同一側(cè)接收光訊號,因為打入的訊號遇到不同折射率的介質(zhì)會散射及反射回來。反...
十年前,電動汽車開始出現(xiàn)在消費者的視野中,隨著全球變暖和環(huán)境的惡化,相關(guān)部門對汽車排放的檢查和規(guī)定越發(fā)嚴格,小排量甚至零排放成為新的宣稱口號,一些車企加入了制造電動汽車的陣營中,但在10年前,電池容量密度非常低,續(xù)航里程完全無法滿足長距離出行的需求,一般電動車的續(xù)航在100公里以內(nèi),而像日產(chǎn)聆風等熱銷電動車的續(xù)航也僅僅為175公里,于是...

史海拾趣

問答坊 | AI 解惑

SIM卡座PCB封裝(抽屜式和推拉式)

SIM卡座PCB封裝(抽屜式和推拉式)…

查看全部問答∨

盧二都

嘿嘿,麻煩大家給我提供74HC14施密特整形電路的一些資料。謝謝…

查看全部問答∨

關(guān)于LED電源驅(qū)動芯片

大家懂電源的朋友可以關(guān)心一下的,現(xiàn)最好的驅(qū)動電源使用哪種芯片,推薦一下!…

查看全部問答∨

NorFlash應(yīng)用問題(39VF1601型號)

1)NorFlash可供使用的地址空間應(yīng)該從0x0000開始吧。那么為什么在手冊中在說明ID讀取時,如下:manufacturer\'s ID   0000H(address)   00BFH(data) ; Device ID   0001H(address)  2782H(data) 。感到不 ...…

查看全部問答∨

我的6410裸奔和使用wince6.0哪個難度大?

我的系統(tǒng)主要是對來自camera接口的數(shù)據(jù)進行圖像處理,并通過USB OTG口(作為device使用)上傳給PC機。不需要運行其它進程。 硬件選用s3c6410。經(jīng)過在s3c2442的PDA上跑圖像處理測試代碼,時間比較緊張,主要瓶頸在存儲器訪問上。因此我們打算給6410 ...…

查看全部問答∨

關(guān)于函數(shù)的調(diào)用

我由CDialog類派生了一個新類DlgMenu 然后定義了一個DlgMenu類型變量Dlg1; 寫了一個函數(shù):void Fun(CDialog myDlg) 當我這樣調(diào)用這個函數(shù)時Fun(Dlg1),為什么不行? 程序報錯:cannot convert parameter 1 from \'class DlgMenu ‘to \'class C ...…

查看全部問答∨

ADC0809的C程序,不知道哪錯了。大俠們指點迷津啊

void main(void) { unsigned char xdata* data dptr;   unsigned char i,VOUT=0;   float Y,Y1,Y2,X;   while(1)         {          dptr=0x7ff8;  ...…

查看全部問答∨

LED照明設(shè)計過程中關(guān)鍵問題全析

要設(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能修改縮進嗎?

最近用IAR4.2開發(fā)ST,發(fā)現(xiàn)它默認的縮進只有兩個空格,像 if(a) { ? ?b; } 不知道能不能修改成默認有更多空格,比如四個,像 if(a) { ? ? ? ? b; } 求教!…

查看全部問答∨

430 能進行指數(shù)運算嗎?

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ā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved