找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1931|回复: 0
打印 上一主题 下一主题
收起左侧

24CXXXIIC的单片机驱动程序(原创可用)

[复制链接]
跳转到指定楼层
楼主
ID:130230 发表于 2020-1-8 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*********************************************************************
功能:产生IIC起始信号
备注:时钟数据线拉高进入空闲状态,然后再时钟线高电平情况下
        拉低数据局限进入起始状态,拉低时钟线钳位总线准备发送
wx:mcu6666(单片机项目交流合作)
***********************************************************************/
void IIC_Start(void)
{
        SDAH();
        SCLH();
        I2CWait();
           SDAL();
        I2CWait();
        SCLL();
}
/*********************************************************************
功能:产生停止信号
备注:  时钟高电平期间数据线向高电平方向跳变
***********************************************************************/
void IIC_Stop(void)
{
        SDAL();
        SCLL();
        I2CWait();
        SCLH();
        I2CWait();
        SDAH();
        I2CWait();
}
/********************************************************************
功能:检测应答信号
返回:1:失败
         0 :成功
备注:作为发送方的时候等待接收的应答信号
**********************************************************************/
unsigned char IIC_Wait_Ack(void)
{
        unsigned char flag;
        SDAH();
        I2CWait();
        SCLH();
        I2CWait();
        if(SDA)
                flag=1;
        else
                flag=0;
        SCLL();
        return flag;
}

/**********************************************************************
功能:产生应答信号
备注:数据线低电平应答
***********************************************************************/
void IIC_Ack(void)
{
        SCLL();
        SDAL();
        I2CWait();
        SCLH();
        I2CWait();
        SCLL();
}

#if 0
/***************************************************************************
功能:产生非应答信号
备注:数据线高电平非应答
***************************************************************************/
void IIC_NAck(void)
{
        SCLL();
        SDAH();
        I2CWait();
        SCLH();
        I2CWait();
        SCLL();
}
#endif

/****************************************************************************
功能:发送一个字节
入口:要发送的字节备注:
****************************************************************************/
void IIC_Send_Byte(unsigned    char txd)
{
        unsigned char t;
        SCLL();
        for(t=0;t<8;t++)
        {
                if((txd&0x80)>>7)//MSB:高位在前
            SDAH();
        else
                        SDAL();
                txd<<=1;
                I2CWait();
                SCLH();
                I2CWait();
                SCLL();
        }
}
/****************************************************************************
功能:读一个字节

备注:读成功发送ack信号
*****************************************************************************/
unsigned char  IIC_Read_Byte(void)
{
        unsigned char i,receive=0;
        for(i=0;i<8;i++ )
        {
                SCLL();
                I2CWait();
                SCLH();
                I2CWait();
                receive<<=1; //MSB:高位在前
                if(SDA)
                        {
                                receive += 1;
                        }
        }
        IIC_Ack(); //发送ACK
        return receive;
}

/******************************************************************************
功能:再eep中读出一个字节
入口:16字节的地址  
*******************************************************************************/
unsigned char AT24CXX_ReadOneByte(unsigned          int ReadAddr)
{
        unsigned char  temp;
        unsigned char  addrH,addrL;

        addrH=ReadAddr>>8;
        addrL=ReadAddr&0xff;

        IIC_Start();

        IIC_Send_Byte(0xa0); //进入写模式

        IIC_Wait_Ack();
        IIC_Send_Byte(addrH);   //发送高地址
        IIC_Wait_Ack();
           IIC_Send_Byte(addrL);   //发送低地址
        IIC_Wait_Ack();
        IIC_Start();
        IIC_Send_Byte(0xa1);   //进入读模式

        IIC_Wait_Ack();
        temp=        IIC_Read_Byte();
        IIC_Stop();//产生一个停止条件
        return temp;
}
/**************************************************************************
功能:向地址中写一个数据
入口:1,地址          2,数据
作者:jzb 2020年1月6日
备注:
******************************************************************************/
void AT24CXX_WriteOneByte(unsigned int        WriteAddr,unsigned char DataToWrite)
{
        unsigned char addrH,addrL;

        addrH=WriteAddr>>8;
        addrL=WriteAddr&0xff;

        IIC_Start();

        IIC_Send_Byte(0xa0);

        IIC_Wait_Ack();
        IIC_Send_Byte(addrH);   //发送高地址
        IIC_Wait_Ack();
        IIC_Send_Byte(addrL);   //发送低地址
        IIC_Wait_Ack();
        IIC_Send_Byte(DataToWrite);     //发送字节
        IIC_Wait_Ack();
        IIC_Stop();//产生一个停止条件
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表