你好,我看了你的关于STC12C5A60S2 的EEPROM的程序,我还是找不到问题在哪,请指教,谢谢!!!分全给你

如题所述

第1个回答  2011-08-19
针对STC12xx整个系列EEOPROM操作的一个头文件,
含有读、写、擦除3个函数共用户调用,使用方便,
比如: 写函数(n,x,dat),在第n扇区,第x字节,写入数据dat。

/************** STC12系列EEOPROM调用函数头文件 ****************
【 注意 】
①根据系统工作时钟,请选择相应的EN_IAP宏定义。
②EEOPROM操作时需要关中断。

【 注明】
STC12C5410 有12K EEOPROM,所以(1 ≤ n ≤ 24)( 1 ≤ x ≤ 512 )
STC12C4052 有10K EEOPROM,所以(1 ≤ n ≤ 20)( 1 ≤ x ≤ 512 )
……其它型号省略
***************************************************************/
#ifndef __STC12_EROM_H__
#define __STC12_EROM_H__

#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//以下是ISP/IAP操作时间宏定义选项
//#define EN_IAP 0x80 //系统时钟 ≤ 30MHz
//#define EN_IAP 0x81 //系统时钟 ≤ 24MHz
//#define EN_IAP 0x82 //系统时钟 ≤ 20MHz
#define EN_IAP 0x83 //系统时钟 ≤ 12MHz
//#define EN_IAP 0x84 //系统时钟 ≤ 6MHz
//#define EN_IAP 0x85 //系统时钟 ≤ 3MHz
//#define EN_IAP 0x86 //系统时钟 ≤ 2MHz
//#define EN_IAP 0x87 //系统时钟 ≤ 1MHz

/****************【供用户调用的3个函数】****************/

uchar R_EROM(uchar n,uint x); //读第n扇区,第x字节的数据
void W_EROM(uchar n,uint x,uchar dat); //向第n扇区,第x字节写入数据dat
void C_EROM(uchar n); //擦除第n扇区

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:禁止IAP操作,清IAP相关寄存器
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Q0()
{
IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG = 0;
IAP_ADDRH = 0x80;
IAP_ADDRL = 0;
}

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:读一字节
入口:第n扇区,第x字节
出口:dat
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
uchar R_EROM(uchar n,uint x)
{
uchar dat;
uint addr;
addr = (n-1)*0x0200 + x-1;
IAP_CONTR = EN_IAP;
IAP_CMD = 1; //允许读取EEPROM
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x46;
IAP_TRIG = 0xB9;
_nop_();
dat = IAP_DATA;
Q0();
return dat;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:写一字节
入口:第n扇区,第x字节,待写入数据dat
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void W_EROM(uchar n,uint x,uchar dat)
{
uint addr;
addr = (n-1)*0x0200 + x-1;
IAP_CONTR = EN_IAP;
IAP_CMD = 2; //允许编写EEPROM
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_DATA = dat;
IAP_TRIG = 0x46;
IAP_TRIG = 0xB9;
_nop_();
Q0();
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:擦除某一扇区
入口:第n扇区
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void C_EROM(uchar n)
{
uint addr;
addr = (n-1)*0x0200;
IAP_CONTR = EN_IAP;
IAP_CMD = 3; //允许擦除EEPROM
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x46;
IAP_TRIG = 0xB9;
_nop_();
Q0();
}

#endif

stc12c5a60s2单片机EEPROM的问题
我的eeprom是提供给用户的,允许用户通过串口连续写入16k字节的。我有遇到写入出错的情况,但是增加延时就解决了。你试试增加几个延时指令,应该就解决了。

stc12c5a60s2单片机烧不进程序 为什么?
如果占用了串口,或者配置有问题,也会有这个问题:把P1.0 \\P1.1 都接0看看

我在写一个stc12c5a60s2的A\/D转换程序,其中高8位结果放在ADC_RES寄存器...
这就要看你设置的AUXR1值是多少了。可以这样,首先定义一个16位无符号整型ADC_RESULT 如果AUXR1=0则 ADC_RESULT=ADC_RES;先将结果高字节放入ADC_RESULT=ADC_RESULT<<2;然后左移2位ADC_RESL=ADC_RESL&0x03;确保无用位为0ADC_RESULT=ADC_RESULT | ADC_RESL;最后组合起来称为16位二进制数如果AUXR...

STC12C5A60S2单片机无法烧写程序
排除了这个问题,我估计有可能是U转串线坏了或是电脑的U口坏了,我遇到过一回这种情况最后是因为U口坏了。你可以这样,有台式机的话,找机箱后面的串口,然后取三个杜邦线(导线就行)。2连3(电脑后面的串口上标有数字1~9但很小,然后电脑上的2连单片机上的3),3连2,5连GND,下载时COM1...

STC12C5A60S2 内置EEPROM测试
在最近的设计工作中,我采用了STC12C5A60S2单片机,其内置的1k闪存被用作EEPROM。这款单片机的手册查阅起来相对直观,我在实践中编写了一个小程序,通过串口进行EEPROM的测试,尽管功能基本实现,但仍可能存在一些未解决的问题,程序没有包含电源状态检查。本文的主要目的是分享这个测试程序,作为参考资源,...

stc12c5a60s2烧录程序不进去什么 求大神
具体现象是什么?这STC单片机烧录程序需要用串口线,现在都是用USB转串口线,或USB转TTL模块。在电脑上要安装驱动程序,还要下载STC的专用烧录软件STC-ISP。这些,你都做了哪些。

STC12C5A60S2单片机的串口中断问题求助
还是那个中断优先级寄存器没有设置好,至少要设置IP,IP2寄存器,将两个串口设置成高优先级,而将定时器0设置成低优先级。另外,STC12C5A60S2串口的波特率可以设置得很高的,尽量用高波特发送,可以减少发送时间,完全可以设置成38400的,甚至57600,都没有问题的。

stc12c5a60s2的芯片做了一个程序,主要用到两个串口和两个定时器,c编写...
引起程序跑飞的因素主要有三个:其一是软件错误,比如汇编语言编程使用了直接地址跳转(没有使用标号),而地址输入或计算错误,产生错误跳转(目标地址落入数据区或者不在指令起始位置),或者操作堆栈不匹配等。这在C语言中不容易出现。其二是编译器错误,即编译器有BUG,这个我遇到过(汇编语言)。也是小...

关于STC12C5A60S2 AD测量的问题 都快疯了!
分析:单片机P1.0口的高电平是依靠P1 “短路”到地来实现低电平的。结论:首先是R7、R8太大。其次,如果频率高的话,特别是低电平占空小的话,C3就太大也会这样。最后是358的“吸入”电流太小,原因是电路设计不良。

关于stc12c5a60s2的烧录问题,请大家帮帮忙。
你可以测试一下,1.电源和地的电压,如果烧坏就下载不进去了!2.看看下载口是不是接反了啊 如果不是就可能是买的时候就坏了,希望你成功

相似回答