打印
[国产单片机]

关于EEPROM的实际应用问题

[复制链接]
1965|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
manmanni80|  楼主 | 2011-5-18 14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TX-1C实验板上实现如下描述,操作STC单片机自带的EEPROM,存储一组按秒递增的二位数据,并且将数据实时显示在数码管上,数据每变化一次就往EEPROM中写入一次,当关闭实验板电源,再次开启电源时,从EEPROM中读取先前存储的数据,接着递增显示。
新建文件part3.4.4.c,程序代码如下:
#include
#include       //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
#define RdCommand 0x01 //定义ISP的操作命令
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01 //定义CPU的等待时间
sfr ISP_DATA=0xe2;  //寄存器申明
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sbit dula=P2^6;  //申明U1锁存器的锁存端
sbit wela=P2^7;  //申明U2锁存器的锁存端
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar num;
void delayms(uint xms)   
{
uint i,j;
for(i=xms;i>0;i--)        //i=xms即延时约xms毫秒
  for(j=110;j>0;j--);
}
void display(uchar shi,uchar ge)  //显示子函数
{
    dula=1;
P0=table[shi];    //送十位段选数据
dula=0;
P0=0xff;  //送位选数据前关闭所有显示,防止打开位选锁存时
wela=1;  //原来段选数据通过位选锁存器造成混乱
P0=0xfe;  //送位选数据
wela=0;
delayms(5); //延时
dula=1;
P0=table[ge];  //送个位段选数据
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
/* ================ 打开 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void)
{
EA = 0;       /* 关中断   */
ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
}
/* =============== 关闭 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
ISP_TRIG = 0x00;
EA   =   1;   /* 开中断 */
}
/* ================ 公用的触发代码 ==================== */
void ISPgoon(void)
{
ISP_IAP_enable();   /* 打开 ISP,IAP 功能 */
ISP_TRIG = 0x46;  /* 触发ISP_IAP命令字节1 */
ISP_TRIG = 0xb9;  /* 触发ISP_IAP命令字节2 */
_nop_();
}
/* ==================== 字节读 ======================== */
unsigned char byte_read(unsigned int byte_addr)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD   = ISP_CMD & 0xf8;   /* 清除低3位  */
ISP_CMD   = ISP_CMD | RdCommand; /* 写入读命令 */
ISPgoon();       /* 触发执行  */
ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
return (ISP_DATA);    /* 返回读到的数据 */
}
/* ================== 扇区擦除 ======================== */
void SectorErase(unsigned int sector_addr)
{
unsigned int iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
ISPgoon();       /* 触发执行  */
ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
}
/* ==================== 字节写 ======================== */
void byte_write(unsigned int byte_addr, unsigned char original_data)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取地址  */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 */
ISP_CMD  = ISP_CMD | PrgCommand;  /* 写命令2 */
ISP_DATA = original_data;   /* 写入数据准备 */
ISPgoon();       /* 触发执行  */
ISP_IAP_disable();     /* 关闭IAP功能 */
}
void main()
{
uchar a,b,num1;
TMOD=0x01; //设置定时器0为工作方式1(0000 0001)
TH0=(65536-50000)/256;     
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
num1=byte_read(0x2000);//程序开始时读取EEPROM中数据
if(num1>=60) //防止首次上电时读取出错
  num1=0;
while(1)
{
  if(num>=20)
  {
   num=0;
   num1++;
   SectorErase(0x2000);//擦除扇区
   byte_write(0x2000,num1);//重新写入数据
   if(num1==60)
   {
    num1=0;
   }
   a=num1/10;
   b=num1%10;
  }
  display(a,b);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
}
file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/Users/286951215/QQ/WinTemp/RichOle/Y}{3V7LZ20_YO~FEC%0`SST.jpg
请教各位大侠,以上程序是不是MAIN函数属于程序文件里,而关于ISP-IAP的读写和擦除
属于EEPROM文件里?

相关帖子

沙发
hificwc| | 2011-7-27 14:14 | 只看该作者
以上代码都是在ROM中,ISP-IAP的读写和擦除的在EEPROM中的

使用特权

评论回复
板凳
autopccopy| | 2011-7-27 16:07 | 只看该作者
这种是所有函数(模块)放在一个主程序文件中的结构,一般小型程序这样比较方便。有些程序写法可将ISP-IAP的读写和擦除单独写在一个文件(例如EEPROM.C, EEPROM.H),然后在主程序中调用,在大型项目中比较适合共享调用和维护。:)


(136)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

87

帖子

0

粉丝