当前位置:   article > 正文

单片机学习笔记————51单片机实现利用AT24C02进行掉电后的数据保存_51单片机断电怎么保存数据

51单片机断电怎么保存数据

一、使用proteus绘制简单的电路图,用于后续仿真

关于IIC的读写:

二、编写程序

  1. /********************************************************************************************************************
  2. ---- @Project: AT24C02
  3. ---- @File: main.c
  4. ---- @Edit: ZHQ
  5. ---- @Version: V1.0
  6. ---- @CreationTime: 20200721
  7. ---- @ModifiedTime: 20200721
  8. ---- @Description: 实现功能:
  9. ---- 4个被更改后的参数断电后不丢失,数据可以保存,断电再上电后还是上一次最新被修改的数据。
  10. ---- 一共有4个窗口。每个窗口显示一个参数。
  11. ---- 第8,7,6,5位数码管显示当前窗口,P-1代表第1个窗口,P-2代表第2个窗口,P-3代表第3个窗口,P-4代表第1个窗口。
  12. ---- 第4,3,2,1位数码管显示当前窗口被设置的参数。范围是从0到9999。S1是加按键,按下此按键会依次增加当前窗口的参数。S5是减按键,按下此按键会依次减少当前窗口的参数。S9是切换窗口按键,按下此按键会依次循环切换不同的窗口。
  13. ----
  14. ---- 单片机:AT89C52
  15. ********************************************************************************************************************/
  16. #include "reg52.h"
  17. /*——————宏定义——————*/
  18. #define FOSC 11059200L
  19. #define BAUD 9600
  20. #define T1MS (65536-FOSC/12/500) /*0.5ms timer calculation method in 12Tmode*/
  21. #define OP_READ 0xa1 /*器件地址以及读取操作,0xa1即为1010 0001B*/
  22. #define OP_WRITE 0xa0 /*器件地址以及写入操作,0xa0即为1010 0000B*/
  23. #define const_key_time1 9 /*按键去抖动延时的时间*/
  24. #define const_key_time2 9 /*按键去抖动延时的时间*/
  25. #define const_key_time3 9 /*按键去抖动延时的时间*/
  26. #define const_voice_short 20 /*蜂鸣器短叫的持续时间*/
  27. /*——————变量函数定义及声明——————*/
  28. /*蜂鸣器的驱动IO口*/
  29. sbit BEEP = P2^7;
  30. /*LED*/
  31. sbit LED = P3^5;
  32. /*按键*/
  33. sbit Key_S1 = P0^0; /*对应S1键,加键*/
  34. sbit Key_S2 = P0^1; /*对应S5键,减键*/
  35. sbit Key_S3 = P0^2; /*对应S9键,切换窗口*/
  36. sbit Key_S4 = P0^3; /*对应S13键,复位*/
  37. sbit Key_Gnd = P0^4;
  38. /*数码管*/
  39. sbit Dig_Hc595_Sh = P2^0;
  40. sbit Dig_Hc595_St = P2^1;
  41. sbit Dig_Hc595_Ds = P2^2;
  42. /*EEPROM*/
  43. sbit eeprom_scl_dr = P3^7; /*时钟线*/
  44. sbit eeprom_sda_dr_sr = P3^6; /*数据的输出线和输入线*/
  45. unsigned char ucKeySec = 0; /*被触发的按键编号*/
  46. unsigned int uiKeyTimeCnt1 = 0; /*按键去抖动延时计数器*/
  47. unsigned char ucKeyLock1 = 0; /*按键触发后自锁的变量标志*/
  48. unsigned int uiKeyTimeCnt2 = 0; /*按键去抖动延时计数器*/
  49. unsigned char ucKeyLock2 = 0; /*按键触发后自锁的变量标志*/
  50. unsigned int uiKeyTimeCnt3 = 0; /*按键去抖动延时计数器*/
  51. unsigned char ucKeyLock3 = 0; /*按键触发后自锁的变量标志*/
  52. unsigned int uiVoiceCnt = 0; /*蜂鸣器鸣叫的持续时间计数器*/
  53. unsigned char ucVoiceLock = 0; /*蜂鸣器鸣叫的原子锁*/
  54. unsigned char ucDigShow8; /*第8位数码管要显示的内容*/
  55. unsigned char ucDigShow7; /*第7位数码管要显示的内容*/
  56. unsigned char ucDigShow6; /*第6位数码管要显示的内容*/
  57. unsigned char ucDigShow5; /*第5位数码管要显示的内容*/
  58. unsigned char ucDigShow4; /*第4位数码管要显示的内容*/
  59. unsigned char ucDigShow3; /*第3位数码管要显示的内容*/
  60. unsigned char ucDigShow2; /*第2位数码管要显示的内容*/
  61. unsigned char ucDigShow1; /*第1位数码管要显示的内容*/
  62. unsigned char ucDigDot8; /*数码管8的小数点是否显示的标志*/
  63. unsigned char ucDigDot7; /*数码管7的小数点是否显示的标志*/
  64. unsigned char ucDigDot6; /*数码管6的小数点是否显示的标志*/
  65. unsigned char ucDigDot5; /*数码管5的小数点是否显示的标志*/
  66. unsigned char ucDigDot4; /*数码管4的小数点是否显示的标志*/
  67. unsigned char ucDigDot3; /*数码管3的小数点是否显示的标志*/
  68. unsigned char ucDigDot2; /*数码管2的小数点是否显示的标志*/
  69. unsigned char ucDigDot1; /*数码管1的小数点是否显示的标志*/
  70. unsigned char ucDigShowTemp = 0; /*临时中间变量*/
  71. unsigned char ucDisplayDriveStep = 1; /*动态扫描数码管的步骤变量*/
  72. unsigned char ucWd1Update = 1; /*窗口1更新显示标志*/
  73. unsigned char ucWd2Update = 0; /*窗口2更新显示标志*/
  74. unsigned char ucWd3Update = 0; /*窗口3更新显示标志*/
  75. unsigned char ucWd4Update = 0; /*窗口4更新显示标志*/
  76. unsigned char ucWd = 1; /*本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。*/
  77. unsigned int uiSetData1 = 0; /*本程序中需要被设置的参数1*/
  78. unsigned int uiSetData2 = 0; /*本程序中需要被设置的参数2*/
  79. unsigned int uiSetData3 = 0; /*本程序中需要被设置的参数3*/
  80. unsigned int uiSetData4 = 0; /*本程序中需要被设置的参数4*/
  81. unsigned char ucTemp1 = 0; /*中间过渡变量*/
  82. unsigned char ucTemp2 = 0; /*中间过渡变量*/
  83. unsigned char ucTemp3 = 0; /*中间过渡变量*/
  84. unsigned char ucTemp4 = 0; /*中间过渡变量*/
  85. void Dig_Hc595_Drive(unsigned char, unsigned char);
  86. /*根据原理图得出的共阴数码管字模表*/
  87. code unsigned char Dig_Table[] =
  88. {
  89. 0x3f, /*0 序号0*/
  90. 0x06, /*1 序号1*/
  91. 0x5b, /*2 序号2*/
  92. 0x4f, /*3 序号3*/
  93. 0x66, /*4 序号4*/
  94. 0x6d, /*5 序号5*/
  95. 0x7d, /*6 序号6*/
  96. 0x07, /*7 序号7*/
  97. 0x7f, /*8 序号8*/
  98. 0x6f, /*9 序号9*/
  99. 0x00, /*不显示 序号10*/
  100. 0x40, /*- 序号11*/
  101. 0x73, /*P 序号12*/
  102. };
  103. /**
  104. * @brief 延时函数
  105. * @param 无
  106. * @retval 无
  107. **/
  108. void Delay_Long(unsigned int uiDelayLong)
  109. {
  110. unsigned int i;
  111. unsigned int j;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/456018
推荐阅读
相关标签
  

闽ICP备14008679号