c8051单片机和AT24c1024B的通信(IIC协议)代码(2)
- UID
- 1029342
- 性别
- 男
|
c8051单片机和AT24c1024B的通信(IIC协议)代码(2)
char a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F的字形码
char s[16]={0};
int main(void)
{
int i;
IIC_W_AT24C1024B(16,0x0020,a);
Delay(30);
IIC_R_AT24C1024B(16,0x0020,s);
for(i=0;i<15;i++)
{
P3=b;
Delay(60);
}
} #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=IIC_rec();//接收一个字节
if(n!=i)
IIC_ACK();//发送应答
else
IIC_nACK();
}
IIC_stop();
}
char a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F的字形码
char s[16]={0};
int main(void)
{
int i;
IIC_W_AT24C1024B(16,0x0020,a);
Delay(30);
IIC_R_AT24C1024B(16,0x0020,s);
for(i=0;i<15;i++)
{
P3=b;
Delay(60);
}
}
硬件接图如下:
实现过程原来蛮简单,就是时序要把握好,特别是单片机作为收机的时候,应答信号ACK完成记得释放总线SDA(为1) |
|
|
|
|
|