历史上的今天
返回首页

历史上的今天

今天是:2025年07月13日(星期日)

正在发生

2020年07月13日 | STC单片机内部EEPROM的使用-记录上电次数

2020-07-13 来源:51hei

大多数情况下,大家存储掉电的数据都是用的24C02,在一些需要考虑成本的场合,内部的EEPROM也是可以考虑使用的,这个程序介绍一下,STC内部的EEPROM的使用,程序的功能是记录上电次数,然后加1,在数码管上显示出来。


/*******************************************************************************

* 文件名: 数码管显示上电计数值

* 描  述: 上电计数

* 功  能:数码管的使用  11.0592MHZ

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

#include "stc15w.h"//头文件

#include "intrins.h"


/*******************************************************************************

* 文件名: 重定义

* 描  述:   

* 功  能:

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

typedef unsigned char uint8;

typedef unsigned int  uint16;

typedef unsigned long uint32;


/*******************************************************************************

* 文件名:共阳数码管真值表

* 描  述:

* 功  能:

* 作  者:大核桃

* 版本号:1.0.1(2015.03.03)

*******************************************************************************/

code uint8 LedChar[] = {

        0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e

};


uint16 counter;


/*******************************************************************************

* 文件名:单独位定义

* 描  述:   

* 功  能:

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

sbit LED0 = P1^0;//第1组LED

sbit LED1 = P1^1;//第2组LED

sbit LED2 = P1^2;//第3组LED                                 

sbit LED3 = P1^3;//第4组LED

sbit LED4 = P1^4;//第5组LED

sbit LED5 = P3^2;//第6组LED

sbit LED6 = P0^0;//第7组LED

sbit LED7 = P0^1;//第8组LED


sbit LEDS1 = P3^3;//数码管1

sbit LEDS2 = P3^4;//数码管2

sbit LEDS3 = P3^6;//数码管3

sbit LEDS4 = P3^7;//数码管4

/*******************************************************************************

* 文件名:全局变量定义区域

* 描  述:

* 功  能:

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

#define CMD_IDLE    0               //空闲模式

#define CMD_READ    1               //IAP字节读命令

#define CMD_PROGRAM 2               //IAP字节编程命令

#define CMD_ERASE   3               //IAP扇区擦除命令


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

/*******************************************************************************

* 文件名:函数前置声明

* 描  述:   

* 功  能:

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

void Mcu_Port_Init();

void LedScan();

void Delay500ms(); //24MHZ

void Time0_Init();//定时器0

void IapIdle();

uint8 IapReadByte(uint16 addr);

void IapProgramByte(uint16 addr, uint8 dat);

void IapEraseSector(uint16 addr);

#define Delay()                {_nop_();_nop_();_nop_();_nop_();}

/*******************************************************************************

* 文件名

* 描  述: 主函数  

* 功  能:入口

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

void main(void)

{                                       

        counter = IapReadByte(0x0000);//读取数据

        counter++;//写

        Mcu_Port_Init();//IO上电初始化

        Time0_Init();

        IapEraseSector(0x0000);//擦除数据

        IapProgramByte(0x0000, counter);//写入数据

        LED0 = 0;//第1组LED,如果使能请置为1

        LED1 = 0;

        LED2 = 0;

        LED3 = 0;

        LED4 = 0;

        LED5 = 0;

        LED6 = 0;

        LED7 = 0;


        while(1);

}


/*******************************************************************************

* 文件名:void LedScan()

* 描  述: LED刷新

* 功  能:

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

void LedScan()

{

        static uint8 i = 0;


        P2 = 0Xff;

        switch(i)

        {

                case 0: LEDS4 = 0;LEDS1 = 1;P2 = LedChar[counter / 1000 % 10];i++;break;

                case 1: LEDS1 = 0;LEDS2 = 1;P2 = LedChar[counter / 100 % 10];i++;break;

                case 2: LEDS2 = 0;LEDS3 = 1;P2 = LedChar[counter / 10 % 10];i++;break;

                case 3: LEDS3 = 0;LEDS4 = 1;P2 = LedChar[counter % 10];i = 0;break;


                default:break;

        }

}


/*******************************************************************************

* 文件名:void Time0_Init()

* 描  述: 定时器0初始化

* 功  能:1毫秒@11.0592MHz 1T

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

void Time0_Init(void)

{

        AUXR |= 0x80;                //定时器时钟1T模式

        TMOD &= 0xF0;                //设置定时器模式

        TL0 = 0xCD;                    //设置定时初值

        TH0 = 0xD4;                    //设置定时初值

        ET0 = 1;

        TR0 = 1;                    //定时器0开始计时

        EA = 1;               

}


/*******************************************************************************

* 文件名:

* 描  述: 中断函数

* 功  能:1毫秒@11.0592MHz

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

void ET0_IRQHandler() interrupt 1

{

        LedScan();               

}


/*******************************************************************************

* 文件名:void Mcu_Port_Init()

* 描  述: io初始化

* 功  能:

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

void Mcu_Port_Init()

{

        //将P0口低二位配置为推挽输出

        //234567位配置位高阻输入

        P0M1 = 0xFC;//1111 1100

        P0M0 = 0X03;//0000 0011

        //P0 = 0X01;//第6个

        //P0 = 0X02;//第7个

        //高3位配置高阻输入,用作模拟口

        //其他配置推挽输出,驱动LED

        P1M1 = 0xE0;//1110 0000

        P1M0 = 0X1F;//0001 1111

        //P2口配置准双向口

        P2M1 = 0X00;

        P2M0 = 0X00;

        P2 = 0Xff; //上电为1111 1111


//        //P54,P55口为推挽输出

        P5M1 = 0X00;

        P5M0 = 0X00;

        P5 = 0xFF;


        //P37,P36,3.2,P3.3 P3.4口为推挽输出

        P3M1 = 0X00;

        P3M0 = 0XFC;

        P3 = 0X23; //0010 0111//第5个LED端口        

}


/*******************************************************************************

* 文件名:void Delay500ms()                //@24.000MHz

* 描  述:Y5内核延时

* 功  能:

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

void Delay500ms()                //@24.000MHz

{

        unsigned char i, j, k;


        _nop_();

        _nop_();

        i = 46;

        j = 153;

        k = 245;

        do

        {

                do

                {

                        while (--k);

                } while (--j);

        } while (--i);

}


/*******************************************************************************

* 文件名:void IapIdle()

* 描  述:关闭IAP

* 功  能:

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

void IapIdle()

{

    IAP_CONTR = 0;                  //关闭IAP功能

    IAP_CMD = 0;                    //清除命令寄存器

    IAP_TRIG = 0;                   //清除触发寄存器

    IAP_ADDRH = 0x80;               //将地址设置到非IAP区域

    IAP_ADDRL = 0;

}

/*******************************************************************************

* 文件名:uint8 IapReadByte(uint16 addr)

* 描  述:从ISP/IAP/EEPROM区域读取一字节

* 功  能:

* 作  者:大核桃

* 版本号:1.0.1(2017.05.23)

*******************************************************************************/

