stc12c5a60s2使用stc eeprom程序和p1有什么关系

'smallimage' => 'images/medal/small/yunliaoxianfeng.png',
还没有帐号? 赶紧
用户版块帖子
STC12C5A60S2自带EEPROM程序
UID:1438539
在线时间101小时
官方文档资料里是汇编程序看不懂,哪位大侠手上有C语言程序,谢谢,卡几天了
UID:1435403
在线时间193小时
M币832专家1
你去stc-isp里找,有的
UID:727104
在线时间248小时
M币3244专家9
/*&&--- STC International Limited ---------------- 一个完整的EEPROM 测试程序,用宏晶的下载板可以直接测试STC12C5AxxAD 系列单片机 EEPROM/IAP 功能测试程序演示STC12C52xxAD 系列单片机 EEPROM/IAP 功能测试程序演示STC11xx 系列单片机 EEPROM/IAP 功能测试程序演示STC10xx 系列单片机 EEPROM/IAP 功能测试程序演示 --- STC International Limited ------------------ --- 宏晶科技&&设计
V1.0 -------------- --- Mobile:
------------------------ --- Fax: 3 ------------------------- --- Tel: 2 ------------------------- --- Web: www. --------------------本演示程序在STC-ISP Ver 3.0A.PCB 的下载编程工具上测试通过,EEPROM 的数据在P1 口上显示, 如果要在程序中使用或在文章中引用该程序,请在程序中或文章中注明使用了宏晶科技的资料及程序*/#include &reg51.H&#include &intrins.H&typedef unsigned char&&INT8U;typedef unsigned int&& INT16U;sfr IAP_DATA&&&&= 0xC2;sfr IAP_ADDRH&& = 0xC3;sfr IAP_ADDRL&& = 0xC4;sfr IAP_CMD&&&& = 0xC5;sfr IAP_TRIG&&&&= 0xC6;sfr IAP_CONTR&& = 0xC7;//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数//#define ENABLE_ISP 0x80 //系统工作时钟&30MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x81 //系统工作时钟&24MHz 时,对IAP_CONTR 寄存器设置此值#define ENABLE_ISP 0x82 //系统工作时钟&20MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x83 //系统工作时钟&12MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x84 //系统工作时钟&6MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x85 //系统工作时钟&3MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x86 //系统工作时钟&2MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x87 //系统工作时钟&1MHz 时,对IAP_CONTR 寄存器设置此值#define DEBUG_DATA&&&&&&&&&&&&&& 0x5A&&//本测试程序最终存储在 EEPROM 单元的数值#define DATA_FLASH_START_ADDRESS 0x00&&//STC5Axx 系列 EEPROM 测试起始地址union union_temp16{&&&&INT16U un_temp16;&&&&INT8U&&un_temp8[2];}my_unTemp16;INT8U Byte_Read(INT16U add);&&&&&&&&&&&&&&//读一字节,调用前需打开IAP 功能void Byte_Program(INT16U add, INT8U ch);&&//字节编程,调用前需打开IAP 功能void Sector_Erase(INT16U add);&&&&&&&&&&&&//擦除扇区void IAP_Disable();&&&&&&&&&&&&&&&&&&&&&& //关闭IAP 功能void Delay();void main (void){&&&&INT16U eeprom_&&&&INT8U&&read_&&&&P1 = 0xF0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&//演示程序开始,让 P1[3:0] 控制的灯亮&&&&Delay();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//延时&&&&P1 = 0x0F;&&&&&&&&&&&&&&&&&&&&&&&&&&&&//演示程序开始,让 P1[7:4] 控制的灯亮&&&&Delay()&&&&;&&&&&&&&&&&&&&&&&&&&&&&&&&//延时&&&&//将EEPROM 测试起始地址单元的内容读出&&&&eeprom_address = DATA_FLASH_START_ADDRESS;&&//将测试起始地址送eeprom_address&&&&read_eeprom = Byte_Read(eeprom_address);&&&&//读EEPROM的值,存到read_eeprom&&&&if (DEBUG_DATA == read_eeprom)&&&&{&& //数据是对的,亮&&P1.7 控制的灯,然后在 P1 口上将 EEPROM 的数据显示出来&&&&&&&&P1 = ~0x80;&&&&&&&&Delay()&&&&;&&&&&&&&&&&&&&&&&&&&&&&&&&&&//延时&&&&&&&&P1 = ~read_&&&&}&&&&else&&&&{&& //数据是错的,亮 P1.3 控制的灯,然后在 P1 口上将 EEPROM 的数据显示出来&&&&&&&&//再将该EEPROM所在的扇区整个擦除,将正确的数据写入后,亮 P1.5 控制的灯&&&&&&&&P1 = ~0x08;&&&&&&&&Delay()&&&&;&&&&&&&&&&&&&&&&&&&&&&&&&&&&//延时&&&&&&&&P1 = ~read_&&&&&&&&Delay()&&&&;&&&&&&&&&&&&&&&&&&&&&&&&&&&&//延时&&&&&&&&Sector_Erase(eeprom_address);&&&&&&&&&& //擦除整个扇区&&&&&&&&Byte_Program(eeprom_address, DEBUG_DATA);//将 DEBUG_DATA 写入 EEPROM&&&&&&&&P1 = ~0x20;&&&&&&&&&&&&&&&& //熄灭 P1.3 控制的灯,亮 P1.5 控制的灯&&&&}&&&&while (1);&&&&&&&&&&&&&&&&&&&&&&//CPU 在此无限循环执行此句}//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节INT8U Byte_Read(INT16U add){&&&&IAP_DATA = 0x00;&&&&IAP_CONTR = ENABLE_ISP;&&&&&&&& //打开IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x01;&&&&&&&&&&&&&&&& //IAP/ISP/EEPROM 字节读命令&&&&my_unTemp16.un_temp16 =&&&&IAP_ADDRH = my_unTemp16.un_temp8[0];&&&&//设置目标单元地址的高8 位地址&&&&IAP_ADDRL = my_unTemp16.un_temp8[1];&&&&//设置目标单元地址的低8 位地址&&&&//EA = 0;&&&&IAP_TRIG = 0x5A;&& //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h 后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&//EA = 1;&&&&IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&&&&&&&&&&&&&&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关&&&&return (IAP_DATA);}//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据void Byte_Program(INT16U add, INT8U ch){&&&&IAP_CONTR = ENABLE_ISP;&&&&&&&& //打开 IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x02;&&&&&&&&&&&&&&&& //IAP/ISP/EEPROM 字节编程命令&&&&my_unTemp16.un_temp16 =&&&&IAP_ADDRH = my_unTemp16.un_temp8[0];&&&&//设置目标单元地址的高8 位地址&&&&IAP_ADDRL = my_unTemp16.un_temp8[1];&&&&//设置目标单元地址的低8 位地址&&&&IAP_DATA =&&&&&&&&&&&&&&&&&&//要编程的数据先送进IAP_DATA 寄存器&&&&//EA = 0;&&&&IAP_TRIG = 0x5A;&& //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h 后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&//EA = 1;&&&&IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&&&&&&&&&&&&&&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}//擦除扇区, 入口:DPTR = 扇区地址void Sector_Erase(INT16U add){&&&&IAP_CONTR = ENABLE_ISP;&&&&&&&& //打开IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x03;&&&&&&&&&&&&&&&& //IAP/ISP/EEPROM 扇区擦除命令&&&&my_unTemp16.un_temp16 =&&&&IAP_ADDRH = my_unTemp16.un_temp8[0];&&&&//设置目标单元地址的高8 位地址&&&&IAP_ADDRL = my_unTemp16.un_temp8[1];&&&&//设置目标单元地址的低8 位地址&&&&//EA = 0;&&&&IAP_TRIG = 0x5A;&& //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h 后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&//EA = 1;&&&&IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&&&&&&&&&&&&&&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}void IAP_Disable(){&&&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关&&&&IAP_CONTR = 0;&&&&&&//关闭IAP 功能&&&&IAP_CMD&& = 0;&&&&&&//清命令寄存器,使命令寄存器无命令,此句可不用&&&&IAP_TRIG&&= 0;&&&&&&//清命令触发寄存器,使命令触发寄存器无触发,此句可不用&&&&IAP_ADDRH = 0;&&&&IAP_ADDRL = 0;}void Delay(){&&&&INT8U&&&&INT16U d=5000;&&&&while (d--)&&&&{&&&&&&&&i=255;&&&&&&&&while (i--);&&&&}}话说官方就有示例代码
UID:1438539
在线时间101小时
回 renpeng009 的帖子
:/*  --- STC International Limited ---------------- 一个完整的EEPROM 测试程序,用宏晶的下载板可以直接测试STC12C5AxxAD 系列单片机 EEPROM/IAP 功能测试程序演示....... ( 20:21) 这个是官方的例子吗?我看到都是汇编例子
UID:727104
在线时间248小时
M币3244专家9
回 xieyang 的帖子
:这个是官方的例子吗?我看到都是汇编例子( 20:36)嬀/color]是官方的,我可懒得写一大堆注释
UID:1438539
在线时间101小时
回 renpeng009 的帖子
:是官方的,我可懒得写一大堆注释 ( 20:45) 例子测试没有问题
UID:805500
在线时间4364小时
M币376专家73
STC手册里有c程序啊,STC的eeprom是模拟的,按照规定的顺序送指令就可以读写
访问内容超出本站范围,不能确定是否安全
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:03-04 16:14,
Gzip enabled&STC12C5A60S2的EEPROM程序测试 - 单片机论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
STC12C5A60S2的EEPROM程序测试
00:13:34  
STC12C5A60S2的EEPROM程序测试希望对新手有帮助
00:11 上传
点击文件名下载附件
下载积分: 积分 -1 分
31.04 KB, 下载次数: 120, 下载积分: 积分 -1 分
11:35:53  
谢谢!!!!!!!!!!!
16:07:21  
{:1:}{:1:}{:1:}{:1:}
16:08:56  
收藏了,回头真好用
助理工程师
16:41:39  
具体做什么用的。能说说吗,我是新手。
09:17:08  
具体做什么用的。能说说吗,我是新手。
也就是STC单片机的内部EEPROM,保存一些掉电需要保存的数据
助理工程师
10:49:59  
谢谢分享,辛苦了。
15:10:42  
haodongxi& && & dsfd
09:45:20  
好东西,谢谢楼主
16:27:55  
谢谢分享,辛苦了。
23:56:33  
好东西,谢谢分享
高级工程师
10:31:57  
13:31:33  
我有这型号的单片机,试试编看
13:32:13  
试试编看,应该不错哦,应该有用
12个问题&&&&&&&&23581个浏览
5个问题&&&&&&&&23423个浏览
12个问题&&&&&&&&2497个浏览
ADAS相比较无人驾驶有望在短期内率先商业化普及,是汽车领域非常重要的产品革新。专家将解答:
1、汽车智能化开发经验和思路
2、ADAS相关技术难点
3、汽车智能化的产业痛点是什么?
每天选一个需要解决的问题,大家一起来帮忙。
授人玫瑰,手有余香
本次讲解答的问题例举:
1、NB-IoT有哪些技术特点和难点?
2、NB-IoT技术对物联网市场将带来什么样的影响。
3、NB-IoT物理层有哪些组成部分?
4、NB-IoT技术如何实现低功耗?
Powered by403 Forbidden
403 ForbiddenSTC12C5A60S2的EEPROM和AD合一程序,能运行,但有毛病,求解_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:129,049贴子:
STC12C5A60S2的EEPROM和AD合一程序,能运行,但有毛病,求解收藏
1.ad初始化2.LED爆闪10次3.P2显示0XF0(有四个灯亮),delayms(1000);
检测EEPROM
地址200的故障代码,if有:P2=0XFE;
delayms(2000);
地址201的EEPROM数据代码(有无)
if有:{P2=0XFC;//B
delayms(2000);
读取最后数据的高低地址值
P2=read_eeprom2_H;
delayms(500);
P2=read_eeprom2_l;
delayms(500);
P2=0XFF;delayms(1000);
}5.P2=0X0F;delayms(1000);6.while1{ ad_temp=ad_beganchange(); 停AD,P2=ad_delayms(500);函数: 转换完毕后,流水灯循环一周,下面开始保存数据函数:取出扇区1的数据放到xdata:table中函数:左移xdata中的table[]所有数组成员左移一位函数:擦除扇区1。。。delayms(1);函数:changed_table写入扇区1;函数:擦除扇区2。。。delayms(1);函数:保存标志位201和202+203; }故障:检测不到有数据的标志码!故障检测码也没有(这个正常因为我没赋值,原计划在中断中赋值,现在没写) /*下面是程序*//*
--- STC International Limited ---------------- 一个完整的EEPROM 测试程序,用宏晶的下载板可以直接测试STC12C5AxxAD 系列单片机 EEPROM/IAP 功能测试程序演示STC12C52xxAD 系列单片机 EEPROM/IAP 功能测试程序演示STC11xx 系列单片机 EEPROM/IAP 功能测试程序演示STC10xx 系列单片机 EEPROM/IAP 功能测试程序演示 --- STC International Limited ------------------ --- 宏晶科技
V1.0 -------------- --- Mobile:
------------------------ --- Fax: 3 ------------------------- --- Tel: 2 ------------------------- --- Web:
--------------------本演示程序在STC-ISP Ver 3.0A.PCB 的下载编程工具上测试通过,EEPROM 的数据在P1 口上显示, 如果要在程序中使用或在文章中引用该程序,请在程序中或文章中注明使用了宏晶科技的资料及程序*/#include &stc12c5a60s2.H&#include &intrins.H&typedef typedefuchar xdata
table[512];//用于取EEPROM中的数据临时存放。且第一扇区空间为512字节大小!//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数//#define ENABLE_ISP 0x80 //系统工作时钟&30MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x81 //系统工作时钟&24MHz 时,对IAP_CONTR 寄存器设置此值#define ENABLE_ISP 0x82 //系统工作时钟&20MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x83 //系统工作时钟&12MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x84 //系统工作时钟&6MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x85 //系统工作时钟&3MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x86 //系统工作时钟&2MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x87 //系统工作时钟&1MHz 时,对IAP_CONTR 寄存器设置此值//#define DEBUG_DATA
//本测试程序最终存储在 EEPROM 单元的数值//#define DATA_FLASH_START_ADDRESS 0x00
//STC5Axx 系列 EEPROM 测试起始地址union union_temp16{
uint un_temp16;
un_temp8[2];}my_unTemp16;uchar a,read_eeprom2_0,eeprom_flag,read_eeprom2_H,read_eeprom2_l,ad_uint read_eeprom2_add,i;uchar Byte_Read(uint add);
//读一字节,调用前需打开IAP 功能void Byte_Program(uint add, uchar ch);
//字节编程,调用前需打开IAP 功能void Sector_Erase(uint add);
//擦除扇区void IAP_Disable();
//关闭IAP 功能void delayms(uint a);void ad_init();void ad_poweron();void ad_start();void ad_stop();void ad_flagclr();uchar ad_flag();void ad_speed();uchar ad_beganchange();void led_init();void eeprom_and_200_flag();void copy_eepromtable_xdata();void table_xdata_move1bit();void write_changed_table();void mark_add_flag();void spring_water();//简单流水灯函数void main (){
//uint eeprom_
read_ ad_init(); led_init();//全部LED爆闪10次 P2=0XF0;delayms(1000); eeprom_and_200_flag();/*检查扇区2的200和201是否有标志位为1的情况,两个if语句! 无标志位则在记录200和201地址数据后,跳过两个if语句,之后回到主函数继续 下面任务*/
P2=0X0F;delayms(1000);//目的:测试上面函数执行时间长短--下面延时100s!找原因! while(1)/*这个while程序载入很慢!大约72s(误差在2秒内!) 但是载入完毕后运行完全OK!完美!注:保存数据速度极快!几乎没时间,主要时间 是延时函数*/ {
ad_temp=ad_beganchange();delayms(1);ad_flagclr();delayms(1);ad_stop();delayms(1);
P2=ad_delayms(500);
//while(1);spring_water();//转换完毕后,流水灯循环一周,下面开始保存数据
//下面取出扇区1的数据放到xdata:table中(地址00至read_eeprom2_add的数据)
copy_eepromtable_xdata();
table_xdata_move1bit();//左移xdata中的table[]所有数组成员左移一位
Sector_Erase(0x00);//擦除扇区1
delayms(1);
write_changed_table();//changed_table写入扇区1;
//下面是read_eeprom2_add及eeprom_flag置一;
Sector_Erase(0x200);//擦除扇区2
delayms(1);
mark_add_flag();//保存标志位
//while(1){P2=~P2;delayms(10000);};
//CPU 在此无限循环执行此句}//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节uchar Byte_Read(uint add){
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP;
//打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x01;
//IAP/ISP/EEPROM 字节读命令
my_unTemp16.un_temp16 =
IAP_ADDRH = my_unTemp16.un_temp8[0];
//设置目标单元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1];
//设置目标单元地址的低8 位地址
IAP_TRIG = 0x5A;
//先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xA5;
//送完A5h 后,ISP/IAP 命令立即被触发起动
IAP_Disable();
//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
return (IAP_DATA);}//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据void Byte_Program(uint add, uchar ch){
IAP_CONTR = ENABLE_ISP;
//打开 IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x02;
//IAP/ISP/EEPROM 字节编程命令
my_unTemp16.un_temp16 =
IAP_ADDRH = my_unTemp16.un_temp8[0];
//设置目标单元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1];
//设置目标单元地址的低8 位地址
IAP_DATA =
//要编程的数据先送进IAP_DATA 寄存器
IAP_TRIG = 0x5A;
//先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xA5;
//送完A5h 后,ISP/IAP 命令立即被触发起动
IAP_Disable();
//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}//擦除扇区, 入口:DPTR = 扇区地址void Sector_Erase(uint add){
IAP_CONTR = ENABLE_ISP;
//打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x03;
//IAP/ISP/EEPROM 扇区擦除命令
my_unTemp16.un_temp16 =
IAP_ADDRH = my_unTemp16.un_temp8[0];
//设置目标单元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1];
//设置目标单元地址的低8 位地址
IAP_TRIG = 0x5A;
//先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xA5;
//送完A5h 后,ISP/IAP 命令立即被触发起动
IAP_Disable();
//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}void IAP_Disable(){
//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
IAP_CONTR = 0;
//关闭IAP 功能
//清命令寄存器,使命令寄存器无命令,此句可不用
//清命令触发寄存器,使命令触发寄存器无触发,此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;}void delayms(uint a){ while( --a != 0){
for(x = 0; x & 600; x++); }}void spring_water()//全部左移再右移再关闭{ P2=0XFE;delayms(25); P2=0XFd;delayms(25); P2=0XFb;delayms(25);// P2=0XF7;delayms(25);// P2=0Xdelayms(25);// P2=0Xdelayms(25);// P2=0Xdelayms(25);// P2=0X7f;delayms(25);// ////////////// P2=0X7f;delayms(25); P2=0Xdelayms(25); P2=0Xdelayms(25); P2=0Xdelayms(25); P2=0XF7;delayms(25); P2=0XFb;delayms(25); P2=0XFd;delayms(25); P2=0XFE;delayms(25); P2=0XFf;}void mark_add_flag(){
Byte_Program(0x);//201:表示扇区1有数据
read_eeprom2_H=(uchar)((read_eeprom2_add&0xff00)&&8);
read_eeprom2_l=(uchar)(read_eeprom2_add&0xff);
Byte_Program(0x202,read_eeprom2_H);/*202,203一起保存最后的AD数据在
扇区1的地址值*/
Byte_Program(0x203,read_eeprom2_l);/*202,203一起保存最后的AD数据在
扇区1的地址值*/ }void write_changed_table(){ for(i=0;i&read_eeprom2_add+1;i++)//注:read_eeprom2_add地址正对最后一个AD转换值,始终都是
Byte_Program(i, table[i]);
}//xdata数组全部存入EEPROM扇区1}void table_xdata_move1bit(){
if(read_eeprom2_add==0x1ff)
for(i=0;i&0x1i++)
table[i]=table[i+1];
} //xdata中数组元素全部左移一位,腾出最后的1ff位置放置新数据
table[0x1ff]=ad_
} //新数存入xdata中
read_eeprom2_add++;
table[read_eeprom2_add]=ad_//ad数据保存入xdata的数组中
//数组个数加一
}//地址++,保存新数据到xdata,}void copy_eepromtable_xdata(){
for(i=0;i&=read_eeprom2_i++)//保存入数组uchar xdata
table[512];
table[i]=Byte_Read(i);
}}void led_init(){ P2 = 0x00;
delayms(500);
P2 = 0xFF;
delayms(500); for(i=0;i&10;i++){P2=~P2;delayms(50);} P2=0
delayms(100);//开机LED全亮,延时0.5s;全灭,延时0.5s;闪烁后灭;延时0.1s}void ad_poweron() {ADC_CONTR|=0X80; delayms(1); }void ad_start(){ADC_CONTR|=0X08;}void ad_stop(){ADC_CONTR&=0XF7; /////////////////////重要!////////////////////////***/////delayms(1);}void ad_flagclr(){ADC_CONTR&=0XEF;//ad_flag2=0;//temp=0;ADC_RES=0;}uchar ad_flag(){uchar ad_flag2;ad_flag2=ADC_CONTR&0X10;return ad_flag2;}void ad_speed(){ADC_CONTR|=0X60;}//1100000最快void ad_channel(){ADC_CONTR&=0xf8;}//.0;确认!void ad_init(){
read_eeprom2_0=0;
EA=1; //ES=0; //temp=0; P1ASF=0X01;//P1.0为模拟口 EADC=1; ad_poweron(); delayms(1); ad_speed();//最快。1。1 delayms(1); ad_channel();
delayms(1); }uchar ad_beganchange() {
uchar temp=0; ad_flagclr(); delayms(1); ad_start(); delayms(3); ad_flag();//不能去掉,配合下面循环体 while(ad_flag()!=0x10);
delayms(1); temp=ADC_RES; ADC_RES=0x00; delayms(1); return (temp); }void eeprom_and_200_flag()/*检查扇区2的200和201是否有标志位为1的情况,并用LED显示,两个if语句!无标志位则无操作!*/{
//扇区2:200(Sector_two):故障代码:1;201:扇区1有数据:1;202+203:最后记录的数据地址; read_eeprom2_0=Byte_Read(200);//读取2扇区首地址数据:查询故障代码(1故障,0正常) delayms(1); delayms(100); eeprom_flag=Byte_Read(201);//读取2扇区201地址数据:eeprom是否有数据的标志位(1有,0无) delayms(1);
if(read_eeprom2_0==0x01) {
P2=0XFE;delayms(2000);//B }/*如果有故障代码,P1口闪烁,无限循环 且等待外部INT0输入继续命令!(将read_eeprom2_0置0,且将0x00保存入EEPROM.200地址中)*/
if(eeprom_flag==0x01)
P2=0XFC;//B
delayms(2000);
//uint i2;
read_eeprom2_H=Byte_Read(202);//202、203地址的数据应合一为一个地址 (16位地址数据)
delayms(1);
read_eeprom2_l=Byte_Read(203);
delayms(1);
P2=read_eeprom2_H;
delayms(500);
P2=read_eeprom2_l;
delayms(500);
P2=0XFF;delayms(1000);
read_eeprom2_add=(uint)read_eeprom2_l;
read_eeprom2_add&=(((uint)read_eeprom2_H)&&8);//合成完毕!此地址为上次最后记录数据的地址
/*P2=read_eeprom2_H;//取出最后保存的数据p1口显示出来
delayms(500);
P2=read_eeprom2_l;//取出最后保存的数据p1口显示出来
delayms(500);下面的循环代替这个功能了*/
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 stc eeprom程序 的文章

 

随机推荐