首页 | 供应信息 | 采购信息 | PDF资料 | 技术资料 | 行业资讯 | 产品展示 | 人才市场 进入会员区
   技术文章分类:单片机/DSP 嵌入式系统 测试仪表 电源技术 接口电路 存储器 传感与控制 通信网络 无线通信 模拟技术 显示与光电 EDA/PLD 汽车电子 消费电子 电子综合
   电子综合工具:PDF资料大全 电子缩略语 IC型号替换 IC厂家 电子电路图 技术参数 设计应用 解决方案
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
  您所在的位置: IC37首页 > 技术问答 > 单片机 > 发一个大家都很熟悉的24C02子程序.

  发一个大家都很熟悉的24C02子程序. 

我已经测试过,绝对可以用着子程序块调用.谢谢

注:程序是<<单片机高级语言C51WINGDOWS环境编程与应用>>里的例子.

=======================================================

//************************************************************//

//*文件名: 24c02的读写程序.C*/

/* 功能: 24c02的读写*/

/* 日期: 2005-03-04*/

/* 创建人: 何小小*/

//***********************************************************//

#include <intrins.h>

#include "AT89X52.h"

#include <absacc.h>

#define uchar unsigned char

#define uint unsigned int

#define DPORTP0

#define port3 P3

#define WRITE 0xa0

#define READ 0xa1

#define DATA_SIZE 11

#define HIGH 1

#define LOW 0

#define FALSE 0

#define TRUE1

sbit SCL = P1^6 ;

sbit SDA = P1^7 ;

//sbit key=P3^5;

extern void I_start(void);

extern void I_stop(void);

extern void delaytime(void);

extern void I_init(void);

bit I_clock(void);

bit I_send(uchar I_data);

extern uchar I_receive(void);

void I_ack(void);

extern void wait_5(void) ;

extern bit E_address(uchar address);

extern bit E_read_block(uchar addr);

extern bit E_write_block(uchar addr);

extern uchar data buffe_data[DATA_SIZE] ;

/*************************************************/

/*启动iic总线*/

/************************************************/

void I_start(void)

{

SCL=HIGH;

delaytime();

SDA=LOW;

delaytime();

SCL=LOW ;

delaytime();

}

/*************************************************/

/*停止iic总线*/

/************************************************/

void I_stop(void)

{

SDA=LOW;

delaytime();

SCL=HIGH;

delaytime();

SDA=HIGH;

delaytime();

SCL=LOW ;

delaytime();

}

/**************************************************/

void delaytime(void)

{

_nop_() ;

_nop_() ;

_nop_() ;

}

/*************************************************/

/*初始化iic总线*/

/************************************************/

void I_init(void)

{

SCL=LOW;

I_stop();

}

/*************************************************/

/*iic总线 时钟信号用来

/*传输一位数据,并返回SDA的状态*/

/************************************************/

bit I_clock(void)

{

bit sample;

SCL = HIGH;

delaytime();

sample=SDA;

SCL = LOW ;

delaytime();

return(sample) ;

}

/*************************************************/

/*iic总线主机发送8位数据*/

/*并请求一个应答信号ACK.收到为1,否则为0*/

/************************************************/

bit I_send(uchar I_data)

{

register uchar i ;

for(i=0;i<8;i++)

{

SDA=(bit)(I_data&0x80) ;

I_data=I_data<<1 ;

I_clock();

}

SDA=HIGH;

return(~I_clock());

}

/*************************************************/

/*iic总线主机接收8位数据*/

/*不回送应答信号ACK.调用本函数之前保证SDA信号*/

/*处于浮置状态,即使P1.7=1*/

/************************************************/

uchar I_receive(void)

{

uchar I_data=0 ;

register uchar i ;

for(i=0;i<8 ;i++)

{

I_data *=2 ;

if(I_clock())

I_data++;

}

return(I_data);

}

/*************************************************/

/*主机向iic总线应答信号ACK*/

/*一般用于连续数据读取时*/

/************************************************/

void I_ack(void)

{

SDA=LOW;

I_clock();

SDA=HIGH;

}

/*************************************************/

/*提供5MS延时*/

/************************************************/

void wait_5(void)

{

register int i;

for(i=0;i<1000;i++)

;

}

/*************************************************/

/*向24C02中写入24C02的器件地址和一个指定

/*的字节地址*/

/************************************************/

