資料介紹
AT24C01~AT24C256讀寫通用程序(只做了少許改動),附件里面有關于AT24系列讀寫資料!
/* 以下為AT24C01~AT24C256的讀寫程序,各人可根據自己的需要應用。
在buf1中填入需要寫入的內容,buf2的大小可根據需要定義。
addr可根據使用的芯片選擇,可從任何位置讀寫,只要在該芯片的范圍內。
enumer=ATxxx,根據使用的芯片賦值。各函數中的形式參數不需改變。
本程序只要在調用的程序中定義實際參數即可,下述各子程序不必改動。*/
#include
#include
#define??ERROR 10? ???//允許ERROR的最大次數? ?? ?
sbit? ???SDA=P3^0;
sbit? ???SCL=P3^1;
enum??eepromtype {AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256};/*器件的型號*/
enum??eepromtype enumer;? ?//定義一個枚舉變量
unsigned char code buf1 []={1,3,5,7,9,10,11,12,13,15}; /* 發送緩沖區 */
unsigned char buf2 [10]; /* 接收緩沖區 */
/* 一個通用的24C01-24C256共9種EEPROM的字節讀寫操作程序,
此程序有五個入口條件,分別為讀寫數據緩沖區指針,
進行讀寫的字節數,EEPROM首址,EEPROM控制字節,
以及EEPROM類型。此程序結構性良好,具有極好的容錯性,程序機器碼也不多:
DataBuff為讀寫數據輸入/輸出緩沖區的首址
Length 為要讀寫數據的字節數量
Addr 為EEPROM的片內地址 AT24256為0~32767
Control 為EEPROM的控制字節,具體形式為(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
表示讀操作,R/W=0為寫操作,A2,A1,A0為EEPROM的頁選或片選地址;
enumer為枚舉變量,需為AT2401至AT24256中的一種,分別對應AT24C01至AT24C256;
函數返回值為一個位變量,若返回1表示此次操作失效,0表示操作成功;
ERROR為允許最大次數,若出現ERRORCOUNT次操作失效后,則函數中止操作,并返回1
SDA和SCL由用戶自定義,這里暫定義為P3^0和P3^1; */
/*對于1K位,2K位,4K位,8K位,16K位芯片采用一個8位長的字節地址碼,對于32K位以上
的采用2個8位長的字節地址碼直接尋址,而4K位,8K位,16K位配合頁面地址來尋址*/
/* -----??AT24C01~AT24C256 的讀寫程序 ------ */
bit? ?RW24xx(unsigned char *DataBuff,unsigned char Length,unsigned int Addr,
? ?? ?? ?? ?? ?? ?? ?unsigned char Control,enum eepromtype enumer)
{ void Delay(unsigned char DelayCount);??/*? ?延時? ?*/
??void Start(void);??/*? ?啟動總線? ?*/
??void Stop(void);? ?/*? ?停止IIC總線? ?*/
??bit??RecAck(void); /*? ?檢查應答位? ?*/
??void NoAck(void);??/*? ?不對IIC總線產生應答? ?*/
??void Ack(void);? ? /*? ?對IIC總線產生應答? ?*/
??unsigned char Receive(void); /*? ?從IIC總線上讀數據子程序??*/
??void Send(unsigned char sendbyte); /*? ?向IIC總線寫數據? ?*/
??unsigned char data j,i=ERROR;
??bit errorflag=1;??/*? ?出錯標志? ?*/
??while(i--)
??{ Start();??/*? ?啟動總線? ?*/
? ? Send(Control & 0xfe); /*? ?向IIC總線寫數據,器件地址 */
? ? if(RecAck()) continue; /*? ?如寫不正確結束本次循環? ?*/
? ? if(enumer > AT2416)
? ? { Send((unsigned char)(Addr >> 8));//把整型數據轉換為字符型數據:棄高取低,只取低8位.如果容量大于32K位,使用16位地址尋址,寫入高八位地址
? ?? ?if(RecAck())??continue;
? ? }
? ? Send((unsigned char)Addr); /*? ?向IIC總線寫數據? ?*/
? ? if(RecAck())??continue; /*? ?如寫正確結束本次循環? ?*/
? ? if(!(Control & 0x01))? ?//判斷是讀器件還是寫器件
? ? { j=Length;
? ?? ?errorflag=0;? ?? ?? ?/* 清錯誤特征位 */
? ?? ?while(j--)
? ?? ?{ Send(*DataBuff++); /*? ?向IIC總線寫數據? ?*/
? ?? ???if(!RecAck()) continue; /*? ?如寫正確結束本次循環? ?*/
? ?? ???errorflag=1;
? ?? ???break;
? ?? ?}
? ?? ?if(errorflag==1) continue;
? ?? ?break;
? ? }
? ? else
? ? { Start();??/*? ?啟動總線? ?*/
? ?? ?Send(Control); /*? ?向IIC總線寫數據? ?*/
? ?? ?if(RecAck()) continue;//器件沒應答結束本次本層循環
? ?? ?while(--Length)??/*? ?字節長為0結束? ?*/
? ?? ?{ *DataBuff ++= Receive();
? ?? ???Ack();? ?/*? ?對IIC總線產生應答? ?*/
? ?? ?}
? ?? ?*DataBuff=Receive(); /* 讀最后一個字節 */
? ?? ?NoAck();??/*? ?不對IIC總線產生應答? ?*/
? ?? ?errorflag=0;
? ?? ?break;
? ? }
??}
??Stop();??/*? ?停止IIC總線? ?*/
??if(!(Control & 0x01))
??{ Delay(255); Delay(255); Delay(255); Delay(255);
??}
??return(errorflag);
}
/* * * * * 以下是對IIC總線的操作子程序 * * * * */
/* * * * * * 啟動總線 * * * * */
void Start(void)
{ SCL=0; /* SCL處于高電平時,SDA從高電平轉向低電平表示 */
??SDA=1; /* 一個"開始"狀態,該狀態必須在其他命令之前執行 */
??SCL=1;
??_nop_(); _nop_(); _nop_();
??SDA=0;
??_nop_(); _nop_(); _nop_(); _nop_();
??SCL=0;
??SDA=1;? ???
}
/* * * * * 停止IIC總線 * * * * */
void Stop(void)
{ SCL=0; /*SCL處于高電平時,SDA從低電平轉向高電平 */
??SDA=0; /*表示一個"停止"狀態,該狀態終止所有通訊 */
??SCL=1;
??_nop_(); _nop_(); _nop_(); /* 空操作 */
??SDA=1;
??_nop_(); _nop_(); _nop_();
??SCL=0;
}
/* * * * * 檢查應答位 * * * * */
bit RecAck(void)
{ SCL=0;
??SDA=1;
??SCL=1;
??_nop_(); _nop_(); _nop_(); _nop_();
??CY=SDA;? ???/* 因為返回值總是放在CY中的 */
??SCL=0;
??return(CY);
}
/* * * * *對IIC總線產生應答 * * * * */
void Ack(void)
{ SDA=0; /* EEPROM通過在收到每個地址或數據之后, */
??SCL=1; /* 置SDA低電平的方式確認表示收到讀SDA口狀態 */
??_nop_(); _nop_(); _nop_(); _nop_();
??SCL=0;
??_nop_();
??SDA=1;
}
/* * * * * * * * * 不對IIC總線產生應答 * * * * */
void NoAck(void)
{ SDA=1;
??SCL=1;
??_nop_(); _nop_(); _nop_(); _nop_();
??SCL=0;
}
/* * * * * * * * * 向IIC總線寫數據 * * * * */
void Send(unsigned char sendbyte)
{ unsigned char data j=8;
??for(;j>0;j--)
??{ SCL=0;
? ? sendbyte <<= 1; /* 使CY=sendbyte^7; */
? ? SDA=CY; /* CY 進位標志位 */
? ? SCL=1;
??}
??SCL=0;
}
/* * * * * * * * * 從IIC總線上讀數據子程序 * * * * */
unsigned char Receive(void)
{ register receivebyte,i=8;
??SCL=0;
??while(i--)
??{ SCL=1;
? ? receivebyte = (receivebyte <<1 ) | SDA;
? ? SCL=0;
??}
??return(receivebyte);
}
/* * * * * * * * 一個簡單延時程序 * * * * * * * * * * * * */
void Delay(unsigned char DelayCount)
{ while(DelayCount--);
}
/* -----??AT24C01~AT24C256 的讀寫程序 ------ */
void main()
{ unsigned char Control,*p1,*p2;
??unsigned char Length;
??unsigned int addr ; /* 24Cxx片內地址 */
??p1=buf1;p2=buf2;
??addr=0; /* 片內地址 AT24C256為0~32767 */
??Length=8; /* 讀寫長度 */
??enumer=AT24256; /* 讀寫AT24C256 */
??Control=0xa0; /* 寫操作 */
??RW24xx(p1,Length,addr,Control,enumer); /* 寫 */
??Control=0xa1; /* 讀操作 */
??RW24xx(p2,Length,addr,Control,enumer); /* 讀 */
}
/* 以下為AT24C01~AT24C256的讀寫程序,各人可根據自己的需要應用。
在buf1中填入需要寫入的內容,buf2的大小可根據需要定義。
addr可根據使用的芯片選擇,可從任何位置讀寫,只要在該芯片的范圍內。
enumer=ATxxx,根據使用的芯片賦值。各函數中的形式參數不需改變。
本程序只要在調用的程序中定義實際參數即可,下述各子程序不必改動。*/
#include
#include
#define??ERROR 10? ???//允許ERROR的最大次數? ?? ?
sbit? ???SDA=P3^0;
sbit? ???SCL=P3^1;
enum??eepromtype {AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256};/*器件的型號*/
enum??eepromtype enumer;? ?//定義一個枚舉變量
unsigned char code buf1 []={1,3,5,7,9,10,11,12,13,15}; /* 發送緩沖區 */
unsigned char buf2 [10]; /* 接收緩沖區 */
/* 一個通用的24C01-24C256共9種EEPROM的字節讀寫操作程序,
此程序有五個入口條件,分別為讀寫數據緩沖區指針,
進行讀寫的字節數,EEPROM首址,EEPROM控制字節,
以及EEPROM類型。此程序結構性良好,具有極好的容錯性,程序機器碼也不多:
DataBuff為讀寫數據輸入/輸出緩沖區的首址
Length 為要讀寫數據的字節數量
Addr 為EEPROM的片內地址 AT24256為0~32767
Control 為EEPROM的控制字節,具體形式為(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
表示讀操作,R/W=0為寫操作,A2,A1,A0為EEPROM的頁選或片選地址;
enumer為枚舉變量,需為AT2401至AT24256中的一種,分別對應AT24C01至AT24C256;
函數返回值為一個位變量,若返回1表示此次操作失效,0表示操作成功;
ERROR為允許最大次數,若出現ERRORCOUNT次操作失效后,則函數中止操作,并返回1
SDA和SCL由用戶自定義,這里暫定義為P3^0和P3^1; */
/*對于1K位,2K位,4K位,8K位,16K位芯片采用一個8位長的字節地址碼,對于32K位以上
的采用2個8位長的字節地址碼直接尋址,而4K位,8K位,16K位配合頁面地址來尋址*/
/* -----??AT24C01~AT24C256 的讀寫程序 ------ */
bit? ?RW24xx(unsigned char *DataBuff,unsigned char Length,unsigned int Addr,
? ?? ?? ?? ?? ?? ?? ?unsigned char Control,enum eepromtype enumer)
{ void Delay(unsigned char DelayCount);??/*? ?延時? ?*/
??void Start(void);??/*? ?啟動總線? ?*/
??void Stop(void);? ?/*? ?停止IIC總線? ?*/
??bit??RecAck(void); /*? ?檢查應答位? ?*/
??void NoAck(void);??/*? ?不對IIC總線產生應答? ?*/
??void Ack(void);? ? /*? ?對IIC總線產生應答? ?*/
??unsigned char Receive(void); /*? ?從IIC總線上讀數據子程序??*/
??void Send(unsigned char sendbyte); /*? ?向IIC總線寫數據? ?*/
??unsigned char data j,i=ERROR;
??bit errorflag=1;??/*? ?出錯標志? ?*/
??while(i--)
??{ Start();??/*? ?啟動總線? ?*/
? ? Send(Control & 0xfe); /*? ?向IIC總線寫數據,器件地址 */
? ? if(RecAck()) continue; /*? ?如寫不正確結束本次循環? ?*/
? ? if(enumer > AT2416)
? ? { Send((unsigned char)(Addr >> 8));//把整型數據轉換為字符型數據:棄高取低,只取低8位.如果容量大于32K位,使用16位地址尋址,寫入高八位地址
? ?? ?if(RecAck())??continue;
? ? }
? ? Send((unsigned char)Addr); /*? ?向IIC總線寫數據? ?*/
? ? if(RecAck())??continue; /*? ?如寫正確結束本次循環? ?*/
? ? if(!(Control & 0x01))? ?//判斷是讀器件還是寫器件
? ? { j=Length;
? ?? ?errorflag=0;? ?? ?? ?/* 清錯誤特征位 */
? ?? ?while(j--)
? ?? ?{ Send(*DataBuff++); /*? ?向IIC總線寫數據? ?*/
? ?? ???if(!RecAck()) continue; /*? ?如寫正確結束本次循環? ?*/
? ?? ???errorflag=1;
? ?? ???break;
? ?? ?}
? ?? ?if(errorflag==1) continue;
? ?? ?break;
? ? }
? ? else
? ? { Start();??/*? ?啟動總線? ?*/
? ?? ?Send(Control); /*? ?向IIC總線寫數據? ?*/
? ?? ?if(RecAck()) continue;//器件沒應答結束本次本層循環
? ?? ?while(--Length)??/*? ?字節長為0結束? ?*/
? ?? ?{ *DataBuff ++= Receive();
? ?? ???Ack();? ?/*? ?對IIC總線產生應答? ?*/
? ?? ?}
? ?? ?*DataBuff=Receive(); /* 讀最后一個字節 */
? ?? ?NoAck();??/*? ?不對IIC總線產生應答? ?*/
? ?? ?errorflag=0;
? ?? ?break;
? ? }
??}
??Stop();??/*? ?停止IIC總線? ?*/
??if(!(Control & 0x01))
??{ Delay(255); Delay(255); Delay(255); Delay(255);
??}
??return(errorflag);
}
/* * * * * 以下是對IIC總線的操作子程序 * * * * */
/* * * * * * 啟動總線 * * * * */
void Start(void)
{ SCL=0; /* SCL處于高電平時,SDA從高電平轉向低電平表示 */
??SDA=1; /* 一個"開始"狀態,該狀態必須在其他命令之前執行 */
??SCL=1;
??_nop_(); _nop_(); _nop_();
??SDA=0;
??_nop_(); _nop_(); _nop_(); _nop_();
??SCL=0;
??SDA=1;? ???
}
/* * * * * 停止IIC總線 * * * * */
void Stop(void)
{ SCL=0; /*SCL處于高電平時,SDA從低電平轉向高電平 */
??SDA=0; /*表示一個"停止"狀態,該狀態終止所有通訊 */
??SCL=1;
??_nop_(); _nop_(); _nop_(); /* 空操作 */
??SDA=1;
??_nop_(); _nop_(); _nop_();
??SCL=0;
}
/* * * * * 檢查應答位 * * * * */
bit RecAck(void)
{ SCL=0;
??SDA=1;
??SCL=1;
??_nop_(); _nop_(); _nop_(); _nop_();
??CY=SDA;? ???/* 因為返回值總是放在CY中的 */
??SCL=0;
??return(CY);
}
/* * * * *對IIC總線產生應答 * * * * */
void Ack(void)
{ SDA=0; /* EEPROM通過在收到每個地址或數據之后, */
??SCL=1; /* 置SDA低電平的方式確認表示收到讀SDA口狀態 */
??_nop_(); _nop_(); _nop_(); _nop_();
??SCL=0;
??_nop_();
??SDA=1;
}
/* * * * * * * * * 不對IIC總線產生應答 * * * * */
void NoAck(void)
{ SDA=1;
??SCL=1;
??_nop_(); _nop_(); _nop_(); _nop_();
??SCL=0;
}
/* * * * * * * * * 向IIC總線寫數據 * * * * */
void Send(unsigned char sendbyte)
{ unsigned char data j=8;
??for(;j>0;j--)
??{ SCL=0;
? ? sendbyte <<= 1; /* 使CY=sendbyte^7; */
? ? SDA=CY; /* CY 進位標志位 */
? ? SCL=1;
??}
??SCL=0;
}
/* * * * * * * * * 從IIC總線上讀數據子程序 * * * * */
unsigned char Receive(void)
{ register receivebyte,i=8;
??SCL=0;
??while(i--)
??{ SCL=1;
? ? receivebyte = (receivebyte <<1 ) | SDA;
? ? SCL=0;
??}
??return(receivebyte);
}
/* * * * * * * * 一個簡單延時程序 * * * * * * * * * * * * */
void Delay(unsigned char DelayCount)
{ while(DelayCount--);
}
/* -----??AT24C01~AT24C256 的讀寫程序 ------ */
void main()
{ unsigned char Control,*p1,*p2;
??unsigned char Length;
??unsigned int addr ; /* 24Cxx片內地址 */
??p1=buf1;p2=buf2;
??addr=0; /* 片內地址 AT24C256為0~32767 */
??Length=8; /* 讀寫長度 */
??enumer=AT24256; /* 讀寫AT24C256 */
??Control=0xa0; /* 寫操作 */
??RW24xx(p1,Length,addr,Control,enumer); /* 寫 */
??Control=0xa1; /* 讀操作 */
??RW24xx(p2,Length,addr,Control,enumer); /* 讀 */
}
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- NRF24L01的模塊資料和C語言程序和使用與開發攻略合集免費下載 41次下載
- 24C1024B讀寫C語言程序免費下載 67次下載
- 模擬IIC讀寫總結之at24c512讀寫程序 93次下載
- 24C01與單片機的接口電路和程序 20次下載
- SD卡讀寫C程序 17次下載
- 24c01a的讀寫程序
- 24c16讀寫驅動程序
- AVR TWI讀寫范例程序(AT24C02)
- 24c02/24c01/24c04讀寫程序
- 24c32/24c16/24c08讀寫程序
- AT24C32/AT24C56讀寫程序
- AT24C02/AT24C04/AT24C08/AT24C1
- at24c01 pdf datasheet
- at24c01中文資料
- at24c16 c程序
- AT24C04芯片驅動程序原理 1823次閱讀
- C程序的結構 1016次閱讀
- 使用51單片機讀寫AT29C040的C語言程序免費下載 4528次閱讀
- 51單片機讀寫AT29C040的C51程序 4737次閱讀
- HD44780讀寫單片機C51程序免費下載 4145次閱讀
- 使用HD44780讀寫單片機的C51程序詳細概述 3112次閱讀
- AT24C系列芯片的驅動設計 4613次閱讀
- AT89S52單片機并行端口模擬I2C總線協議讀寫AT24C04的設計 2582次閱讀
- 如何使用單片機模擬讀寫24C01EEPROM數據 5054次閱讀
- FSMC如何讀寫CPLD 3403次閱讀
- C51讀寫AT24C04源代碼及AT24C04測試程序 1.6w次閱讀
- AT24C256介紹_AT24C256燒錄的完整程序 1.2w次閱讀
- 單片機之IIC--AT24C256的讀寫程序 1.4w次閱讀
- nrf24l01收發程序詳解 3w次閱讀
- 讀寫24LCxx系列的EEPROM的實例程序 2210次閱讀
下載排行
本周
- 1普中科技HC6800-EM3使用操作手冊
- 21.69 MB | 3次下載 | 2 積分
- 2PCB板EMC/EMI的設計技巧
- 0.20 MB | 3次下載 | 免費
- 32024PMIC市場洞察
- 2.23 MB | 2次下載 | 免費
- 4MSP430?閃存器件引導加載程序(BSL)
- 1.45MB | 2次下載 | 免費
- 5PL4807單節鋰離子電池充電器中文手冊
- 1.36 MB | 2次下載 | 免費
- 6LTH7充電電路和鋰電池升壓5V輸出電路原理圖
- 0.04 MB | 1次下載 | 免費
- 7HT2120兩節鋰電池保護板電路
- 0.22 MB | 1次下載 | 免費
- 8BQ77207EVM用戶指南
- 865.23KB | 1次下載 | 免費
本月
- 1XL4015+LM358恒壓恒流電路圖
- 0.38 MB | 151次下載 | 1 積分
- 2PCB布線和布局電路設計規則
- 0.40 MB | 33次下載 | 免費
- 3智能門鎖原理圖
- 0.39 MB | 13次下載 | 免費
- 4GB/T4706.1-2024 家用和類似用途電器的安全第1部分:通用要求
- 7.43 MB | 11次下載 | 1 積分
- 5JESD79-5C_v1.30-2024 內存技術規范
- 2.71 MB | 10次下載 | 免費
- 6elmo直線電機驅動調試細則
- 4.76 MB | 9次下載 | 6 積分
- 7WIFI智能音箱原理圖完整版
- 0.09 MB | 7次下載 | 10 積分
- 8PC1013三合一快充數據線充電芯片介紹
- 1.03 MB | 7次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935115次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183332次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73806次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65985次下載 | 10 積分
評論
查看更多