大多数情况下,大家存储掉电的数据都是用的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-晶振 复位电路与电源
下一篇:51单片机入门经验分享9-定时器模拟实现PWM呼吸灯效果
推荐阅读最新更新时间:2024-11-12 07:37
设计资源 培训 开发板 精华推荐
- 用于 ATX 电源的 255W、-12V、3.3V、5V、12V 交流转直流多路输出电源
- LT1170HVCT、-12/5A 正负降压-升压转换器的典型应用
- 根据 EN50121-3-2(双输出)使用具有 EMC 滤波的 RP40-483.3SFR DC/DC 转换器的典型应用
- TCR2EN115、200mA、1.15V 输出电压 CMOS 低压降稳压器的典型应用
- 物联网加热台_兼容大尺寸加热板版本
- 用于医疗的 PSoC 嵌入式系统
- AM1/4S-1215SZ 15V 0.25 瓦 DC-DC 转换器的典型应用
- IP6862,一拖三
- Si5013-EVB,用于 SONET 的 155.52MHz 时钟缓冲器的评估板
- VC-02语音控制