×
单片机 > 单片机程序设计 > 详情

24C01的IIC 读写的C51程序

发布时间:2020-05-26 发布时间:
|

/*------------------------------------------------------------------------------
为了安全起见,程序中很多NOP是冗余的,希望读者能进一步精简,但必须经过验证。
        Atmel 24C01 比较特殊,为简约型.
        51晶振为11.0592MHz
〖参考〗http://www.c51bbs.com
〖版本〗V1.00A Build 0918
-----------------------------------------------------------------------------*/

#include "reg51.h"
#include "intrins.h"

sbit SCL= P1^5;
sbit SDA= P1^4;

delay()
{
    unsigned int i=1200;
    while(i--);
}

/*----------------------------------------------------------------------------
调用方式:write_8bit(unsigned char ch)  ﹫2001/03/23
函数说明:内函数,私有,用户不直接调用。
-------------------------------------------------------------------------------
*/
void  write_8bit(unsigned char ch)
{
    unsigned char i=8;
    SCL=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    while (i--)
    {
        SDA=(bit)(ch&0x80);
        _nop_();_nop_();_nop_();_nop_();_nop_();
        ch<<=1;
        SCL=1;
        _nop_();_nop_();_nop_();_nop_();_nop_();
        SCL=0;
        _nop_();_nop_();_nop_();_nop_();_nop_();
    }
    _nop_();_nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();
}

/*------------------------------------------------------------------------------
调用方式:void ACK(void)  ﹫2001/03/23
函数说明:内函数,私有,用户不直接调用。
-------------------------------------------------------------------------------
*/
void ACK(void)
{
    unsigned char time_1;
    SDA=1;
    SCL=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SCL=1;
    time_1=5;
    while(SDA) {if (!time_1) break;} //ACK
    SCL=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();
}

unsigned char ReadIIC_24C01(unsigned char address)
{
    unsigned char ddata=0;
    unsigned char i=8;

    SCL=1;
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   //Tsu:STA
    SDA=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();        //Thd:STA
    SCL=0;             //START

    write_8bit( (address<<1) | 0x01);   //写页地址和操作方式
    ACK();

    while (i--)
    {
        SDA=1;
        ddata<<=1;
        SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
        if (SDA) ddata|=0x01;
    }

    SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    SDA=1;   //STOP
    delay();
    return ddata;

}

void WriteIIC_24C01(unsigned char address,unsigned char ddata)
{
    SCL=1;
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   //Tsu:STA
    SDA=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
    SCL=0;             //START

    write_8bit( (address<<1) & 0xfe);   //写页地址和操作方式,对于24C32-24C256,page不起作用
    ACK();
    write_8bit(ddata);      //发送数据
    ACK();
    SDA=0;
    _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    SDA=1;   //STOP
    delay();
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM基础知识八