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

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

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