bit E_address(uchar address)

{

I_start();

if(I_send(WRITE))

return(I_send(address));

else

return(FALSE) ;

}

/*************************************************/

/*从24C02中读取N个字节的数据并放在数组内 */

/*如果24C02不接受指定地址则返回0*/

/************************************************/

bit E_read_block(uchar addr)

{

register uchar i ;

if(E_address(addr))

{

I_start();

if(I_send(READ))

{

for(i=0;i<=DATA_SIZE;i++)

{

buffe_data[i]=(I_receive());

if(i!=10)

I_ack();

else

{

I_clock();

I_stop();

}

}

}

return(TRUE);

}

else{

I_stop();

return(FALSE);

}

}

/*************************************************/

/*把数组中的数据写入24C02中的头N个字节内*/

/*如果24C02不接受指定地址或者未收到应答则返回0 */

/************************************************/

bit E_write_block(uchar addr)

{

register uchar i;

wait: for (i=addr;i<=(DATA_SIZE+addr);i++)

{

if(E_address(i))

{

if(I_send(buffe_data[i]))

{

I_stop();

wait_5();

}

else

goto wait;

}

else

return(FALSE);

}


作者:hexiaoxiao  2005-5-30 15:18:00

  回复1  自己顶一下哦55733

能用的好东西怎么没人要.

虽然参考了书,可是我自己写的啊.


作者:hexiaoxiao  2005-5-31 14:34:00

  回复2  呵呵55734

有人拿了不一定会告诉你


作者:nikle  2005-5-31 17:44:00

  回复3  D55735

是啊,自己顶了.


作者:hexiaoxiao  2005-6-1 13:11:00

  回复4  最好还是自己写吧,印象会深一点55736

最好还是自己写吧,印象会深一点
作者:wolf0801  2005-6-1 21:52:00

  回复5  用了goto领导会无条件骂的55737

>else

>goto wait;

改成 else continue; 好一些。不过有的领导还是要开骂。

另外,多字节读写的时候,可以不用全局buffer,更模块化。


作者:12864  2005-6-1 23:08:00

  回复6  D55738

谢谢楼上


作者:hexiaoxiao  2005-6-2 10:31:00


我要投稿 注册会员
客服咨询热线:0755-26000950 0755-26007355
 相关技术问答
·有没有8031控制ISD1..  2005-5-30
·我想找一个单片机拨号及DT..  2005-5-30
·供NVRAM  2005-5-30
·关于P89V51RD2FN..  2005-5-30
·请教一个问题,怎样用C实现  2005-5-30
·一个很菜的问题!你知道吗?  2005-5-30
·无绳电话是如何做到避免两个..  2005-5-30
·抄都抄错,请帮我看看这个I..  2005-5-30
·KEIL中程序代码为什么不..  2005-5-30
·关于双向可控硅问题  2005-5-30
·keil c51中位变量的..  2005-5-30
·如何将宽脉冲变窄?  2005-5-30
·选择低功耗低电压MCU,大..  2005-5-30
·用过16C554的大侠进来..  2005-5-30
·单片机用 4M的晶体 AL..  2005-5-30
·欢迎来讨论一下方案(多cp..  2005-5-30
·要完成一项调查。拜托各位D..  2005-5-30
·关于TTL电平和CMOS电..  2005-5-30
·怀疑单片机是坏的,如何证明?  2005-5-30
 
 热门IC
SCL4424-VF8  SN74HCT574ADB  CS5351-KSR  RN4981  DM74F646  F0805B1R00FWTRM  74LS174P  RH5VL44AA  ALS373  HML1210C  SAA5281  CXD3407GA  STA1036Y  DP8392  IX0933  RC1LF0255TAZZ  S216-12  MCH3306  UN2115-Q  6L8M84BG7  BTA204S-600B  A6810SA  CXA1352  2SA1940-O  ZM4744  UPC1853  TLE4276V10  TS834-5IN  UN9216J  FS8802  CXD2307R-T6  PC87332VLJ-5  SM5805P  TMP87PM14N  M52013AP  FAN3504  2SB1317  LM2937ET-2.5  XR29P02CP  X2R4610  XS69810  93S46M8  NH01SS-524  UPD27C512D-20  UA9638  TDA8372A  TA1219  SVM7860C6A  SAK-C167SR-LMGA-T  SN74ABT162841DGGR