首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

c8051单片机和AT24c1024B的通信(IIC协议)代码(2)

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)
继承事业,薪火相传
返回列表