1723|0

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

STC单片机内部EEPROM的使用-记录上电次数 [复制链接]

大多数情况下,大家存储掉电的数据都是用的24C02,在一些需要考虑成本的场合,内部的EEPROM也是可以考虑使用的,这个程序介绍一下,STC内部的EEPROM的使用,程序的功能是记录上电次数,然后加1,在数码管上显示出来。

内部EEPROM使用.rar (47.73 KB, 下载次数: 4)

  1. /*******************************************************************************
  2. * 文件名: 数码管显示上电计数值
  3. * 描  述: 上电计数
  4. * 功  能:数码管的使用  11.0592MHZ
  5. * 作  者:大核桃
  6. * 版本号:1.0.1(2017.05.23)
  7. *******************************************************************************/
  8. #include "stc15w.h"//头文件
  9. #include "intrins.h"
  10.  
  11. /*******************************************************************************
  12. * 文件名: 重定义
  13. * 描  述:   
  14. * 功  能:
  15. * 作  者:大核桃
  16. * 版本号:1.0.1(2017.05.23)
  17. *******************************************************************************/
  18. typedef unsigned char uint8;
  19. typedef unsigned int  uint16;
  20. typedef unsigned long uint32;
  21.  
  22. /*******************************************************************************
  23. * 文件名:共阳数码管真值表
  24. * 描  述: 
  25. * 功  能:
  26. * 作  者:大核桃
  27. * 版本号:1.0.1(2015.03.03)
  28. *******************************************************************************/
  29. code uint8 LedChar[] = {
  30.         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  31.         0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
  32. };
  33.  
  34. uint16 counter;
  35.  
  36. /*******************************************************************************
  37. * 文件名:单独位定义
  38. * 描  述:   
  39. * 功  能:
  40. * 作  者:大核桃
  41. * 版本号:1.0.1(2017.05.23)
  42. *******************************************************************************/
  43. sbit LED0 = P1^0;//第1组LED 
  44. sbit LED1 = P1^1;//第2组LED
  45. sbit LED2 = P1^2;//第3组LED                                  
  46. sbit LED3 = P1^3;//第4组LED
  47. sbit LED4 = P1^4;//第5组LED
  48. sbit LED5 = P3^2;//第6组LED
  49. sbit LED6 = P0^0;//第7组LED
  50. sbit LED7 = P0^1;//第8组LED
  51.  
  52. sbit LEDS1 = P3^3;//数码管1
  53. sbit LEDS2 = P3^4;//数码管2
  54. sbit LEDS3 = P3^6;//数码管3
  55. sbit LEDS4 = P3^7;//数码管4
  56. /*******************************************************************************
  57. * 文件名:全局变量定义区域
  58. * 描  述:
  59. * 功  能:
  60. * 作  者:大核桃
  61. * 版本号:1.0.1(2017.05.23)
  62. *******************************************************************************/
  63. #define CMD_IDLE    0               //空闲模式
  64. #define CMD_READ    1               //IAP字节读命令
  65. #define CMD_PROGRAM 2               //IAP字节编程命令
  66. #define CMD_ERASE   3               //IAP扇区擦除命令
  67.  
  68. #define ENABLE_IAP  0x82            //if SYSCLK<20MHz
  69. /*******************************************************************************
  70. * 文件名:函数前置声明
  71. * 描  述:   
  72. * 功  能:
  73. * 作  者:大核桃
  74. * 版本号:1.0.1(2017.05.23)
  75. *******************************************************************************/
  76. void Mcu_Port_Init();
  77. void LedScan();
  78. void Delay500ms(); //24MHZ
  79. void Time0_Init();//定时器0
  80. void IapIdle();
  81. uint8 IapReadByte(uint16 addr);
  82. void IapProgramByte(uint16 addr, uint8 dat);
  83. void IapEraseSector(uint16 addr);
  84. #define Delay()                {_nop_();_nop_();_nop_();_nop_();}
  85. /*******************************************************************************
  86. * 文件名
  87. * 描  述: 主函数  
  88. * 功  能:入口
  89. * 作  者:大核桃
  90. * 版本号:1.0.1(2017.05.23)
  91. *******************************************************************************/
  92. void main(void)
  93. {                                        
  94.         counter = IapReadByte(0x0000);//读取数据
  95.         counter++;//写
  96.         Mcu_Port_Init();//IO上电初始化
  97.         Time0_Init();
  98.         IapEraseSector(0x0000);//擦除数据
  99.         IapProgramByte(0x0000, counter);//写入数据
  100.         LED0 = 0;//第1组LED,如果使能请置为1 
  101.         LED1 = 0;
  102.         LED2 = 0;
  103.         LED3 = 0;
  104.         LED4 = 0;
  105.         LED5 = 0;
  106.         LED6 = 0;
  107.         LED7 = 0;
  108.  
  109.         while(1);
  110. }
  111.  
  112. /*******************************************************************************
  113. * 文件名:void LedScan()
  114. * 描  述: LED刷新
  115. * 功  能:
  116. * 作  者:大核桃
  117. * 版本号:1.0.1(2017.05.23)
  118. *******************************************************************************/
  119. void LedScan()
  120. {
  121.         static uint8 i = 0;
  122.  
  123.         P2 = 0Xff;
  124.         switch(i)
  125.         {
  126.                 case 0: LEDS4 = 0;LEDS1 = 1;P2 = LedChar[counter / 1000 % 10];i++;break;
  127.                 case 1: LEDS1 = 0;LEDS2 = 1;P2 = LedChar[counter / 100 % 10];i++;break;
  128.                 case 2: LEDS2 = 0;LEDS3 = 1;P2 = LedChar[counter / 10 % 10];i++;break;
  129.                 case 3: LEDS3 = 0;LEDS4 = 1;P2 = LedChar[counter % 10];i = 0;break;
  130.  
  131.                 default:break;
  132.         }
  133. }
  134.  
  135. /*******************************************************************************
  136. * 文件名:void Time0_Init()
  137. * 描  述: 定时器0初始化
  138. * 功  能:1毫秒@11.0592MHz 1T
  139. * 作  者:大核桃
  140. * 版本号:1.0.1(2017.05.23)
  141. *******************************************************************************/
  142. void Time0_Init(void)
  143. {
  144.         AUXR |= 0x80;                //定时器时钟1T模式
  145.         TMOD &= 0xF0;                //设置定时器模式
  146.         TL0 = 0xCD;                    //设置定时初值
  147.         TH0 = 0xD4;                    //设置定时初值
  148.         ET0 = 1;
  149.         TR0 = 1;                    //定时器0开始计时
  150.         EA = 1;                
  151. }
  152.  
  153. /*******************************************************************************
  154. * 文件名:
  155. * 描  述: 中断函数
  156. * 功  能:1毫秒@11.0592MHz
  157. * 作  者:大核桃
  158. * 版本号:1.0.1(2017.05.23)
  159. *******************************************************************************/
  160. void ET0_IRQHandler() interrupt 1
  161. {
  162.         LedScan();                
  163. }
  164.  
  165. /*******************************************************************************
  166. * 文件名:void Mcu_Port_Init()
  167. * 描  述: io初始化
  168. * 功  能:
  169. * 作  者:大核桃
  170. * 版本号:1.0.1(2017.05.23)
  171. *******************************************************************************/
  172. void Mcu_Port_Init()
  173. {
  174.         //将P0口低二位配置为推挽输出
  175.         //234567位配置位高阻输入
  176.         P0M1 = 0xFC;//1111 1100
  177.         P0M0 = 0X03;//0000 0011
  178.         //P0 = 0X01;//第6个
  179.         //P0 = 0X02;//第7个
  180.         //高3位配置高阻输入,用作模拟口
  181.         //其他配置推挽输出,驱动LED
  182.         P1M1 = 0xE0;//1110 0000
  183.         P1M0 = 0X1F;//0001 1111
  184.         //P2口配置准双向口
  185.         P2M1 = 0X00;
  186.         P2M0 = 0X00;
  187.         P2 = 0Xff; //上电为1111 1111
  188.  
  189. //        //P54,P55口为推挽输出
  190.         P5M1 = 0X00;
  191.         P5M0 = 0X00;
  192.         P5 = 0xFF;
  193.  
  194.         //P37,P36,3.2,P3.3 P3.4口为推挽输出
  195.         P3M1 = 0X00;
  196.         P3M0 = 0XFC;
  197.         P3 = 0X23; //0010 0111//第5个LED端口        
  198. }
  199.  
  200. /*******************************************************************************
  201. * 文件名:void Delay500ms()                //@24.000MHz
  202. * 描  述:Y5内核延时
  203. * 功  能:
  204. * 作  者:大核桃
  205. * 版本号:1.0.1(2017.05.23)
  206. *******************************************************************************/
  207. void Delay500ms()                //@24.000MHz
  208. {
  209.         unsigned char i, j, k;
  210.  
  211.         _nop_();
  212.         _nop_();
  213.         i = 46;
  214.         j = 153;
  215.         k = 245;
  216.         do
  217.         {
  218.                 do
  219.                 {
  220.                         while (--k);
  221.                 } while (--j);
  222.         } while (--i);
  223. }
  224.  
  225. /*******************************************************************************
  226. * 文件名:void IapIdle()
  227. * 描  述:关闭IAP
  228. * 功  能:
  229. * 作  者:大核桃
  230. * 版本号:1.0.1(2017.05.23)
  231. *******************************************************************************/
  232. void IapIdle()
  233. {
  234.     IAP_CONTR = 0;                  //关闭IAP功能
  235.     IAP_CMD = 0;                    //清除命令寄存器
  236.     IAP_TRIG = 0;                   //清除触发寄存器
  237.     IAP_ADDRH = 0x80;               //将地址设置到非IAP区域
  238.     IAP_ADDRL = 0;
  239. }
  240. /*******************************************************************************
  241. * 文件名:uint8 IapReadByte(uint16 addr)
  242. * 描  述:从ISP/IAP/EEPROM区域读取一字节
  243. * 功  能:
  244. * 作  者:大核桃
  245. * 版本号:1.0.1(2017.05.23)
  246. *******************************************************************************/
  247. uint8 IapReadByte(uint16 addr)
  248. {
  249.     uint8 dat;                       //数据缓冲区
  250.  
  251.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  252.     IAP_CMD = CMD_READ;             //设置IAP命令
  253.     IAP_ADDRL = addr;               //设置IAP低地址
  254.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  255.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  256.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  257.         _nop_();                        //等待ISP/IAP/EEPROM操作完成
  258.     dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据
  259.     IapIdle();                      //关闭IAP功能
  260.  
  261.     return dat;                     //返回
  262. }
  263. /*******************************************************************************
  264. * 文件名:void IapProgramByte(uint16 addr, uint8 dat)
  265. * 描  述: 写一字节数据到ISP/IAP/EEPROM区域
  266. * 功  能:
  267. * 作  者:大核桃
  268. * 版本号:1.0.1(2017.05.23)
  269. *******************************************************************************/
  270. void IapProgramByte(uint16 addr, uint8 dat)
  271. {
  272.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  273.     IAP_CMD = CMD_PROGRAM;          //设置IAP命令
  274.     IAP_ADDRL = addr;               //设置IAP低地址
  275.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  276.     IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据
  277.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  278.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  279.         _nop_();                        //等待ISP/IAP/EEPROM操作完成
  280.     IapIdle();
  281. }
  282.  
  283. /*******************************************************************************
  284. * 文件名:void IapEraseSector(uint16 addr)
  285. * 描  述: 扇区擦除
  286. * 功  能:
  287. * 作  者:大核桃
  288. * 版本号:1.0.1(2017.05.23)
  289. *******************************************************************************/
  290. void IapEraseSector(uint16 addr)
  291. {
  292.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  293.     IAP_CMD = CMD_ERASE;            //设置IAP命令
  294.     IAP_ADDRL = addr;               //设置IAP低地址
  295.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  296.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  297.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  298.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  299.     IapIdle();
  300. }
  301.  
 
点赞(1) 关注(1)

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表