久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5595|回復: 3
打印 上一主題 下一主題
收起左側

[轉帖]8051.通用的I2C總線程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:43499 發表于 2012-8-2 21:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

對于死太慘"1T"的單片機需要加快延時。建議直接在后面加一個0,I2C就沒有問題了。

這個程序并不是我原創。是ourDEV中某個24C串口操作里面剝離的。感覺蠻好用。不過稍微改變語法,讓它在SDCC中通過。

這個函數支持TEA5767/24C系列串行儲存器的操作。理論是只要是I2C的器件都沒有問題。

該程序在89C52/SDCC v3.1.0中通過,上代碼。

 

#ifndef __I2C_H__
#define __I2C_H__

//---------------------------------------------------------------
#define I2C_SCL_0     I2C_SCL = 0
#define I2C_SCL_1     I2C_SCL = 1
#define I2C_SDA_0     I2C_SDA = 0
#define I2C_SDA_1     I2C_SDA = 1
//--------------------管腳定義-----------------------------------
#define I2C_SCL  P1_1             // I2C總線的時鐘信號
#define I2C_SDA  P1_2             // I2C總線的數據信號
//---------------------------------------------------------------                                   



#define DELAY_nT    1   // 延時1個機器周期(2+2*DELAY_nT),
                                // (延時時間大于5us,因此機器個數
                                // 根據晶振頻率而定)
void Delay_I2C()
{
    unsigned char t=DELAY_nT;
    while(--t);
}
//***********************************************************************
// 函數名稱:I2C_Start()
// 功    能:啟動I2C總線
// 入口參數:無
// 出口參數:無
//***********************************************************************
void I2C_Start(void)
{
    
    I2C_SDA_1;
    I2C_SCL_1; 
    Delay_I2C(); // 大于5us
    I2C_SDA_0; 
    Delay_I2C(); // 大于5us
    I2C_SCL_0;
    Delay_I2C(); // 大于5us
}

//***********************************************************************
// 函數名稱:I2C_Stop()
// 功    能:終止I2C總線
// 入口參數:無
// 出口參數:無
//***********************************************************************
void I2C_Stop(void)
{
    
    /*I2C_SDA_0;
    I2C_SCL_1;
    t = DELAY_nT;    while(--t);        // 大于4us
    I2C_SDA_1;
    t = DELAY_nT;    while(--t);        // 大于5us
    I2C_SCL_0;
    t = DELAY_nT;    while(--t);         // 大于5us
    I2C_SCL_1;*/
    I2C_SCL_0;
    I2C_SDA_0;
    Delay_I2C(); // 大于5us
    I2C_SCL_1;
    Delay_I2C(); // 大于5us
    I2C_SDA_1;
    Delay_I2C(); // 大于5us
}

//***********************************************************************
// 函數名稱:I2C_Send_Bit_0()
// 功    能:發送比特0
// 入口參數:無
// 出口參數:無
//***********************************************************************
void I2C_Send_Bit_0(void)
{
    
    I2C_SDA_0;
    I2C_SCL_1;
    Delay_I2C(); // 大于5us        // tL = 6us 
    I2C_SCL_0;
//    t = DELAY_nT;    while(--t);         // 大于5us
}

//***********************************************************************
// 函數名稱:I2C_Send_Bit_1()
// 功    能:發送比特1
// 入口參數:無
// 出口參數:無
//***********************************************************************
void I2C_Send_Bit_1(void)
{
    
    I2C_SDA_1;
    I2C_SCL_1;
    Delay_I2C(); // 大于5us
    I2C_SCL_0;
//    Delay_I2C(); // 大于5us
}

//***********************************************************************
// 函數名稱:I2C_Check_Ack()
// 功    能:發送完一個字節后檢驗設備的應答信號
// 入口參數:無
// 出口參數:返回值為True,成功
//           返回值為False,失敗
//***********************************************************************
unsigned char I2C_Check_Ack(void)
{
    
    I2C_SDA_1;
    I2C_SCL_1;
    Delay_I2C(); // 大于5us
    F0 = I2C_SDA;
    Delay_I2C(); // 大于5us
    I2C_SCL_0;
    Delay_I2C(); // 大于5us
    if( F0 == 1 )  return FALSE;
    else                   return TRUE;
}

//***********************************************************************
// 函數名稱:I2C_Write8Bit()
// 功    能:向I2C總線寫入8bit數據
// 入口參數:I2C_data     將要寫入I2C總線的8bit數據 
// 出口參數:無
//***********************************************************************
void I2C_Write8Bit(unsigned char I2C_data)
{
    unsigned char i;
    
    for( i=0;i<8;i++ )//秒懂。好猥瑣的寫法,致遠吐糟ing
    {
        if( (I2C_data<<i)&0x80 )
            I2C_Send_Bit_1();
          else
            I2C_Send_Bit_0();
    }
}

//***********************************************************************
// 函數名稱:I2C_Read8Bit()
// 功    能:從I2C總線接收8bit數據
// 入口參數:無
// 出口參數:返回值為從I2C總線上接收到的8bit數據
//***********************************************************************
unsigned char I2C_Read8Bit(void)
{
    unsigned char t,I2C_data = 0,i;
    
    for( i = 0; i < 8; i++ )
    {    
        I2C_data = I2C_data << 1;
        I2C_SDA_1;    
        I2C_SCL_1;    
        t = DELAY_nT;    while(--t);
        F0 = I2C_SDA;
        t = DELAY_nT;    while(--t);
        I2C_SCL_0;
        if( F0 == 1 )    
            I2C_data = I2C_data | 0x01;
    }
    return I2C_data;
}

#endif



萬致遠原創,轉載注明出處:http://www.rwzy.co.cc
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:70330 發表于 2015-1-30 14:04 | 只看該作者
請問:建議直接在后面加一個0,是什么意思?
回復

使用道具 舉報

板凳
ID:70330 發表于 2015-1-30 14:04 | 只看該作者
這是12T的機器的嗎?
回復

使用道具 舉報

地板
ID:84375 發表于 2015-6-30 17:00 | 只看該作者
很清晰。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久成人18免费网站 | 第四色播日韩第一页 | 综合精品久久久 | 黄视频免费在线 | 欧美精品免费观看二区 | 天堂资源 | 国产精品久久久久影院色老大 | 欧美888| 国产精品7777777 | a级毛片国产 | 精品1区| 中文字幕第一页在线 | 精品国产乱码久久久久久a丨 | 亚洲一区不卡 | 91久久| 精品入口麻豆88视频 | 亚洲第一天堂无码专区 | 国产日韩久久久久69影院 | 91社区在线观看高清 | 黄色骚片| 91美女在线观看 | 日韩午夜在线播放 | 亚洲精品电影在线 | 亚洲自拍偷拍视频 | 一区二区三区四区在线视频 | 国产精品一区二区在线观看 | av永久免费| 日韩精品一区二区三区 | 日韩电影中文字幕 | 亚洲天堂av一区 | 久久亚洲春色中文字幕久久久 | 午夜视频网站 | www.玖玖玖 | 欧美色成人 | 国产极品车模吞精高潮呻吟 | 老妇激情毛片免费 | 国产成人免费视频网站高清观看视频 | 亚洲激情av| 国产成人免费在线 | 麻豆av免费观看 | 欧美激情久久久 |