uint8 IapReadByte(uint16 addr)

{

    uint8 dat;                       //数据缓冲区

推荐阅读

史海拾趣

A1 PROS公司的发展小趣事

在2000年,A1 PROS在韩国正式成立,初创期的它,主要专注于黑白CCD芯片的研发与生产。当时,随着数字技术的兴起,电子摄像头逐渐普及,市场对高质量的图像传感器需求日益增长。A1 PROS凭借其核心团队在半导体技术方面的深厚积累,成功研发出多款性能优越的黑白CCD芯片,并很快在市场上占据了一席之地。

为了拓展业务,A1 PROS积极寻求合作伙伴。2003年,它与台湾的昱生电子有限公司建立了合作关系,后者成为A1 PROS在台湾地区的主要经销商。这一合作不仅帮助A1 PROS打开了台湾市场,也为后续进军更广阔的亚洲市场奠定了基础。

Gustav Klauke GmbH公司的发展小趣事

在竞争激烈的电子行业中,A1 PROS始终保持对技术创新的追求。公司不断投入研发资金,引进先进的生产设备和技术人才,致力于开发更高性能、更环保、更节能的产品。同时,A1 PROS还积极关注行业动态和市场需求变化,不断调整和优化产品结构和市场策略。正是凭借这种持续创新的精神和对市场变化的敏锐洞察,A1 PROS得以在电子行业中保持领先地位,并引领着行业的发展方向。

以上便是关于A1 PROS公司在电子行业里发展起来的五个故事。这些故事展示了A1 PROS从初创期的黑白CCD业务起步,到成功研发彩色CCD传感器、获得技术认可、拓展国际市场以及持续创新引领行业发展的全过程。虽然这些故事是基于虚构的,但它们反映了电子行业发展的一般规律和趋势,也展现了A1 PROS作为一家优秀电子企业在行业中的成长轨迹和贡献。

胜利(VICTOR)公司的发展小趣事

随着产品的不断升级和市场的扩大,胜利公司开始将目光投向国际市场。1980年代,VICTOR品牌成功进入欧美市场,凭借优质的产品和合理的价格,迅速赢得了消费者的认可。公司还积极参加国际赛事,通过赞助等方式提升品牌知名度。

Chipcon AS公司的发展小趣事

随着公司业务的不断发展,Chipcon AS公司开始将目光投向全球市场。公司通过参加国际电子展会、设立海外分支机构等方式,积极推广自己的产品和服务。同时,公司还针对不同国家和地区的市场需求,定制化开发了一系列符合当地标准的产品。这些举措使得Chipcon AS公司的产品在全球范围内得到了广泛应用和认可。

Global Navigation Systems公司的发展小趣事
安装远程无线防盗报警系统时,首先需要将入侵探测器安装在需要防范的门窗等位置,并确保其能够准确检测到异常情况。然后,将微型无线报警发射机安装在探测器附近,并确保其能够接收到探测器的信号并发射出去。最后,将无线报警接收控制器安装在便于监控和接收报警信息的位置,并进行相应的调试和设置。在安装过程中,需要注意避免电磁干扰和信号衰减等问题,确保系统的稳定性和可靠性。
EQCOLOGIC公司的发展小趣事

EQCOLOGIC的创始人在一次偶然的机会中,发现了一种新型电子材料的独特性能。这种材料不仅具有优异的导电性,还具有出色的热稳定性和耐腐蚀性。他敏锐地意识到这种材料在电子行业中的巨大潜力,于是决定成立EQCOLOGIC公司,专注于这种新型电子材料的研发和应用。经过几年的努力,EQCOLOGIC成功将这种材料商业化,并凭借其独特的性能,在电子行业中崭露头角。

问答坊 | AI 解惑

华为公司-模拟电路讲义(上)

讲的挺好的,上传上来和大家一起分享!…

查看全部问答>

开关电源传导干扰检测

[url=http://www.025021.com/]模块电源[/url] 开关电源 军品电源模块在电力线和开关电源中,电磁干扰 ( EMI: electromagnetic interference)主要表现形式是传导干扰。干扰信号主要是电流和电压谐波分量【1—3】。 电力线、信号线和控制线是传导干 ...…

查看全部问答>

急求 蜂鸣器放大电路!!帮帮忙!

如图所示   哪位大侠能给给蜂鸣器放大电路!!!!非常感谢!!!!…

查看全部问答>

LSI 急招Physical Design Engineer

Please send your resume to China.Recruiting@lsi.com DESCRIPTION OF DUTIES IN ADDITION TO THOSE IN JOB DESCRIPTION: - Duties will include working within a Product Development Team to work on leading edge ASIC solutions in fu ...…

查看全部问答>

arm-linux-gcc工具链下载

最 常用的编译版本是arm-linux-gcc-3.4.1 和 arm-linux-3.3.2 的,现在的嵌入式开发基本上用的是这些,3.4.1的用于编译2.6的内核,而3.3.2的常用于编译busybox,和bootloader(u- boot),编译的版本配合不好的话就会出错,所以要选择好编译版本,如果 ...…

查看全部问答>

做好30岁前职业规划

做好30岁前的职业规划 世界500强不一定是最好的,适合的才是最好的。   首先我们要讨论的是,选择外资企业还是选择内资企业。本人认为要结合自身情况权衡利弊,任何一件事都有好的一面和不好的一面,同时任何决定都必须要有前提。   去外 ...…

查看全部问答>

《沙占友精品系列》共11本,PDG格式

包含以下书籍: ★最新万用表妙用100例 ★模拟与数字万用表检测及应用技术 ★数字万用表电路图集 ★数字万用表应用技巧 ★特种集成电源最新应用技术 ★万用表测试元器件大全 ★新编实用数字化测量技术 ★新型单片开关电源的设计与应用 ★新 ...…

查看全部问答>

跪求-48V转+48V或者+27v电路

跪求-48V转换电路,将-48和零线转换为零线和+48或者+27V或者其他正电源。 注设备放在室外,外壳接地。请勿说将-48v和零线对调来使用…

查看全部问答>