STC单片机内部EEPROM的使用-记录上电次数

发布者:SereneHarmony最新更新时间:2020-07-13 来源: 51hei关键字:STC单片机  内部EEPROM  记录上电次数 手机看文章 扫描二维码
随时随地手机看文章

大多数情况下,大家存储掉电的数据都是用的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;                       //数据缓冲区

[1] [2]
关键字:STC单片机  内部EEPROM  记录上电次数 引用地址:STC单片机内部EEPROM的使用-记录上电次数

上一篇:单片机入门经验分享1-晶振 复位电路与电源
下一篇:51单片机入门经验分享9-定时器模拟实现PWM呼吸灯效果

推荐阅读最新更新时间:2024-11-12 07:37

STC单片机的IAP 实现不掉电下载程序
下面介绍不掉电载程序的实现过程。先要了解一点基础知识。单片机的复位,下载流等等。。。 首先说一下复位。STC89C52有的复位有两种,一种是上电复位,也就是冷启动,复位后检测串口那里有没有下载流,有的话跑去下载程序那里。还有一种是平时的按键复位,高电平有效那种的,不检测是否有下载流。 下载流是什么?就是串口发送给单片机要烧写程序的信息。STC89C52的下载流是0x7F,连续12个好像(官方公布是大于16 )。如果我们上位机点下载,它就通过一直发送0x7F给单片机。如果这是有上电复位,就烧写程序进去单片机。 我们的程序里面就是要用到这些,再介绍一下基本思路。我们需要单片机正常运行过程中检测是否有下载流(0x7F),如
[单片机]
<font color='red'>STC单片机</font>的IAP 实现不掉电下载程序
STC单片机的特性及缺点解析
STC单片机 说到STC单片机有人会说到,STC也能算主流,我们基于它是国内还算是比较不错的单片机来说。STC单片机是宏晶生产的单时钟/机器周期的单片机,说白了STC单片机是51与AVR的结合体,有人说AVR是51的替代单片机,但是AVR单片机在位控制和C语言写法上存在很大的差 异。而STC单片机洽洽结合了51和AVR的优点,虽然功能不及AVR那么强大,但是在AVR能找到的功能,在STC上基本都有,同时STC单片机是51内核,这给以51单片机为基础的工程师们提供了极大的方便,省去了学习AVR的时间,同时也不失AVR的各种功能。 STC单片机是高速、低功耗、超强抗干扰的新一代8051单片机51单片机,指令代码完全兼容传统8051
[单片机]
单片机程序远程下载方法(包括STC单片机
简介:在某些特殊的场合单片机程序、软件需要进行远程下载,特别是单片机程序的远程升级。本文介绍一种使用串口转以太网模块ZLSN3000来实现51单片机(特别是STC单片机)、PIC单片机、ARM、AVR、PLC的程序远程升级的方法。 1.原理 1.1升级条件 任何能够通过PC机串口下载程序的单片机都可以用该方法实现远程程序升级。目前该方案已经在STC单片机、PIC单片机、ARM上验证。 1.2硬件连接图 如图 1 所示是通过Internet远程升级STC单片机程序的演示图。在设备端,使用卓岚ZLSN3000模块将STC单片机的串口(2根线)和ZLSN3000的RXD、TXD引线直接连接;ZLSN3000的网口连接到ADSL
[单片机]
单片机程序远程下载方法(包括<font color='red'>STC单片机</font>)
基于STC单片机的ISP下载线设计
  本文首先介绍了在线编程技术,然后给出了基于STC单片机两种下载线设计电路,最后阐述了ISP下载线的性能特点。实践表明:本设计具有低成本、高灵活性,对单片机爱好者,尤其是初学者,具有很强的实用价值。   一.ISP技术   在单片机的实际应用中,往往要求系统能够脱机运行,这就要求必须将用户程序代码固化到非易失性的程序存储器中。把用户程序代码固化到程序存储器的过程称为编程。传统对程序存储器的编程是通过编程器完成的,用户需要将单片机从目标板上取下来放到编程器上,然后通过烧写软件将程序代码固化到程序存储器中,这种编程方式通常称为脱机烧写(也叫离线编程)。但随着芯片制造工艺的不断提高,贴片式封装得到快速发展,这就使得单片机不可能轻易取下
[单片机]
stc15系列STC内部EEPROM的读写
STC单片机利用IAP技术实现了EEPROM功能,相比外置存储芯片而言,在操作上比较方便。 涉及STC单片机EEPROM操作的特殊功能寄存器有6个,地址分别是E2H、E3H、E4H、E5H、E6H和E7H。在STC单片机使用手册中,作者分别将它们定义为: 一、IAP_DATA (E2H) 二、IAP_ADDRH (E3H) 三、IAP_ADDRL (E4H) 四、IAP_CMD (E5H) 五、IAP_TRIG (E6H) 六、IAP_CONTR (E7H) 本人认为,手册中给每个地址单元定义的英文词组太长,而且有点哆嗦,占的篇幅又大,感觉对正常阅读和理解产生了一定的干扰,反倒不好了解作者的意图了,还不如让使用者自己定义为好。
[单片机]
STC单片机常用型号
一:STC15W204S系列有8脚、16脚,具体应用参考STC15系列单片机手册。 二:STC15W401AS系列有SOP16、SOP20、SOP28,具体应用参考芯片手册。
[单片机]
<font color='red'>STC单片机</font>常用型号
avr内部EEPROM实验
学习了AVR内部EEPROM的使用。 内部flash中保存的是烧录进去的程序。 内部EEPROM可以保存数据,并且断电后还保存着。 内部SRAM可以保存变量数据,断电后不保存。 仿真图片 程序代码 #include iom16v.h #include macros.h #include delay.h #define uchar unsigned char #define uint unsigned int uchar led7 ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳7段数码管显示0-9对应的8bit uchar temp; vo
[单片机]
avr<font color='red'>内部</font><font color='red'>EEPROM</font>实验
AVR 存储器组织结构及内部EEPROM读写范例
AVR 系列单片机内部有三种类型的被独立编址的存储器,它们分别为:Flash 程序存储器、内部SRAM 数据存储器和EEPROM 数据存储器。 Flash 存储器为1K~128K 字节,支持并行编程和串行下载,下载寿命通常可达10,000 次。由于AVR 指令都为16 位或32 位,程序计数器对它按字进行寻址,因此FLASH 存储器按字组织的,但在程序中访问 FLASH 存储区时专用指令LPM 可分别读取指定地址的高低字节。 寄存器堆(R0~R31)、I/O 寄存器和SRAM 被统一编址。所以对寄存器和I/O 口的操作使用与访问内部SRAM 同样的指令。32 个通用寄存器被编址到最前,I/O 寄存器占用接下来的64 个地址
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved