IIC總線讀寫程序


//==========================頭文件加載===============================
#include <reg52.h>      //加載52系列單片機頭文件
//===========================端口聲明================================
sbit CLK=P3^6;   //74hc574時鍾信號線
sbit G=P2^4;   //74hc574使能

sbit IIC_SDA=P2^6;        //聲明IIC總線的數據線接在單片機的P2.5端口。
sbit IIC_SCL=P2^5;        //聲明IIC總線的時鍾線接在單片機的P2.7端口。


unsigned char tabl[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0BF,0x8C};
//0,1,2,3,4,5,6,7,8,9,-,P

//===========================函數聲明================================
void display(unsigned char aa);

void delay(unsigned int t);
void delay_IIC(void);
void IIC_Init(void);
void IIC_start(void);
void IIC_stop(void);
bit IIC_Tack(void);
void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data);
unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr);
void IIC_write_byte(unsigned char Data);
unsigned char IIC_read_byte(void);
//============================主函數=================================
void main()                       //主函數
{
 unsigned char Data=2,addr=0x01;
    //---------------------------系統初始化--------------------------
    
 IIC_Init();//初始化IIC總線。
    //P1=0x7f;//LED8先亮。
    while(1)                      //死循環
    {
        IIC_single_byte_write(0xa0,0x02,Data);//保存LED的狀態
        delay(50000);//延時約0.5S
        Data=IIC_single_byte_read(0xa0,0x02);//讀出LED的狀態
  if(Data<10)
   Data++;
  else
   Data=0;
  display(Data);
  delay(50000);//延時約0.5S
    }
}
//==========================功能子函數===============================
void delay(unsigned int t)
{//延時函數
    while(t){t--;};                    //延時循環計數
}
//-------------------------------------------------------------------
void delay_IIC(void)    
{//IIC總線限速延時函數。
//該函數是空函數,延時4個機器周期。
;;
}
//-------------------------------------------------------------------
void IIC_Init(void)
{//IIC總線初始化函數
    IIC_SDA=1;//釋放IIC總線的數據線。
    IIC_SCL=1;//釋放IIC總線的時鍾線。
}
//-------------------------------------------------------------------
void IIC_start(void)
{//IIC總線產生起始信號函數  
    IIC_SDA=1;//拉高數據線
     IIC_SCL=1;//拉高時鍾線
     delay_IIC();
     IIC_SDA=0;//在時鍾線為高電平時,拉低數據線,產生起始信號。
     delay_IIC();
    IIC_SCL=0;//拉低時鍾線
}
//-------------------------------------------------------------------
void IIC_stop(void) 
{//IIC總線產生停止信號函數
    IIC_SDA=0;//拉低數據線
    delay_IIC();
    IIC_SCL=1;//拉高時鍾線。
    delay_IIC();
    IIC_SDA=1;//時鍾時線為高電平時,拉高數據線,產生停止信號。
    delay_IIC();
}
//-------------------------------------------------------------------
bit IIC_Tack(void)
{//接收應答信號函數
    bit ack;//定義一個位變量,來暫存應答狀態。
    IIC_SDA=1;//釋放數據總線,准備接收應答信號。
    delay_IIC();
    IIC_SCL=1;//拉高時鍾線。
    delay_IIC();
    ack=IIC_SDA;//讀取應答信號的狀態。
    delay_IIC();
    IIC_SCL=0;//拉低時鍾線。
    delay_IIC();
    return ack;//返回應答信號的狀態,0表示應答,1表示非應答。
}
//-------------------------------------------------------------------
void IIC_write_byte(unsigned char Data)
{//向IIC總線寫入一個字節的數據函數 
    unsigned char i;
     for(i=0;i<8;i++)//有8位數據
    {
        IIC_SDA=Data&0x80;//寫最高位的數據
          delay_IIC();
          IIC_SCL=1; //拉高時鍾線,將數寫入到設備中。
        delay_IIC();
        IIC_SCL=0;//拉低時鍾線,允許改變數據線的狀態
        delay_IIC();
        Data=Data<<1;//數據左移一位,把次高位放在最高位,為寫入次高位做准備
    }
}
//-------------------------------------------------------------------
unsigned char IIC_read_byte()
{//從IIC總線讀取一個字節的數據函數
    unsigned char i;
    unsigned char Data;       //定義一個緩沖寄存器。
    for(i=0;i<8;i++)//有8位數據
    {
        IIC_SCL=1;//拉高時鍾線,為讀取下一位數據做准備。
        delay_IIC();
        Data=Data<<1;//將緩沖字節的數據左移一位,准備讀取數據。
        delay_IIC();
        
        if(IIC_SDA)//如果數據線為高平電平。
            Data=Data|0x1;//則給緩沖字節的最低位寫1。
        IIC_SCL=0;//拉低時鍾線,為讀取下一位數據做准備。
        delay_IIC();
    }
    return Data;//返回讀取的一個字節數據。
}
//-------------------------------------------------------------------
void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data)
{//向任意地址寫入一個字節數據函數
    IIC_start();//產生起始信號
    IIC_write_byte(Daddr);//寫入設備地址(寫)
    IIC_Tack();//等待設備的應答
    IIC_write_byte(Waddr);//寫入要操作的單元地址。
    IIC_Tack();//等待設備的應答。
    IIC_write_byte(Data);//寫入數據。
    IIC_Tack();//等待設備的應答。
    IIC_stop();//產生停止符號。
}
//-------------------------------------------------------------------
unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr)
{//從任意地址讀取一個字節數據函數
    unsigned char Data;//定義一個緩沖寄存器。

    IIC_start();//產生起始信號
    IIC_write_byte(Daddr);//寫入設備地址(寫)
    IIC_Tack();//等待設備的應答
    IIC_write_byte(Waddr);//寫入要操作的單元地址。
    IIC_Tack();//等待設備的應答。
    
    IIC_start();//產生起始信號
    IIC_write_byte(Daddr+1);//寫入設備地址(讀)。
    IIC_Tack();//等待設備的應答。 
    Data=IIC_read_byte();//寫入數據。
    IIC_stop();//產生停止符號。
    //-------------------返回讀取的數據--------------------
    return Data;//返回讀取的一個字節數據。
}
//-------------------------------------------------------------------
void display(unsigned char aa){ 
 P2=0xf0;                             
 G=0;                                   //74hc574使能
 CLK=0;                                  //n產生上升沿,數據寫入74hc574
 P0=tabl[aa];       //n給數碼
 CLK=1;                                   
}
//===================================================================


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM