?? readwriteat24c08.c
字號:
#include <reg51.h>
// 對AT24C08的讀、寫
// extern void DelayMs(unsigned int);
// extern void ReadI2C(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
// extern void WriteI2C(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
/***************************************************************************/
#define WriteDeviceAddress 0xa0 //寫器件地址
#define ReadDviceAddress 0xa1 //讀器件地址
/***************************************************************************/
sbit SCL=P1^0; //I2C時鐘線SCL
sbit SDA=P1^1; //I2C數據線SDA
sbit DOG=P3^7; //程序運行標志及數據讀寫正確標志
/***************************************************************************/
void DelayMs(unsigned int number) //延時子程序,延時大小取決于工作頻率和number值
{
unsigned char temp;
for(;number!=0;number--,DOG=!DOG) //循環,DOG用于輸出狀態信號
{
for(temp=112;temp!=0;temp--) //空循環
{
}
}
}
/***************************************************************************/
void Start() //起始信號子程序
{
SDA=1;
DelayMs(1); //延時
SCL=1;
DelayMs(1);
SDA=0;
DelayMs(1);
SCL=0;
DelayMs(1);
}
/***************************************************************************/
void Stop() //終止信號子程序
{
SCL=0;
DelayMs(1);
SDA=0;
DelayMs(1);
SCL=1;
DelayMs(1);
SDA=1;
DelayMs(1);
}
/***************************************************************************/
void Ack() //發送應答位子程序
{
SDA=0;
DelayMs(1);
SCL=1;
DelayMs(1);
SCL=0;
DelayMs(1);
SDA=1;
DelayMs(1);
}
/***************************************************************************/
void NoAck() //發送非應答位子程序
{
SDA=1;
DelayMs(1);
SCL=1;
DelayMs(1);
SCL=0;
DelayMs(1);
}
/***************************************************************************/
bit TestAck() //應答位檢查子程序
{
bit ErrorBit;
SDA=1;
DelayMs(1);
SCL=1;
DelayMs(1);
ErrorBit=SDA; //讀入數據線上的應答狀態
DelayMs(1);
SCL=0;
DelayMs(1);
return(ErrorBit); //返回應答狀態,0為正常應答信號,1為非應答信號
}
/***************************************************************************/
bit Write8Bit(unsigned char input) //寫一個字節數據子程序
{ //input為待發送的數據
unsigned char temp;
for(temp=8;temp!=0;temp--) //循環移位,逐位發送數據
{
SDA=(bit)(input&0x80); //取數據的最高位
DelayMs(1);
SCL=1;
DelayMs(1);
SCL=0;
DelayMs(1);
input=input<<1; //左移一位
}
return 1;
}
/***************************************************************************/
void WriteI2C(unsigned char *Wdata,unsigned char RomAddress,unsigned char number)
{ //寫n個字節數據子程序
Start(); //啟動
Write8Bit(WriteDeviceAddress); //寫寫器件的尋址地址
TestAck(); //應答檢查
Write8Bit(RomAddress); //寫入I2C器件內部的數據存儲首地址
TestAck(); //應答檢查
for(;number!=0;number--) //循環,逐個字節發送
{
Write8Bit(*Wdata); //寫一個字節
TestAck(); //應答檢查
Wdata++; //指針增加,指向下一個數據
}
Stop(); //停止
DelayMs(10);
}
/***************************************************************************/
unsigned char Read8Bit() //讀一個字節數據子程序
{
unsigned char temp,rbyte=0;
for(temp=8;temp!=0;temp--) //循環,逐位讀入字節數據
{
SCL=1;
DelayMs(1);
rbyte=rbyte<<1; //左移一位
DelayMs(1);
rbyte=rbyte|((unsigned char)(SDA)); //數據線SDA上的數據存入rbyte的最低位
SCL=0;
DelayMs(1);
}
return(rbyte); //返回讀入的字節數據
}
/***************************************************************************/
void ReadI2C(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes)
{ //讀n個字節數據子程序
Start(); //啟動
Write8Bit(WriteDeviceAddress); //寫寫器件的尋址地址
TestAck(); //應答檢查
Write8Bit(RomAddress); //寫I2C器件內部數據的讀取首地址
TestAck(); //應答檢查
Start(); //重新啟動
Write8Bit(ReadDviceAddress); //寫讀器件的尋址地址
TestAck(); //應答檢查
while(bytes!=1) //循環讀入字節數據
{
*RamAddress=Read8Bit(); //讀入一個字節
Ack(); //應答
RamAddress++; //地址指針遞增
bytes--; //待讀入數據個數遞減
}
*RamAddress=Read8Bit(); //讀入最后一個字節數據
NoAck(); //非應答
Stop(); //停止
}
void main()
{
unsigned char writeByte[8]={0xC0,0x34,0x12,0x11,0x22,0x01,0x00,0x00};
//需要寫的8個字節USB數據ID
unsigned char readByte[8]; //用于存讀入的8個字節數據
unsigned char *addw; //寫數據指針操作
unsigned char *addr; //讀數據指針操作
unsigned char i;
unsigned char ok=0;
bit write=1; //讀寫標志
DOG=0;
while(1)
{
if(write==1) //當write==1時,執行寫和讀操作
{
addw=writeByte; //寫地址映射
addr=readByte; //讀地址映射
WriteI2C(addw,0x00,8); //寫數據
ReadI2C(addr,0x00,8); //讀數據
for(i=0;i<8;i++) //判斷每個字節讀寫是否一致
{
if(writeByte[i]==readByte[i])
{
ok++;
}
}
if(ok==8)
{
DOG=1; //當讀寫一致時,P3.7輸出高電平
}
else
{
DOG=0; //當讀寫不一致時,P3.7輸出低電平
}
write=0; //置write==0,讀寫完畢
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -