单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1135|回复: 0
打印 上一主题 下一主题
收起左侧

STC单片机内部EEPROM的使用-记录上电次数

[复制链接]
跳转到指定楼层
楼主
dabing89 发表于 2018-10-12 09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大多数情况下,大家存储掉电的数据都是用的24C02,在一些需要考虑成本的场合,内部的EEPROM也是可以考虑使用的,这个程序介绍一下,STC内部的EEPROM的使用,程序的功能是记录上电次数,然后加1,在数码管上显示出来。源码 006 内部EEPROM使用.rar (47.73 KB, 下载次数: 19)


  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. * 版本号:1.0.1(2017.05.23)
  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(2015.03.03)
  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;

  32. /*******************************************************************************
  33. * 文件名:单独位定义
  34. * 描  述:   
  35. * 功  能:
  36. * 作  者:大核桃
  37. * 版本号:1.0.1(2017.05.23)
  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.         LED0 = 0;//第1组LED,如果使能请置为1
  95.         LED1 = 0;
  96.         LED2 = 0;
  97.         LED3 = 0;
  98.         LED4 = 0;
  99.         LED5 = 0;
  100.         LED6 = 0;
  101.         LED7 = 0;

  102.         while(1);
  103. }

  104. /*******************************************************************************
  105. * 文件名:void LedScan()
  106. * 描  述: LED刷新
  107. * 功  能:
  108. * 作  者:大核桃
  109. * 版本号:1.0.1(2017.05.23)
  110. *******************************************************************************/
  111. void LedScan()
  112. {
  113.         static uint8 i = 0;

  114.         P2 = 0Xff;
  115.         switch(i)
  116.         {
  117.                 case 0: LEDS4 = 0;LEDS1 = 1;P2 = LedChar[counter / 1000 % 10];i++;break;
  118.                 case 1: LEDS1 = 0;LEDS2 = 1;P2 = LedChar[counter / 100 % 10];i++;break;
  119.                 case 2: LEDS2 = 0;LEDS3 = 1;P2 = LedChar[counter / 10 % 10];i++;break;
  120.                 case 3: LEDS3 = 0;LEDS4 = 1;P2 = LedChar[counter % 10];i = 0;break;

  121.                 default:break;
  122.         }
  123. }

  124. /*******************************************************************************
  125. * 文件名:void Time0_Init()
  126. * 描  述: 定时器0初始化
  127. * 功  能:1毫秒@11.0592MHz 1T
  128. * 作  者:大核桃
  129. * 版本号:1.0.1(2017.05.23)
  130. *******************************************************************************/
  131. void Time0_Init(void)
  132. {
  133.         AUXR |= 0x80;                //定时器时钟1T模式
  134.         TMOD &= 0xF0;                //设置定时器模式
  135.         TL0 = 0xCD;                    //设置定时初值
  136.         TH0 = 0xD4;                    //设置定时初值
  137.         ET0 = 1;
  138.         TR0 = 1;                    //定时器0开始计时
  139.         EA = 1;               
  140. }

  141. /*******************************************************************************
  142. * 文件名:
  143. * 描  述: 中断函数
  144. * 功  能:1毫秒@11.0592MHz
  145. * 作  者:大核桃
  146. * 版本号:1.0.1(2017.05.23)
  147. *******************************************************************************/
  148. void ET0_IRQHandler() interrupt 1
  149. {
  150.         LedScan();               
  151. }

  152. /*******************************************************************************
  153. * 文件名:void Mcu_Port_Init()
  154. * 描  述: io初始化
  155. * 功  能:
  156. * 作  者:大核桃
  157. * 版本号:1.0.1(2017.05.23)
  158. *******************************************************************************/
  159. void Mcu_Port_Init()
  160. {
  161.         //将P0口低二位配置为推挽输出
  162.         //234567位配置位高阻输入
  163.         P0M1 = 0xFC;//1111 1100
  164.         P0M0 = 0X03;//0000 0011
  165.         //P0 = 0X01;//第6个
  166.         //P0 = 0X02;//第7个
  167.         //高3位配置高阻输入,用作模拟口
  168.         //其他配置推挽输出,驱动LED
  169.         P1M1 = 0xE0;//1110 0000
  170.         P1M0 = 0X1F;//0001 1111
  171.         //P2口配置准双向口
  172.         P2M1 = 0X00;
  173.         P2M0 = 0X00;
  174.         P2 = 0Xff; //上电为1111 1111

  175. //        //P54,P55口为推挽输出
  176.         P5M1 = 0X00;
  177.         P5M0 = 0X00;
  178.         P5 = 0xFF;

  179.         //P37,P36,3.2,P3.3 P3.4口为推挽输出
  180.         P3M1 = 0X00;
  181.         P3M0 = 0XFC;
  182.         P3 = 0X23; //0010 0111//第5个LED端口        
  183. }

  184. /*******************************************************************************
  185. * 文件名:void Delay500ms()                //@24.000MHz
  186. * 描  述:Y5内核延时
  187. * 功  能:
  188. * 作  者:大核桃
  189. * 版本号:1.0.1(2017.05.23)
  190. *******************************************************************************/
  191. void Delay500ms()                //@24.000MHz
  192. {
  193.         unsigned char i, j, k;

  194.         _nop_();
  195.         _nop_();
  196.         i = 46;
  197.         j = 153;
  198.         k = 245;
  199.         do
  200.         {
  201.                 do
  202.                 {
  203.                         while (--k);
  204.                 } while (--j);
  205.         } while (--i);
  206. }

  207. /*******************************************************************************
  208. * 文件名:void IapIdle()
  209. * 描  述:关闭IAP
  210. * 功  能:
  211. * 作  者:大核桃
  212. * 版本号:1.0.1(2017.05.23)
  213. *******************************************************************************/
  214. void IapIdle()
  215. {
  216.     IAP_CONTR = 0;                  //关闭IAP功能
  217.     IAP_CMD = 0;                    //清除命令寄存器
  218.     IAP_TRIG = 0;                   //清除触发寄存器
  219.     IAP_ADDRH = 0x80;               //将地址设置到非IAP区域
  220.     IAP_ADDRL = 0;
  221. }
  222. /*******************************************************************************
  223. * 文件名:uint8 IapReadByte(uint16 addr)
  224. * 描  述:从ISP/IAP/EEPROM区域读取一字节
  225. * 功  能:
  226. * 作  者:大核桃
  227. * 版本号:1.0.1(2017.05.23)
  228. *******************************************************************************/
  229. uint8 IapReadByte(uint16 addr)
  230. {
  231.     uint8 dat;                       //数据缓冲区

  232.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  233.     IAP_CMD = CMD_READ;             //设置IAP命令
  234.     IAP_ADDRL = addr;               //设置IAP低地址
  235.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  236.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  237.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  238.         _nop_();                        //等待ISP/IAP/EEPROM操作完成
  239.     dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据
  240.     IapIdle();                      //关闭IAP功能

  241.     return dat;                     //返回
  242. }
  243. /*******************************************************************************
  244. * 文件名:void IapProgramByte(uint16 addr, uint8 dat)
  245. * 描  述: 写一字节数据到ISP/IAP/EEPROM区域
  246. * 功  能:
  247. * 作  者:大核桃
  248. * 版本号:1.0.1(2017.05.23)
  249. *******************************************************************************/
  250. void IapProgramByte(uint16 addr, uint8 dat)
  251. {
  252.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  253.     IAP_CMD = CMD_PROGRAM;          //设置IAP命令
  254.     IAP_ADDRL = addr;               //设置IAP低地址
  255.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  256.     IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据
  257.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  258.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  259.         _nop_();                        //等待ISP/IAP/EEPROM操作完成
  260.     IapIdle();
  261. }

  262. /*******************************************************************************
  263. * 文件名:void IapEraseSector(uint16 addr)
  264. * 描  述: 扇区擦除
  265. * 功  能:
  266. * 作  者:大核桃
  267. * 版本号:1.0.1(2017.05.23)
  268. *******************************************************************************/
  269. void IapEraseSector(uint16 addr)
  270. {
  271.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  272.     IAP_CMD = CMD_ERASE;            //设置IAP命令
  273.     IAP_ADDRL = addr;               //设置IAP低地址
  274.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  275.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  276.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  277.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  278.     IapIdle();
  279. }

复制代码



评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机. 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

快速回复 返回顶部 返回列表