老古开发网首页
导航:老古开发网首页文章索引索引第46页文章分类单片机第6页→[24C01的IIC 读写的c51程序]
| -文章搜索 - 最新文章 - |

第411篇:24C01的IIC 读写的c51程序

发布时间:2001年10月16日 点击次数:7710
来源:   作者:
 
/*------------------------------------------------------------------------------
为了安全起见,程序中很多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();
}


欢迎进入老古论坛进行讨论
[单片机] 相关文章:
在一块已设计好的电路板上增加新功能,原板是用汇编语言来编写的,而新增功能是用C语言写的,不知可否实现?
简介:
各位大侠,你们好!小弟有一问题求教。我想在一块已设计好的电路板上增加新功能,原板是用汇编语言来编写的,而新增功能是用C语言写的,不知可否实现? 可以。用keil c可以做到 ......

看门狗RESET时,程序是从初始化处还是从while(1)后运行。
学完了马忠梅的《单片机的c语言应用程序设计》后该学那一本书?请各位大虾推荐几本c51的好书!
MCS51的串口能否工作在“二位停止位”的工作状态吗?
求教 7805
 
下一个:[新闻热点]Actel 0.18微米工艺制造的嵌入式可重编程IP核
简介:
Actel 公司 (Actel Corporation) 采用Chartered 半导体制造公司的0.18微米加工工艺,推出基于SRAM的VariCoreTM 嵌入式可编程门阵列 (EPGATM) 知识产权 (IP) 内核。   这些仅由Actel公司提供VariCore EPGA IP内核可用于专用集成电路 (ASIC) 和专用标准产品 (ASS......

上一个:[综合电子]SID 2001的参展商们充分显现未来发展前景

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:30分钟 执行时间:31毫秒