历史上的今天
返回首页

历史上的今天

今天是:2025年07月12日(星期六)

正在发生

2020年07月12日 | 51单片机入门经验分享5-STC15W1K16PWM内部EEPROM的使用

2020-07-12 来源:51hei

在实际开发中,经常会遇到某些需要断电需要再次上电记忆的场合,这就需要掉电存储芯片了,最常用的EEPROM芯片就是AT24C02了,几乎成了每一块开发板的标配,但是有些时候,在一些低成本的场合,需要用类EEPROM或者flash来模拟EEPROM进行存储,AT24C02是可以进行字节擦写的,STC内部的EEPROM是不可以字节擦写的,他是按照512byte一个扇区来组织的,如下图所示,我们开发板选择的这块芯片分为了22个扇区。如果你要擦除数据,那么必须要一次性的擦除512字节才可以,这么难用,难用总比没有强吧,在好多产品上,我都见到过,好多掉电了上电依然保持的参数,有没有外置EEPROM芯片,只能用内部的或者来模拟了,我们来写一个程序,程序的结果是记忆上电次数,每上电一次,就累加一次,显示在数码管上面,OK,写好的代码如下所示:

  1. /*******************************************************************************

  2. * 文件名: 数码管显示上电计数值

  3. * 描  述: 上电计数

  4. * 功  能:数码管的使用

  5. * 作  者:大核桃 597627977

  6. * 版本号:1.0.1(2018.09.21)

  7. *******************************************************************************/

  8. #include "stc15w.h"//头文件

  9. #include "intrins.h"


  10. /*******************************************************************************

  11. * 文件名: 重定义

  12. * 描  述:   

  13. * 功  能:

  14. * 作  者:大核桃

  15. * 版本号:1.0.1(2018.09.21)

  16. *******************************************************************************/

  17. typedef unsigned char uint8;

  18. typedef unsigned int  uint16;

  19. typedef unsigned long uint32;


  20. /*******************************************************************************

  21. * 文件名:共阳数码管真值表

  22. * 描  述:

  23. * 功  能:

  24. * 作  者:大核桃

  25. * 版本号:1.0.1(2018.09.21)

  26. *******************************************************************************/

  27. code uint8 LedChar[] = {

  28.         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

  29.         0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e

  30. };


  31. uint16 counter;        //记忆上电次数,最大65535


  32. /*******************************************************************************

  33. * 文件名:单独位定义

  34. * 描  述:   

  35. * 功  能:

  36. * 作  者:大核桃

  37. * 版本号:1.0.1(2018.09.21)

  38. *******************************************************************************/

  39. sbit LED0 = P1^0;//第1组LED

  40. sbit LED1 = P1^1;//第2组LED

  41. sbit LED2 = P1^2;//第3组LED                                 

  42. sbit LED3 = P1^3;//第4组LED

  43. sbit LED4 = P1^4;//第5组LED

  44. sbit LED5 = P3^2;//第6组LED

  45. sbit LED6 = P0^0;//第7组LED

  46. sbit LED7 = P0^1;//第8组LED


  47. sbit LEDS1 = P3^3;//数码管1

  48. sbit LEDS2 = P3^4;//数码管2

  49. sbit LEDS3 = P3^6;//数码管3

  50. sbit LEDS4 = P3^7;//数码管4


  51. /*******************************************************************************

  52. * 文件名:全局变量定义区域

  53. * 描  述:

  54. * 功  能:

  55. * 作  者:大核桃

  56. * 版本号:1.0.1(2017.05.23)

  57. *******************************************************************************/

  58. #define CMD_IDLE    0               //空闲模式

  59. #define CMD_READ    1               //IAP字节读命令

  60. #define CMD_PROGRAM 2               //IAP字节编程命令

  61. #define CMD_ERASE   3               //IAP扇区擦除命令


  62. #define ENABLE_IAP  0x82            //if SYSCLK<20MHz

  63. /*******************************************************************************

  64. * 文件名:函数前置声明

  65. * 描  述:   

  66. * 功  能:

  67. * 作  者:大核桃

  68. * 版本号:1.0.1(2017.05.23)

  69. *******************************************************************************/

  70. void Mcu_Port_Init();

  71. void LedScan();

  72. void Delay500ms(); //24MHZ

  73. void Time0_Init();//定时器0

  74. void IapIdle();

  75. uint8 IapReadByte(uint16 addr);

  76. void IapProgramByte(uint16 addr, uint8 dat);

  77. void IapEraseSector(uint16 addr);

  78. #define Delay()                {_nop_();_nop_();_nop_();_nop_();}


  79. /*******************************************************************************

  80. * 文件名

  81. * 描  述: 主函数  

  82. * 功  能:入口

  83. * 作  者:大核桃

  84. * 版本号:1.0.1(2017.05.23)

  85. *******************************************************************************/

  86. void main(void)

  87. {                                       

  88.         counter = IapReadByte(0x0000);//读取数据

  89.         counter++;//写


  90.         Mcu_Port_Init();//IO上电初始化

  91.         Time0_Init();


  92.         IapEraseSector(0x0000);//擦除数据

  93.         IapProgramByte(0x0000, counter);//写入数据



  94.         while(1);

  95. }


  96. /*******************************************************************************

  97. * 文件名:void LedScan()

  98. * 描  述: LED刷新

  99. * 功  能:

  100. * 作  者:大核桃

  101. * 版本号:1.0.1(2017.05.23)

  102. *******************************************************************************/

  103. void LedScan()

  104. {

  105.         static uint8 i = 0;


  106.         P2 = 0Xff;

  107.         switch(i)

  108.         {

  109.                 case 0: LEDS4 = 0;LEDS1 = 1;P2 = LedChar[counter / 1000 % 10];i++;break;

  110.                 case 1: LEDS1 = 0;LEDS2 = 1;P2 = LedChar[counter / 100 % 10];i++;break;

  111.                 case 2: LEDS2 = 0;LEDS3 = 1;P2 = LedChar[counter / 10 % 10];i++;break;

  112.                 case 3: LEDS3 = 0;LEDS4 = 1;P2 = LedChar[counter % 10];i = 0;break;


  113.                 default:break;

  114.         }

  115. }

  116. /*******************************************************************************

  117. * 文件名:void Time0_Init()

  118. * 描  述: 定时器0初始化

  119. * 功  能:10毫秒@11.0592MHz

  120. * 作  者:大核桃

  121. * 版本号:1.0.1(2017.05.23)

  122. *******************************************************************************/

  123. void Time0_Init(void)

  124. {

  125.         AUXR &= 0x7F;                //定时器时钟12T模式

  126.         TMOD &= 0xF0;                //设置定时器模式

  127.         TMOD |= 0X01;      //确保不干扰其他配置

  128.         TH0 = 0xDC;                //设置定时初值

  129.         TL0 = 0x00;                //设置定时初值

  130.         ET0 = 1;

  131.         TR0 = 1;                //定时器0开始计时

  132.         EA = 1;               

  133. }

  134. /*******************************************************************************

  135. * 文件名:

  136. * 描  述: 中断函数

  137. * 功  能:10毫秒@11.0592MHz

  138. * 作  者:大核桃

  139. * 版本号:1.0.1(2017.05.23)

  140. *******************************************************************************/

  141. void ET0_IRQHandler() interrupt 1

  142. {

  143.         TH0 = 0xDC;                //设置定时初值

  144.         TL0 = 0x00;                //设置定时初值

  145.         LedScan();               

  146. }

  147. /*******************************************************************************

  148. * 文件名:void Mcu_Port_Init()

  149. * 描  述: io初始化

  150. * 功  能:

  151. * 作  者:大核桃

  152. * 版本号:1.0.1(2017.05.23)

  153. *******************************************************************************/

  154. void Mcu_Port_Init()

  155. {

  156.         //将P0口低二位配置为推挽输出

  157.         //234567位配置位高阻输入

  158.         P0M1 = 0xFC;//1111 1100

  159.         P0M0 = 0X03;//0000 0011

  160.         //P0 = 0X01;//第6个

  161.         //P0 = 0X02;//第7个

  162.         //高3位配置高阻输入,用作模拟口

  163.         //其他配置推挽输出,驱动LED

  164.         P1M1 = 0xE0;//1110 0000

  165.         P1M0 = 0X1F;//0001 1111

  166.         //P2口配置准双向口

  167.         P2M1 = 0X00;

  168.         P2M0 = 0X00;

  169.         P2 = 0Xff; //上电为1111 1111


  170. //        //P54,P55口为推挽输出

  171.         P5M1 = 0X00;

  172.         P5M0 = 0X00;

  173.         P5 = 0xFF;


  174.         //P37,P36,3.2,P3.3 P3.4口为推挽输出

  175.         P3M1 = 0X00;

  176.         P3M0 = 0XFC;

  177.         P3 = 0X23; //0010 0111//第5个LED端口

  178.         

  179.         LED0 = 0;//第1组LED,如果使能请置为1

  180.         LED1 = 0;

  181.         LED2 = 0;

  182.         LED3 = 0;

  183.         LED4 = 0;

  184.         LED5 = 0;

  185.         LED6 = 0;

  186.         LED7 = 0;        

  187. }


  188. /*******************************************************************************

  189. * 文件名:void Delay500ms()                //@24.000MHz

  190. * 描  述:Y5内核延时

  191. * 功  能:

  192. * 作  者:大核桃

  193. * 版本号:1.0.1(2017.05.23)

  194. *******************************************************************************/

  195. void Delay500ms()                //@24.000MHz

  196. {

  197.         unsigned char i, j, k;


  198.         _nop_();

  199.         _nop_();

推荐阅读

史海拾趣

Bytesonic Corporation公司的发展小趣事

1984年,台湾的电子行业正迎来蓬勃发展的黄金时期。在这一年的10月,Bytesonic Corporation在台湾台北正式成立,标志着这家电子公司正式踏入竞争激烈的电子市场。初创时期,公司面临着资金短缺、技术匮乏等多重挑战,但凭借着创始人的远见卓识和团队的拼搏精神,公司逐渐在市场中站稳了脚跟。

Electronic Sensor + Resistor GmbH公司的发展小趣事

Electronic Sensor + Resistor GmbH(简称ESR公司)的创立源于两位电子工程师的远见卓识。他们发现市场上对于高精度电子传感器和定制电阻器的需求日益增长,但现有产品往往无法满足特定应用的性能要求。于是,ESR公司应运而生,专注于研发和生产高性能的电子传感器和电阻器。

在创业初期,ESR公司面临着资金、技术和市场的三重挑战。但凭借其卓越的研发实力和坚持不懈的市场推广,公司逐渐在市场上树立起高品质、高可靠性的品牌形象。通过与多家知名企业的合作,ESR公司的产品逐渐获得了市场的认可。

AVAGO公司的发展小趣事

尽管AVAGO公司在发展过程中取得了显著成就,但也面临着诸多挑战。随着全球半导体市场的竞争日益激烈,公司需要不断投入研发资金、加强人才培养、优化生产流程等方面来保持竞争优势。同时,公司还需要密切关注行业动态和市场需求变化,以便及时调整战略和产品线。在未来,AVAGO公司将继续致力于技术创新和市场拓展,为全球客户提供更优质的产品和服务。

以上五个故事仅是对AVAGO公司发展历程的简要描述,实际上公司在发展过程中还经历了许多其他重要事件和阶段。这些故事展示了AVAGO公司如何凭借技术实力、市场洞察力和战略眼光在电子行业中脱颖而出,并成为全球领先的半导体企业之一。

AUREL公司的发展小趣事

在追求经济效益的同时,AUREL公司也积极履行社会责任。公司注重环保和可持续发展,在生产过程中采用环保材料和节能技术,努力降低对环境的影响。此外,公司还积极参与社会公益事业,为当地社区的发展做出了积极贡献。这些举措不仅提升了AUREL公司的社会形象,也增强了公司的凝聚力和向心力。

请注意,以上故事是基于虚构的,旨在展示一个电子行业公司可能的发展路径和成就。如果您需要关于AUREL公司的具体信息或发展故事,建议直接查阅该公司的官方网站或相关新闻报道。

国炬(GOOGLL)公司的发展小趣事
OCL电路能够驱动低阻抗的负载,提高了系统的整体效率。
ECLIPSE公司的发展小趣事

尽管Eclipse是一个开源项目,但其背后也有着商业化的运作。一些公司看到了Eclipse的潜力,纷纷推出了基于Eclipse的商业产品。这些产品不仅继承了Eclipse的优秀特性,还加入了一些独特的功能和服务,以满足不同客户的需求。通过商业化运作,Eclipse的影响力得到了进一步扩大。

问答坊 | AI 解惑

受控源

一.定义    前面我们讲的都是独立电源,简称独立源。独立电压源的电压和独立电流源的电流都是定值或是确定的时间函数。    电路中除了作用有独立电源外,还往往含有受控电源。受控电压源的电压和受控电流源的电流不 ...…

查看全部问答>

fir滤波器波形不对?为什么?

低通fir滤波器输入和输出波形如下,为什么输出变成了六个频率呢?应该还是只有中间两个啊…

查看全部问答>

格雷码计数器的Verilog描述GrayCnt

格雷码计数器的Verilog描述GrayCnt              ISE Foundation 上生成的工程和matlab文件。…

查看全部问答>

为啥生成后的PCB所有封装都是绿色的?

如图.而且我的AD6点击自动布线一定卡掉,不知道怎么回事.…

查看全部问答>

世界趋向“绿色”——三大议题能源效率、照明效率及太阳能

   现在的世界趋向“绿色”,其中三个广受大众关注的议题包括:能源效率、照明效率及太阳能。    2010年最具发展潜力的应用都是围绕这三大主题,例如替代性能源、可携式消费性电子装置、无线通信基础设施、电动车与油电混合 ...…

查看全部问答>

初学单片机编程遇到的问题

有个问题想请教下各位,我是个新手,刚学单片机。在使用keil uVision2编译hex文件时总显示error c129:missing \';\' before \'0\' 程序如下:                  ORG   &nb ...…

查看全部问答>

求根据存储容量计算所需的地址总线和数据总线条数的方法

怎么根据存储器的容量来计算他所需的地址总线和数据总线条数? 例如:1、求64KB的内存所需的地址总线和数据总线条数? 2、容量为32K*16位的存储器所需的地址总线和数据总线条数? 该如何求。我百度了不少资料,但是看得有点晕呼呼的。请高手详细讲 ...…

查看全部问答>

SQLCE RDA同步SQL2000怪事(万分火急)

我用的是RDA同步方法来同步SQLCE3.0和 SQL2000    情况: 1,本地上用VS2005部署完全可以,也可以联通,什么都没问题        2,但是把VS2005生成的DUG给别人,然后别人考入到WINCE系统中却是不可以,报错SQLCESA ...…

查看全部问答>

TM50中断问题。对高手来说应该是小菜吧,请用1分钟时间帮我看下

//interrupt.c #pragma interrupt INTTM50 _int_tm50 #include \"mcu.h\" int i=0; void main() { //        PCC=0x00;                 TMC50=0x80;       ...…

查看全部问答>

MSP430F449自带AD的采样频率怎么计算?

MSP430F449自带的AD 最高采样频率是200K,但不知道这具体是怎样设置获得的? 之前在某处看到过计算公式,忘记了:( ,知道的请指教一下吧。先谢过了!…

查看全部问答>