資源簡介
本人親自寫的I2C讀寫24C256和24C02程序,程序直接可以,根據硬件修改下即可。

代碼片段和文件信息
#include?//包含文件
#include?
#include?
#include
#include“i2c.h“
#define?Byte?unsigned?char//宏定義
#define?uint?unsigned?int
#define?uchar?unsigned?char
#define?device_16bit_Waddress?0xa0//器件寫數據地址24c256
#define?device_16bit_Raddress?0xa1//器件讀數據地址24c256
#define?device_8bit_Waddress?0xa2???????//定義PCF8563的寫數據地址
#define?device_8bit_Raddress?0xa3???????//定義PCF8563的讀數據地址
sbit?SCL=?P3^5;
sbit?SDA?=P3^4;
/*sbit?SCL=?P1^5;
sbit?SDA?=P1^6;*/
/*延時子程序大概10ms左右*/
void?delay()
{
????uint?ij;
????for(i=0;i<10;i++)
????{
????????for(j=0;j<1000;j++)
????????{
????????????;
????????}
????}
}
/*開始I2C數據發送或接收*/
void?Start_I2C()//在時鐘線為高,數據線從高電平跳到低電平時,開始傳送
{?
???SDA=1;???????????//數據先
???_nop_();?????????//延時一段時間
???_nop_();
???SCL=1;???????????//時鐘線為高等數據線下降才開始
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???SDA=0;???????????//數據線下降拉啟動了
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???SCL=0;???????????
}
/*結束數據傳送*/
void?Stop_I2C()
{??
???SDA=0;????????????//時鐘線為高時數據線上升沿為結束信號
???_nop_();
???_nop_();???
???SCL=1;
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???SDA=1;
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???SCL=0;
}
/*發送字節子程序入口參數為要發送的數據無返回變量分8位進行發送*/
void?Sent_Byte(Byte?Data)??????
{
????Byte?BitCount;???????????????????????//定義發送的位數
????for(BitCount=0;BitCount<8;BitCount++)
???????{
?????????_nop_();
?????????_nop_();
?????????if((Data< ???????????else?SDA=0;
???????????_nop_();
???_nop_();
???????????SCL=1;??????????????//置位SCL通知從器件開始接收數據SCL上升沿發數據
???????????_nop_();????????????//SCL為1數據線電平不能變
???????????_nop_();
???????????_nop_();
???????????_nop_();
???????????SCL=0;???????????//鉗住總線,等下次接收
?}
???
}
/*應答子程序無入口參數返回值是應答位*/
bit?Ack_Check()??
{
????SDA=1;??????//先置時鐘線為高第九位數據過來會強行把數據線拉低
????_nop_();
????_nop_();
????SCL=1;
????_nop_();
????_nop_();
????_nop_();
????_nop_();
????F0=SDA;????//將數據線上的該位保存到F0中
????SCL=0;
????if(F0==1)?
return?1;//沒有應答返回1否則返回0
????else?return?0;
}
/*接收字節子函數,先接收高位再接收低位無入口參數,返回值是一個無符號型的一個8位的數*/
Byte?Rec_Byte()
{
??Byte?BitCount?RecData=0;
?????????????????????????????????
??for(BitCount=0;BitCount<8;BitCount++)
??{
?????SDA=1;???????????????????????????????//數據線先給1的話如果從器件發0給主器件
????_nop_();??????????????????????????????//SDA會拉低那主器件接收到的為0否則不拉低接收到的為1
????_nop_();??????????????????????????????//這相當釋放數據總線一樣
?????SCL=1;????????????????????????????????
?????_nop_();
?????_nop_();
?????_nop_();
?????_nop_();
?????_nop_();
?????F0=SDA;??????????//用F0來保存當前數據線上的值?????????????????????
?????SCL=0;
?????
?????if(F0)?
?????{
??????RecData=RecData<<1;
??????RecData=RecData|0x01;
?????}
??
?????else?RecData=RecData<<1;
??}
??return(RecData);
}
/*發送數據子函數,入口參數是16位的器件地址和要發送的數據,無返回值*/
Sent_Data16(uint?addressByte?Data)
{
????bit?ack_temp;????//響應寄存位
uchar?addr_Haddr_L;
addr_H=(uchar)(addre
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????5471??2009-09-07?09:13??I2C讀寫24c02和24c56\DebugRel\i2c
?????文件???????3074??2009-09-07?09:13??I2C讀寫24c02和24c56\DebugRel\i2c.hex
?????文件?????????81??2009-09-07?09:13??I2C讀寫24c02和24c56\DebugRel\i2c.lnp
?????文件??????22862??2009-09-07?09:13??I2C讀寫24c02和24c56\DebugRel\i2c.M51
?????文件???????5967??2009-09-07?09:13??I2C讀寫24c02和24c56\DebugRel\i2c.obj
?????文件???????2432??2009-09-07?09:13??I2C讀寫24c02和24c56\DebugRel\Serial.obj
?????文件???????7750??2009-09-07?09:13??I2C讀寫24c02和24c56\i2c.c
?????文件????????373??2009-09-04?11:22??I2C讀寫24c02和24c56\i2c.h
?????文件????????821??2009-09-07?09:23??I2C讀寫24c02和24c56\i2c.muo
?????文件???????2428??2009-09-07?09:23??I2C讀寫24c02和24c56\i2c.xmp
?????文件???????2096??2009-09-04?11:27??I2C讀寫24c02和24c56\Serial.c
?????文件????????136??2009-09-04?11:06??I2C讀寫24c02和24c56\Serial.h
?????目錄??????????0??2009-09-07?09:13??I2C讀寫24c02和24c56\DebugRel
?????目錄??????????0??2009-09-04?11:14??I2C讀寫24c02和24c56
-----------?---------??----------?-----??----
????????????????53491????????????????????14
- 上一篇:基于壓縮感知的MIMO信道估計算法
- 下一篇:淘淘商城項目有源碼
評論
共有 條評論