24C01读写的c51源程序代码分享

发布者:Asawen最新更新时间:2023-09-13 来源: elecfans关键字:24C01  读写  c51 手机看文章 扫描二维码
随时随地手机看文章

   程序中很多NOP是冗余的,希望读者能进一步精简,但必须经过验证。

  Atmel 24C01 比较特殊,为简约型。


  51晶振为11.0592MHz

  -----------------------------------------------------------------------------*/

  #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();

  }

  2.这是一个读写24C系列EEPROM的程序,已经经过本人亲自测试,通过!!!!!

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

  //** M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256

  //** 21c01,24c02:1010A2A1A0R/W; 24C04:1010A2A1P0R/W; 24C08:1010A2P1P0R/W

  //** 24C16:1010P2P1P0R/W; //** 以上6种芯片的读写格式为:start-device addr-ack-first word addr-ack-second word addr-ack-data-ack-stop

  //** 进行读写的字节数,EEPROM首址,EEPROM控制字节,

  //** 以及EEPROM类型。此程序结构性良好,具有极好的容错性,程序机器码也不多:

  //** 以上5种芯片的读写格式为:start-device addr-ack-word addr-ack-data-ack-stop

  //** 24c32-24c512:1010A2A1A0R/W; 24C1024:1010A2A1P0R/W; 24c1024:1010A2A1P0R/W //** 通用的24C01-24C1024共11种EEPROM的字节读写操作程序,

  //**************************24C01读写的c51源程序***********************************

  #i nclude

  #i nclude

  #i nclude

  #i nclude

  sbit SDA =P1^1;

  sbit SCL =P1^4;

  sbit WP =P1^7;

  sbit light =P1^0;

  sbit power =P1^6;

  #define uchar unsigned char

  #define uint unsigned int

  


  void iic_delay10ms();

  void iic_delay(void);

  void iic_start(void);

  void iic_stop(void);

  void iic_ack(void);

  void read_byte(void);

  void send_byte(void);

  void initial(void);

  void ok(void);

  void error(void);

  void read_eeprom(void);

  void write_eeprom(void);

  void init(void);

  uchar ack_flag,send_data,receive_data[32];

  uchar rw,type,device_addr,addr[3],num;

  void main(void)

  {

  initial();

  power =0;

  light =0;

  while(1)

  {

  ES =1;

  rw =0x55;

  WP =0;

  while(rw ==0x55);

  ES =0;

  switch(type)

  {

  case 0x01:

  case 0x02:

  case 0x04:

  case 0x08:

  case 0x16:

  type =0x02;

  addr[1] |=0xa0;

  device_addr 《《=1;

  addr[1] |=device_addr;

  break;

  default:

  type =0x03;

  addr[2] |=0xa0;

  device_addr 《《=1;

  addr[2] |=device_addr;

  }

  if(rw ==0x01) //读EEPROM

  {

  read_eeprom();

  }

  else if(rw ==0x00) //写EEPROM

  {

  write_eeprom();

  }

  else //error command

  {

  error();

  ACC =0x01;

  SBUF =ACC;

  while(!TI);

  TI =0;

  }

  }

  }

  void read_eeprom(void)

  {

  uchar i;

  WP =1;

  iic_start();

  for(i=1;i《=type;i++)

  {

  send_data =addr[type-i];

  send_byte();

  iic_ack();

  if(ack_flag ==0x01)

  break;

  }

  if(ack_flag ==0x00)

  {

  iic_start();

  addr[type-1] |=0x01;

  send_data =addr[type-1];

  send_byte();

  iic_ack();

  if(ack_flag ==0x00)

  {

  for(i=0;i

  //如果你对本程序或者24C01读写还有什么疑问,欢迎到的论坛去交流。

  void write_eeprom(void)

  {

  uchar i;

  WP =0;

  iic_start();

  for(i=1;i《=type;i++)

  {

  send_data =addr[type-i];

  send_byte();

  iic_ack();

  if(ack_flag ==0x01)

  break;

  }

  if(ack_flag ==0x00)

  {

  for(i=0;i

  


  void read_byte(void)

  {

  uchar i,temp=0x80;

  send_data =0x00;

  SCL =0;

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

  {

  SDA =1;

  SCL =1;

  if(SDA)

  send_data |=temp;

  temp/=2;

  SCL =0;

  iic_delay();

  }

  }

  void send_byte(void)

  {

  uchar i,temp=0x80;

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

  {

  if((send_data&temp)==temp)

  {

  SDA =1; //sda=1

  }

  else

  {

  SDA =0; //sda=0

  }

  temp /=2;

  iic_delay();

  SCL =1;

  iic_delay();

  SCL =0;

  iic_delay();

  }

  }

  void iic_start(void)

  {

  SDA =1;

  SCL =1;

  WP =0;

  iic_delay();

  SDA =0;

  iic_delay();

  SCL =0;

  }

  void iic_stop(void)

  {

  SDA =0;

  SCL =1;

  iic_delay();

  SDA =1;

  //WP =1;

  }

  void iic_ack(void)

  {

  ack_flag =0x00; //ack_flag等于0x00时有应答

  SDA =1;

  iic_delay();

  SCL =1;

  iic_delay();

  if(SDA)

  {

  ack_flag =0x01;

  }

  SCL =0;

  }

  void iic_delay(void)

  {

  _nop_();

  _nop_();

  _nop_();

  _nop_();

  }

  void iic_delay10ms(void)

  {

  #pragma ASM

  mov r6,#200

  mov r7,#10

  delay:

  nop

  nop

  nop

  djnz r6,delay

  mov r6,#200

  djnz r7,delay

  #pragma ENDASM

  }

  void initial(void)

  {

  TMOD =0x21;

  TH1 =0xfd;

  TL1 =0xfd;

  TH0 =0xfd;

  TL0 =0xfd;

  SCON =0x50;

  TR1 =1;

  EA =1;

  ES =1;

  ET0 =1;

  PT0 =1;

  }

  void ok(void)

  {

  ACC =0x55;

  SBUF =ACC;

  while(!TI);

  TI =0;

  ACC =0xaa;

  SBUF =ACC;

  while(!TI);

  TI =0;

  }

  void error(void)

  {

  ACC =0xaa;

  SBUF =ACC;

  while(!TI);

  TI =0;

  ACC =0x55;

  SBUF =ACC;

  while(!TI);

  TI =0;

  rw =0x55;

  }

  void es_int(void)interrupt 4

  {

  uchar i;

  RI =0;

  type =SBUF; //型号

  while(!RI);

  RI =0;

  device_addr =SBUF; //器件地址

  for(i=0;i《3;i++)

  {

  while(!RI);

  RI =0;

  addr[2-i] =SBUF; //地址高、中、低位字节

  }

  while(!RI);

  RI =0;

  num =SBUF; //要操作的字节数

  while(!RI);

  RI =0;

  rw =SBUF;

  if(rw ==1) //接收到要读的命令

  {

  ok();

  }

  else //接收到要写的命令

  {

  for(i=0;i


关键字:24C01  读写  c51 引用地址:24C01读写的c51源程序代码分享

上一篇:51单片机串口通信的原理与应用流程解析
下一篇:基于C89C58RD+单片机与VS1003实现MP3播放器设计

推荐阅读最新更新时间:2024-10-31 21:56

单片机基础(四):C51对C语言的扩展
C51对C语言的扩展 C51与标准C语言在数据结构、I/O处理、函数等方面与标准C语言存在差别 数据结构 sfr、sfr16 特殊功能寄存器型变量 特殊功能寄存器(SFR,Special Function Register)在单片机中有很重要的作用,常见的SFR是8位,所以sfr16用于表示16位的SFR 定义方式为 变量类型 变量名 = 地址 如 sfr P1 = 0x90 所有的sfr、sfr16型变量都已定义在 reg51.h 、 reg52.h 中 bit 、sbit 位变量 bit 、sbit 型变量在内存中都只占一个二进制位 bit 用于定义一般可处理位的变量,sbit 用于定义特殊功能寄存器中的可位寻
[单片机]
单片机基础(四):<font color='red'>C51</font>对C语言的扩展
C51单片机 的定时器学习笔记
/*-------------------------------------------------------*/ /* -------------author: robinson_911 -------------------------*/ /* -------------date:2014年2月 -------------------------*/ /* -------------content:关于串口 定时器程序 -----------*/ // 在22.1184MHZ下,通过定时器0,每1s通过串口发送数据 /*---------------------------------------------------
[单片机]
MSP430单片机FLASH读写操作例子
//****************************************************************************** // MSP430F149 // M. Mitchell // Texas Instruments Inc. // Feb 2005 // Built with IAR Embedded Workbench Version: 3.21A //****************************************************************************** #include MSP430x14x.h char value;
[单片机]
keil c51 与 MDK 冲突的解决
最近又作了一些C51的工作,发现keil c51与 mdk 有冲突。 然后上网一查果然有很多人遇到这个问题,错误提示为下图: 其实这个是MDK和KEIL C51 配置文件冲突的问题,可以参考下两个人的配置文件: PATH= D:Program FilesKeil_C702c51 (修改添加部分) BOOK0=HLPRELEASE_NOTES.HTM( Release Notes ) BOOK1=HLPGS51.PDF( uVision2 Getting Started ) BOOK2=HLPC51.PDF( C51 User's Guide ) BOOK3=HLPC51LIB.CHM( C51 Library
[单片机]
keil <font color='red'>c51</font> 与 MDK 冲突的解决
RFID读写器抗冲突问题研究
1 读写器的干扰   读写器的冲突是指由一个读写器检测到,并且由另一个读写器所引起的干扰。它主要有三种表现形式。   (1)读写器与读写器之问的干扰   当一个读写器发射较强的信号与一射频标签反射回的微弱信号相干扰时,就引起了读写器与读写器之间的干扰,其示意图如图1所示。读写器R1位于读写器R2干扰区。从射频标签Tl反射回的信号到达读写器R1,很容易被读写器R2发射的信号干扰。这种干扰即使两个读写器阅读范围没有重叠也有可能产生。   (2)多读写器到标签问的干扰   当多个读写器同时阅读同一个标签时引起了多读写器到标签间的干扰,如图2所示,两个读写器阅读范围重叠。从读写器Rl和R2发射的信号可能在射频标签Tl处产生干扰。
[安防电子]
RFID<font color='red'>读写</font>器抗冲突问题研究
便携式超高频RFID读写器的FPGA实现
引言 射频识别(Radio Frequency Identification,RFID)是利用微波进行双向数据传输的一种非接触式射频自动识别技术。RFID系统具有使用寿命长、低功耗、数据传输快速、稳定、安全、可靠,适应性和抗干扰性强等优点,已广泛用于工业控制、消费类电子、医疗电子、现代物流和校园一卡通等方面。RFID技术是现代物联网的核心技术。我国研究RFID技术起步比较晚,受软件和硬件等条件限制RFID技术还未真正实现大规模应用,大多数属于中、低频数据传输,距国外先进技术还有一段距离。本文重点介绍基于Altera公司Cyclone系列FPGA和ISO1800 0-6C标准超高频RFID读写器的软硬件实现方法。 1 系统原理
[嵌入式]
便携式超高频RFID<font color='red'>读写</font>器的FPGA实现
非接触式e5551读写器的开发
摘要:介绍了非接触式e5551卡工作原理和与单片机的接口,给出了非接触式e5551卡读写器的硬件电路和读卡、写卡程序流程图。 关键词:非接触式卡 射频识别 读写器 RF 射频识别RFIDRadio Frequency Identification技术是二十世纪九十年代兴起的一项自动识别技术,它利用无线射频方式进行非接触式双向通信。RFID系统中卡片与读写器之间无须物理接触即可完成识别,可实现多目标识别和运动目标识别,应用范围更加广泛。 根据工作频率不同,RFID系统可分为低频、中频、高频系统。低频系统一般工作在100kHz~500kHz,中频系统工作在10MHz~15MHz,它们主要适用于短距离、低成本识别高频系统工作
[应用]
51单片机教程第5讲_C51程序
c51语言程序是 一个由主函数和若干个函数构成。其中主函数就是程序的起点,单片机运行程序,首先会执行主函数里面的第一条语句,直到执行完成主函数的所有语句,单片机的程序一般都是来完成某项具体功能的,所以程序一般都是一个循环结构的语句。 函数从用户使用角度讲,分为两类,一类是标准库函数,一类是用户自定义的函数。标准库函数是由开发环境自带的,比如我们常用的KEIL软件,就自带有很多库函数。库函数可以直接调用。用户自己写的函数,一般都是完成一些库函数里面没有的特定功能。 函数的一般形式为: 返回值类型 函数名(形式参数列表) { 函数体 } 返回值类型可以是基本数据类型或者指针类型,如:int float char double等等。当
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved