stc12c5a60s2 eeprom程序

HDL语言及源代码

6人已加入

描述

  TC12C5A60S2/AD/PWM系列单片机是单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。

  #include “reg51.h”

  #include “intrins.h”

  #define CMD_IDLE 0

  #define CMD_READ 1

  #define CMD_PROGRAM 2

  #define CMD_ERASE 3

  //#define ENABLE_IAP 0x80 //if SYSCLK《30MHz

  //#define ENABLE_IAP 0x81 //if SYSCLK《24MHz

  #define ENABLE_IAP 0x82 //if SYSCLK《20MHz //

  #define ENABLE_IAP 0x83 //if SYSCLK《12MHz //

  #define ENABLE_IAP 0x84 //if SYSCLK《6MHz //

  #define ENABLE_IAP 0x85 //if SYSCLK《3MHz //

  #define ENABLE_IAP 0x86 //if SYSCLK《2MHz //

  #define ENABLE_IAP 0x87 //if SYSCLK《1MHz

  #define IAP_ADDRESS 0x0000

  typedef unsigned char BYTE;

  typedef unsigned int WORD;

  sfr IAP_DATA = 0xC2;

  sfr IAP_ADDRH = 0xC3;

  sfr IAP_ADDRL = 0xC4;

  sfr IAP_CMD = 0xC5;

  sfr IAP_TRIG = 0xC6;

  sfr IAP_CONTR = 0xC7;

  void Delay(BYTE n);

  void IapIdle();

  void IapWriteByte(WORD addr, BYTE dat);

  void IapEraseSector(WORD addr);

  BYTE IapReadByte(WORD addr);

  void main()

  {

  WORD i;

  P1 = 0xfe;

  Delay(10);

  IapEraseSector(IAP_ADDRESS);

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

  {

  if (IapReadByte(IAP_ADDRESS+i) != 0xff)

  goto Error;

  }

  P1 = 0xfc;

  Delay(10);

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

  {

  IapWriteByte(IAP_ADDRESS+i, (BYTE)i);

  }

  P1 = 0xf8;

  Delay(10);

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

  {

  if (IapReadByte(IAP_ADDRESS+i) != (BYTE)i)

  goto Error;

  }

  P1 = 0xf0;

  while (1);

  Error:

  P1 &= 0x7 f;

  while (1);

  }

  void Delay(BYTE n)

  {

  WORD x; while (n--)

  {

  x = 0;

  while (++x);

  }

  }

  void IapIdle() //退出IAP功能

  {

  IAP_CONTR = 0;

  IAP_CMD = 0;

  IAP_TRIG = 0;

  IAP_ADDRH = 0x80;

  IAP_ADDRL = 0;

  }

  BYTE IapReadByte(WORD addr) //读EEPROM

  {

  BYTE dat;

  IAP_CONTR = ENABLE_IAP;

  IAP_CMD = CMD_READ;

  IAP_ADDRL = addr;

  IAP_ADDRH = addr 》》 8;

  IAP_TRIG = 0x5a;

  IAP_TRIG = 0xa5;

  _nop_();

  dat = IAP_DATA;

  IapIdle();

  return dat;

  }

  void IapWriteByte(WORD addr, BYTE dat) //写EEPROM

  {

  IAP_CONTR = ENABLE_IAP;

  IAP_CMD = CMD_PROGRAM;

  IAP_ADDRL = addr;

  IAP_ADDRH = addr 》》 8;

  IAP_DATA = dat;

  IAP_TRIG = 0x5a;

  IAP_TRIG = 0xa5;

  _nop_();

  IapIdle();

  }

  void IapEraseSector(WORD addr) // 擦除EEPROM扇区

  {

  IAP_CONTR = ENABLE_IAP;

  IAP_CMD = CMD_ERASE;

  IAP_ADDRL = addr;

  IAP_ADDRH = addr 》》 8;

  IAP_TRIG = 0x5a;

  IAP_TRIG = 0xa5;

  _nop_();

  IapIdle();

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分