標(biāo)題:
STC單片機(jī)內(nèi)部EEPROM的使用-記錄上電次數(shù)
[打印本頁]
作者:
dabing89
時間:
2018-10-12 09:28
標(biāo)題:
STC單片機(jī)內(nèi)部EEPROM的使用-記錄上電次數(shù)
大多數(shù)情況下,大家存儲掉電的數(shù)據(jù)都是用的24C02,在一些需要考慮成本的場合,內(nèi)部的EEPROM也是可以考慮使用的,這個程序介紹一下,STC內(nèi)部的EEPROM的使用,程序的功能是記錄上電次數(shù),然后加1,在數(shù)碼管上顯示出來。源碼
006 內(nèi)部EEPROM使用.rar
(47.73 KB, 下載次數(shù): 173)
2018-10-12 09:28 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
/*******************************************************************************
* 文件名: 數(shù)碼管顯示上電計數(shù)值
* 描 述: 上電計數(shù)
* 功 能:數(shù)碼管的使用 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;
/*******************************************************************************
* 文件名:共陽數(shù)碼管真值表
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號: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;
/*******************************************************************************
* 文件名:單獨(dú)位定義
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號: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;//數(shù)碼管1
sbit LEDS2 = P3^4;//數(shù)碼管2
sbit LEDS3 = P3^6;//數(shù)碼管3
sbit LEDS4 = P3^7;//數(shù)碼管4
/*******************************************************************************
* 文件名:全局變量定義區(qū)域
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
#define CMD_IDLE 0 //空閑模式
#define CMD_READ 1 //IAP字節(jié)讀命令
#define CMD_PROGRAM 2 //IAP字節(jié)編程命令
#define CMD_ERASE 3 //IAP扇區(qū)擦除命令
#define ENABLE_IAP 0x82 //if SYSCLK<20MHz
/*******************************************************************************
* 文件名:函數(shù)前置聲明
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號: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_();}
/*******************************************************************************
* 文件名
* 描 述: 主函數(shù)
* 功 能:入口
* 作 者:大核桃
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
void main(void)
{
counter = IapReadByte(0x0000);//讀取數(shù)據(jù)
counter++;//寫
Mcu_Port_Init();//IO上電初始化
Time0_Init();
IapEraseSector(0x0000);//擦除數(shù)據(jù)
IapProgramByte(0x0000, counter);//寫入數(shù)據(jù)
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; //設(shè)置定時器模式
TL0 = 0xCD; //設(shè)置定時初值
TH0 = 0xD4; //設(shè)置定時初值
ET0 = 1;
TR0 = 1; //定時器0開始計時
EA = 1;
}
/*******************************************************************************
* 文件名:
* 描 述: 中斷函數(shù)
* 功 能: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位配置高阻輸入,用作模擬口
//其他配置推挽輸出,驅(qū)動LED
P1M1 = 0xE0;//1110 0000
P1M0 = 0X1F;//0001 1111
//P2口配置準(zhǔn)雙向口
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內(nèi)核延時
* 功 能:
* 作 者:大核桃
* 版本號: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()
* 描 述:關(guān)閉IAP
* 功 能:
* 作 者:大核桃
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
void IapIdle()
{
IAP_CONTR = 0; //關(guān)閉IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除觸發(fā)寄存器
IAP_ADDRH = 0x80; //將地址設(shè)置到非IAP區(qū)域
IAP_ADDRL = 0;
}
/*******************************************************************************
* 文件名:uint8 IapReadByte(uint16 addr)
* 描 述:從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
* 功 能:
* 作 者:大核桃
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
uint8 IapReadByte(uint16 addr)
{
uint8 dat; //數(shù)據(jù)緩沖區(qū)
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //設(shè)置IAP命令
IAP_ADDRL = addr; //設(shè)置IAP低地址
IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //讀ISP/IAP/EEPROM數(shù)據(jù)
IapIdle(); //關(guān)閉IAP功能
return dat; //返回
}
/*******************************************************************************
* 文件名:void IapProgramByte(uint16 addr, uint8 dat)
* 描 述: 寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
* 功 能:
* 作 者:大核桃
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
void IapProgramByte(uint16 addr, uint8 dat)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //設(shè)置IAP命令
IAP_ADDRL = addr; //設(shè)置IAP低地址
IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
IAP_DATA = dat; //寫ISP/IAP/EEPROM數(shù)據(jù)
IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*******************************************************************************
* 文件名:void IapEraseSector(uint16 addr)
* 描 述: 扇區(qū)擦除
* 功 能:
* 作 者:大核桃
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/
void IapEraseSector(uint16 addr)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_ERASE; //設(shè)置IAP命令
IAP_ADDRL = addr; //設(shè)置IAP低地址
IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
復(fù)制代碼
作者:
盛世游龍
時間:
2019-4-16 16:27
謝謝樓主分享!
作者:
飛豬俠
時間:
2019-7-14 01:04
謝謝樓主分享
作者:
hhttwwbb
時間:
2019-7-26 13:17
謝謝樓主分享
作者:
songzhige
時間:
2019-10-8 22:09
謝謝樓主分享
作者:
frank123098
時間:
2019-11-15 15:24
謝謝樓主分享
作者:
lsqtzj
時間:
2020-2-5 13:25
謝謝樓主分享
作者:
愛好電子30年
時間:
2020-10-11 08:22
剛學(xué)習(xí) 請問一下 這個程序使用的芯片是STC15W什么型號的 謝謝
作者:
apple_01
時間:
2021-3-25 14:20
STC的內(nèi)部EEPROM,擦除是整個扇區(qū)的操作,比較郁悶。
作者:
wyl138
時間:
2022-10-31 20:41
樓主的帖子都看了下,很多都還沒詳細(xì)研究,先收藏了,真是寶貝。
作者:
robter
時間:
2023-2-19 11:01
很好的例子,EEPROM編程學(xué)習(xí)了
作者:
pluto1000
時間:
2023-12-31 21:55
very nice!
作者:
liqingyundmtech
時間:
2024-12-29 22:59
謝謝樓主分享!辛苦了
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1