c8051单片机和AT24c1024B的通信(IIC协议)代码
- UID
- 1029342
- 性别
- 男
|
c8051单片机和AT24c1024B的通信(IIC协议)代码
利用51单片机的I/O口来模拟IIC协议,加深对其时序的理解,其次学习AT24c1024b的读写方法.已经通过运行代码如下:
[cpp]
include <reg51.h>
#include<intrins.h>//包含_nop_()函数
#define CTL_R 0xa1//AT24读控制
#define CTL_W 0xa0//AT24写控制
sbit SCL=P1^6;
sbit SDA=P1^7;
void Delay(int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<1000;j++);
}
void delay(void) //延时>4us
{
_nop_();//空指令
_nop_();
_nop_();
_nop_();
}
void IIC_start(void)//IIC开始
{
SDA=1;
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
}
void IIC_stop(void)//IIC结束
{
SDA=0;
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
}
void IIC_ACK(void)//发送应答ACK=0
{
SDA=0;
SCL=1;
delay();
SCL=0;
SDA=1;
}
void IIC_nACK(void)//发送非应答
{
SDA=1;
SCL=1;
delay();
SCL=0;
}
int IIC_CACK() //检查应答
{
int C=0;
while(C!=SDA);
SCL=1;
delay();
SCL=0;
return C;
}
void IIC_send(char n)//字节发送
{
int i;
char tmp=n;
for(i=0;i<8;i++)
{
SDA=(bit)(tmp>>7);//发送一个字节的高位
SCL=1;
delay();
tmp<<=1;
SCL=0;
}
}
char IIC_rec(void)//字节接收
{
int i;
char tmp=0;
for(i=0;i<8;i++)
{
tmp <<=1;
tmp |=SDA;
SCL=1;
delay();
SCL=0;
}
return tmp;
}
void IIC_W_AT24C1024B(int n,short int ADDR,char *from)//多字节发送
{
int i;
IIC_start();
do
IIC_send(CTL_W);
while(IIC_CACK());//等待应答
do
IIC_send((char)(ADDR>>4));//1字节高位地址
while(IIC_CACK());//等待应答
do
IIC_send((char)ADDR);//1字节高位地址
while(IIC_CACK());//等待应答
for(i=0;i<n;i++)
{
do
IIC_send(*from);//发送一个字节
while(IIC_CACK());//等待应答
from++;
}
IIC_stop();
}
void IIC_R_AT24C1024B(int n,short int ADDR,char to[])//多字节接收
{
int i;
IIC_start();
do
IIC_send(CTL_W);
while(IIC_CACK());//等待应答
do
IIC_send((char)(ADDR>>4));//1字节高位地址
while(IIC_CACK());//等待应答
do
IIC_send((char)ADDR);//1字节低位地址
while(IIC_CACK());//等待应答
IIC_start();
do
IIC_send(CTL_R);
while(IIC_CACK());//等待应答
for(i=0;i<n;i++)
{
to[i]=IIC_rec();//接收一个字节
if(n!=i)
IIC_ACK();//发送应答
else
IIC_nACK();
}
IIC_stop();
} |
|
|
|
|
|