#include#define uchar unsigned charsbit sda=P2^0;sbit scl=P2^1;//用單片機的兩個I/O口模擬I2C接口uchar a;*void delay()//簡單延時函數(shù){ ;; }*void start() //開始信號 SCL在高電平期間,SDA一個下降沿則表示啟動信號{ sda=1; //釋放SDA總線delay();scl=1;delay();sda=0;delay();}*void stop() //停止 SCL在高電平期間,SDA一個上升沿則表示停止信號{sda=0;delay();scl=1;delay();sda=1;delay();}*void respons() //應(yīng)答 SCL在高電平期間,SDA被從設(shè)備拉為低電平表示應(yīng)答{uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;scl=0;delay();}*void init()//總線初始化 將總線都拉高一釋放總線 發(fā)送啟動信號前,要先初始化總線。即總有檢測到總線空閑才開始發(fā)送啟動信號{sda=1;delay();scl=1;delay();}*void write_byte(uchar date) //寫一個字節(jié){uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;//拉低SCL,因為只有在時鐘信號為低電平期間按數(shù)據(jù)線上的高低電平狀態(tài)才允許變化;并在此時和上一個循環(huán)的scl=1一起形成一個上升沿delay();sda=CY;delay();scl=1;//拉高SCL,此時SDA上的數(shù)據(jù)穩(wěn)定delay();}scl=0;//拉低SCL,為下次數(shù)據(jù)傳輸做好準(zhǔn)備delay();sda=1;//釋放SDA總線,接下來由從設(shè)備控制,比如從設(shè)備接收完數(shù)據(jù)后,在SCL為高時,拉低SDA作為應(yīng)答信號delay();}*uchar read_byte()//讀一個字節(jié){uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;//上升沿時,IIC設(shè)備將數(shù)據(jù)放在sda線上,并在高電平期間數(shù)據(jù)已經(jīng)穩(wěn)定,可以接收啦delay(); k=(k<<1)|sda;scl=0;//拉低SCL,使發(fā)送端可以把數(shù)據(jù)放在SDA上delay(); }return k;}*void write_add(uchar address,uchar date)//任意地址寫一個字節(jié){start();//啟動write_byte(0xa0);//發(fā)送從設(shè)備地址respons();//等待從設(shè)備的響應(yīng)write_byte(address);//發(fā)出芯片內(nèi)地址respons();//等待從設(shè)備的響應(yīng)write_byte(date);//發(fā)送數(shù)據(jù)respons();//等待從設(shè)備的響應(yīng)stop();//停止}*uchar read_add(uchar address)//讀取一個自己{uchar date;start();//啟動write_byte(0xa0);//發(fā)送發(fā)送從設(shè)備地址 寫操作respons();//等待從設(shè)備的響應(yīng)write_byte(address);//發(fā)送芯片內(nèi)地址respons();//等待從設(shè)備的響應(yīng)start();//啟動write_byte(0xa1);//發(fā)送發(fā)送從設(shè)備地址 讀操作respons();//等待從設(shè)備的響應(yīng)date=read_byte();//獲取數(shù)據(jù)stop();//停止return date;//返回數(shù)據(jù)}
評論