#include<REGX51.H> //定義單片所有的 SFR
#include<INTRINS.H>
#define AT24C02_ADDR 0Xa0 //AT24C02的地址0xa0 賦予AT24C02
#define unit unsigned int
#define uchar unsigned char
sbit SDA=P2^0;
sbit SCL=P2^1;
void delay_5us()
{
_nop_();
}
///////////////////////////////////////////////////
void I2C_init()//IIC 初始化
{
SDA=1;
_nop_();
SCL=1;
_nop_();
}
void I2C_Start() //起始信號
{
SCL=1;
_nop_();
SDA=1;
delay_5us();
SDA=0;
delay_5us();
}
void I2C_Stop()// 停止
{
SCL=1;
_nop_();
SDA=0;
delay_5us();
SDA=1;
delay_5us();
}
////////////////////////////////////////////////////////
void Master_ACK(bit i)//master_ACK發送應答信號
{ //為1 表示要發應答
SCL=0; //只有在時鐘總線為低時,SDA資料線上的變化才是有效的
_nop_();
if(i)//如果i=1
{
SDA=0;//發出一個應答信號
}
else
{
SDA=1;
}
_nop_();
SCL=1;//拉高時鐘總線SDA的資料才可以被讀走
_nop_();
SCL=0;
_nop_();
SDA=1;
_nop_();
}
bit Text_ACK()//檢測從機應答
{
SCL=1;
delay_5us();
if(SDA)//主機沒有發 應答信號 那么就拉低SCL發送一個停止信號來結束這次資料的傳輸
{ //主機每發一幀資料給從機都要檢測每幀資料的第九位的應答
//從機把SDA線拉低代表應答
SCL=0;
I2C_Stop();
return(0);
}
else
{
SCL=0;
_nop_();
return(1);
}
}
void I2C_send_byte(uchar byte)//發送資料
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0;
_nop_();
if(byte&0x80) //1000 0000
{
SDA=1;
_nop_();
}
else
{
SDA=0;
_nop_();
}
SCL=1;
byte<<=1;
}
SCL=0;
SDA=1;
}
//IIC 讀一個位元組
uchar I2C_rend_byte()
{
uchar i,dat;
SCL=0;
_nop_();
SDA=1;
_nop_();
for(i=0;i<8;i++)
{
SCL=1;
_nop_();
i<<=1;
if(SDA)
{
dat=dat|0x01;
}
else
{
dat=dat&0xfe;
}
_nop_();
SCL=0;
_nop_();
}
return(dat);
}
//發送資料
bit I2C_TransmitData(uchar ADDR,uchar DAT)
{
I2C_Start();
I2C_send_byte(AT24C02_ADDR+0);// 讀寫方向位
if(!Text_ACK())
{
return(0);
}
I2C_send_byte(ADDR); //寫入第255個單元地址
if(!Text_ACK())
{
return(0);
}
I2C_send_byte(DAT);
if(!Text_ACK())
{
return(0);
}
I2C_Stop();
return(1);
}
//接收資料
uchar I2C_ReceiveData(uchar ADDR)
{
uchar DAT;
I2C_Start(); //起始信號
_nop_();
I2C_send_byte(AT24C02_ADDR+0);//從機地址
if(!Text_ACK) //檢測應答
{
return(0);
}
I2C_send_byte(ADDR); //讀取單元資料
if(!Text_ACK)
{
return(0);
}
Master_ACK(0); //發送非應答
I2C_Start();
I2C_send_byte(AT24C02_ADDR+1);
if(!Text_ACK)
{
return(0);
}
DAT=I2C_rend_byte();
Master_ACK(0);
I2C_Stop();
return (DAT);
}
void main ()
{
//s 寫首地址+讀寫方向位 從機應答 寫入器件的地址 從機應答 寫入的資料 發送非應答
I2C_init();
I2C_TransmitData(255,0xF0);//往I2C里面的255單元發送一個0xfe
_nop_();
/////////////////// 讀資料的流程
// s 從機地址+讀寫方向位 等待應答 讀取單元類資料 發送應答或者非應答 從機地址+1 等待應答
P2=I2C_ReceiveData(255);// 從255個單元里面接收
while(1);
}我覺得沒什么問題啊?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/79060.html
標籤:基礎類
上一篇:求助ifram嵌套問題
