打印

51的掉电保护程序

[复制链接]
5499|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yushiqian2012|  楼主 | 2012-6-24 19:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前几天写一个程序,想为90C52实现掉电保护的功能,查了一下它的datasheet,发现有5k的EEPROM,也就是不用加硬件也可以实现掉电保护的功能,我大喜过望,并且我惊喜的发现在它的手册上有EEPROM的例程,唯一美中不足的是,文本不可复制,pdf文档加密了,所以我就一个一个的打了上去,然后跟朋友一起调试,最后果真实现了掉电保护的功能。下面贴出部分代码

相关帖子

沙发
yushiqian2012|  楼主 | 2012-6-24 19:23 | 只看该作者

全部的驱动

(下面的还有的引用了网上一哥们的一些代码)
//-----------------------------------------------------------------------------
void EEPROM_Init()
{
        temp.add=0x2001;    //把EEPROM变量的地址现在这里定义好
        temp.dat=Byte_Read(temp.add);
}//-----------------------------------------------------------------------------
//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
INT8U Byte_Read(INT16U add)
{
    IAP_DATA = 0x00;
    IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字节读命令

    IAP_ADDRH = (INT8U)(add>>8);    //设置目标单元地址的高8 位地址
    IAP_ADDRL = (INT8U)(add&0xff);    //设置目标单元地址的低8 位地址

    EA = 0;
    IAP_TRIG = 0x46;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xB9;   //送完 B9h 后,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 字节编程命令


    IAP_ADDRH = (INT8U)(add>>8);    //设置目标单元地址的高8 位地址
    IAP_ADDRL = (INT8U)(add&0xff);    //设置目标单元地址的低8 位地址

    IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
    EA = 0;
    IAP_TRIG = 0x46;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xB9;   //送完 B9h 后,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 扇区擦除命令

    IAP_ADDRH = (INT8U)(add>>8);    //设置目标单元地址的高8 位地址
    IAP_ADDRL = (INT8U)(add&0xff);    //设置目标单元地址的低8 位地址

    EA = 0;
    IAP_TRIG = 0x46;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xB9;   //送完 B9h 后,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 delayms(INT16U z)
{
        INT16U x,y;
        for(x=z;x>0;x--)
           for(y=125;y>0;y--);
}

void clearram(void)
{
        for(Rx=0;Rx<RxIn;Rx++)
    {                                                           //清缓存
        SystemBuf[Rx]=0x00;   
    }
    Rx=0;
}

使用特权

评论回复
板凳
gomelong| | 2012-6-25 07:33 | 只看该作者
学习了。谢谢

使用特权

评论回复
地板
coody| | 2012-6-25 11:24 | 只看该作者
STC官网的技术支持有完成的工程源码。

使用特权

评论回复
5
yushiqian2012|  楼主 | 2012-6-25 17:28 | 只看该作者
4# coody 恩,我基本上也算是参考这个了,呵呵

使用特权

评论回复
6
NE5532| | 2012-6-25 18:33 | 只看该作者
前几天写一个程序,想为90C52实现掉电保护的功能,查了一下它的datasheet,发现有5k的EEPROM,也就是不用加硬件也可以实现掉电保护的功能,我大喜过望,并且我惊喜的发现在它的手册上有EEPROM的例程,唯一美中不足的 ...
yushiqian2012 发表于 2012-6-24 19:21


不用硬件实现掉电保护?楼主,除了铁电和NVRAM之类可以实时操作的,你做个方案出来我看看呢?

使用特权

评论回复
7
wukunshan| | 2012-6-25 21:41 | 只看该作者
楼上的疑问也就是我的疑问,软件实现掉电保护行得通吗?电都没了程序还能运行?而且那么多的代码,执行起来不花时间?

使用特权

评论回复
8
bxf03621| | 2012-6-26 10:37 | 只看该作者
学习中

使用特权

评论回复
9
NowCan| | 2012-6-26 12:40 | 只看该作者
STC应该是使用低电压检测中断做的吧?
有个大电容的话,电压下降不太快还行。
没做过,纯属猜测。

使用特权

评论回复
10
yushiqian2012|  楼主 | 2012-6-27 13:37 | 只看该作者
6# NE5532 哦,或许是我的表述有问题吧,我的意思是掉电保护,也就是说我现在想让P2口保存状态,如果掉电了,再重新上电的话,除了刚复位时的高电平,然后就可以记起掉电前的状态了。不知道这算不算,嘿嘿

使用特权

评论回复
11
NE5532| | 2012-6-28 18:37 | 只看该作者
6# NE5532 哦,或许是我的表述有问题吧,我的意思是掉电保护,也就是说我现在想让P2口保存状态,如果掉电了,再重新上电的话,除了刚复位时的高电平,然后就可以记起掉电前的状态了。不知道这算不算,嘿嘿 ...
yushiqian2012 发表于 2012-6-27 13:37


算,但是你除非每次操作P2以前先在E2备份,否则你做不到,而且如果你P2口操作频繁,E2很快就报废了。

使用特权

评论回复
12
wukunshan| | 2012-6-28 23:48 | 只看该作者
处理不好,程序还可能跑飞了。:)

使用特权

评论回复
13
yushiqian2012|  楼主 | 2012-6-29 14:26 | 只看该作者
11# NE5532 恩,对的,我突然明白了。那您可不可以给我点意见啊。。。

使用特权

评论回复
14
sinonion| | 2012-6-29 15:31 | 只看该作者
掉电保护,确实需要学习学习!
现在学的也就是省电模式,IDLE,POWER-DOWN等!
建议楼主对你的掉电保护(临终遗言)的实现做个总结吧!

使用特权

评论回复
15
NE5532| | 2012-6-29 19:36 | 只看该作者
本帖最后由 NE5532 于 2012-6-29 20:06 编辑
11# NE5532 恩,对的,我突然明白了。那您可不可以给我点意见啊。。。
yushiqian2012 发表于 2012-6-29 14:26


建议就是你先想清楚为什么要保护,要保护什么,怎么保护,不要头脑发热,做出一个连自己都不知道是怎么回事的方案

使用特权

评论回复
16
dqyubsh| | 2012-6-29 20:02 | 只看该作者
玩命写EEEPROM,显然是不正确的方法,早晚要写坏的。还是上个硬件电路,掉电检测触发中断,然后靠电容放电的时间将关键数据(可能只有2~4个字节)写入E2。

使用特权

评论回复
17
wrlsohu| | 2012-10-3 08:19 | 只看该作者
学习了。谢谢!!

使用特权

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

本版积分规则

个人签名:不需要别人来证明自己,自己的态度更重要

45

主题

354

帖子

0

粉丝