大多數(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 上傳
點擊文件名下載附件
下載積分: 黑幣 -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;
- /*******************************************************************************
- * 文件名:單獨位定義
- * 描 述:
- * 功 能:
- * 作 者:大核桃
- * 版本號: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口配置準雙向口
- 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();
- }
復制代碼
|