×
单片机 > 单片机程序设计 > 详情

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

发布时间:2024-05-18 发布时间:
|

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

[1] [2]
STC单片机内部EEPROM记录上电次数

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析