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