找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC89C52单片机内部EEPROM存储大于256 6位数存储实例 24C02也可以参考

  [复制链接]
跳转到指定楼层
楼主



部分程序

  1. #include <reg52.h>           //此文件中定义了单片机的一些特殊功能寄存器
  2. #include "STC89C52_EEPROM.h" //STC89C52内部存储驱动
  3. #include "delay.h"           //调用延时函数
  4. #define uchar unsigned char  //宏定义无符号字符形数据类型进行声明定义 定义名称uchar 所占位数8位 范围0~255
  5. #define uint unsigned int    //宏定义无符号整形数据类型进行声明定义 定义名称uint 所占位数16位 范围0~65535
  6. #define ulong unsigned long int //宏定义无符号长整形数据类型进行声明定义 定义名称ulong 所占位数32位 范围0~4294967295
  7. /*按键IO引脚定义*/
  8. sbit LSA=P2^2;
  9. sbit LSB=P2^3;
  10. sbit LSC=P2^4;
  11. sbit k1=P3^0;  //加按键
  12. sbit k2=P3^1;  //减按键
  13. sbit k3=P3^2;  //保存数据按键
  14. sbit k4=P3^3;  //读取数据按键
  15. uchar code duan_ma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示0~9的值
  16. uchar duan_ma_wei[6]; //存储记录数码管6个段码位的值
  17. ulong K_num;          //记录存储按键按下的数值
  18. ulong num[6];         //把按键的数值分散给与num6个组数
  19. /*数据结合处理*/
  20. void shujujiehe()
  21. {
  22.   K_num=num[0]+num[1]*10+num[2]*100+num[3]*1000+num[4]*10000+num[5]*100000;
  23. }
  24. /*数据分散处理*/
  25. void shujufensan()
  26. {
  27. num[0]=K_num%10;             //分散K_num数值给与num[0]      
  28. num[1]=K_num%100/10;         //分散K_num数值给与num[1]   
  29. num[2]=K_num%1000/100;       //分散K_num数值给与num[2]   
  30. num[3]=K_num%10000/1000;     //分散K_num数值给与num[3]
  31. num[4]=K_num%100000/10000;   //分散K_num数值给与num[4]
  32. num[5]=K_num%1000000/100000; //分散K_num数值给与num[5]
  33. }
  34. /*读出EEPROM扇区*/
  35. void EEPROM_Read()
  36. {
  37. num[0]=IapReadByte(0x2000); //读出EEPROM  2000扇区      
  38. num[1]=IapReadByte(0x2001); //读出EEPROM  2001扇区
  39. num[2]=IapReadByte(0x2002); //读出EEPROM  2002扇区
  40. num[3]=IapReadByte(0x2003); //读出EEPROM  2003扇区
  41. num[4]=IapReadByte(0x2004); //读出EEPROM  2004扇区
  42. num[5]=IapReadByte(0x2005); //读出EEPROM  2005扇区
  43. }
  44. /*按键设置*/
  45. void anjian()
  46. {
  47. if(k1==0)                         //判断按键是否按下
  48. {
  49.   delay_ms(10);                  //按键消抖延时
  50.   if(k1==0)                      //如果按键真的按下
  51.   {
  52.     if(K_num<999900)K_num=K_num+100;
  53.    else(K_num=0);
  54.    shujufensan();               //数据分散处理
  55.   }
  56. }
  57. if(k2==0)                        //判断按键是否按下
  58. {
  59.   delay_ms(10);                  //按键消抖延时
  60.    if(k2==0)                      //如果按键真的按下
  61.   {
  62.     if(K_num>0)K_num=K_num-100;
  63.    else(K_num=999900);
  64.    shujufensan();               //数据分散处理
  65.   }
  66. }
  67. if(k3==0)                    //判断按键是否按下  
  68. {              
  69.    delay_ms(10);             //按键消抖延时
  70.   if(k3==0)                 //如果按键真的按下
  71.   {
  72.    IapEraseSector(0x2000);        //2000扇区擦除
  73.    IapEraseSector(0x2001);        //2001扇区擦除
  74.    IapEraseSector(0x2002);        //2002扇区擦除
  75.    IapEraseSector(0x2003);        //2003扇区擦除
  76.    IapEraseSector(0x2004);        //2004扇区擦除
  77.    IapEraseSector(0x2005);        //2005扇区擦除
  78.    
  79.    IapProgramByte(0x2000,num[0]); //将分散好后的num[0]存储到EEPROM 2000扇区
  80.    IapProgramByte(0x2001,num[1]); //将分散好后的num[1]存储到EEPROM 2001扇区
  81.    IapProgramByte(0x2002,num[2]); //将分散好后的num[2]存储到EEPROM 2002扇区
  82.    IapProgramByte(0x2003,num[3]); //将分散好后的num[3]存储到EEPROM 2003扇区
  83.    IapProgramByte(0x2004,num[4]); //将分散好后的num[4]存储到EEPROM 2004扇区
  84.    IapProgramByte(0x2005,num[5]); //将分散好后的num[5]存储到EEPROM 2005扇区
  85.   }
  86.   while(!k1);               //判断按键是否松开
  87. }

  88. if(k4==0)           //判断按键是否按下
  89. {
  90.    delay_ms(10);     //按键消抖延时
  91.   if(k4==0)         //如果按键真的按下
  92.   {
  93.     EEPROM_Read(); //读出EEPROM扇区
  94.   }
  95.    while(!k4);      //判断按键是否松开
  96. }
  97. }
  98. /*主函数*/
  99. void main()
  100. {
  101. uchar i;
  102.   EEPROM_Read(); //开机读出EEPROM扇区
  103. shujujiehe();  //开机读数据结合处理
  104. while(1) //循环
  105. {
  106.   anjian(); //读按键设置
  107.   duan_ma_wei[0]=duan_ma[num[5]]; //数码管显示
  108.   duan_ma_wei[1]=duan_ma[num[4]]; //数码管显示
  109.     duan_ma_wei[2]=duan_ma[num[3]]; //数码管显示
  110.     duan_ma_wei[3]=duan_ma[num[2]]; //数码管显示
  111.   duan_ma_wei[4]=duan_ma[num[1]]; //数码管显示
  112.   duan_ma_wei[5]=duan_ma[num[0]]; //数码管显示
  113.   
  114.   for(i=0;i<6;i++)   //对数码管进行动态扫描
  115.     {
  116.    switch(i)  //位选,选择点亮的数码管,
  117.     {
  118.     case(0):LSA=1;LSB=0;LSC=1;break;//显示第1位
  119.     case(1):LSA=0;LSB=0;LSC=1;break;//显示第2位
  120.     case(2):LSA=1;LSB=1;LSC=0;break;//显示第3位
  121.     case(3):LSA=0;LSB=1;LSC=0;break;//显示第4位
  122.     case(4):LSA=1;LSB=0;LSC=0;break;//显示第5位
  123.      case(5):LSA=0;LSB=0;LSC=0;break;//显示第6位  
  124.     }
  125.       P0=duan_ma_wei[i]; //发送段码
  126.       delay_ms(1);
  127.     P0=0x00; //消隐
  128.   }
  129. }   
  130. }
复制代码

数码管 4位 STC 89C52内部EEPROM 6位存储显示 共阳共阴 74LS138(开发板).zip

43.9 KB, 下载次数: 88, 下载积分: 黑币 -5

STC89C52单片机内部EEPROM存储大于256 6位数存储实例

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:66287 发表于 2020-4-10 08:28 | 只看该作者
"STC89C52_EEPROM.h"函数?
回复

使用道具 举报

板凳
ID:468209 发表于 2020-4-10 18:35 来自手机 | 只看该作者
bhjyqjs 发表于 2020-4-10 08:28
"STC89C52_EEPROM.h"函数?

上不了附件 不知何解  那只有一个头文件 STC烧录器有程序 复制过来就好
回复

使用道具 举报

地板
ID:34298 发表于 2020-4-10 22:56 | 只看该作者
建立一个压缩包就传上去了
回复

使用道具 举报

5#
ID:468209 发表于 2020-4-11 22:05 来自手机 | 只看该作者
fancunwu 发表于 2020-4-10 22:56
建立一个压缩包就传上去了

建立了 有空再搞下吧
回复

使用道具 举报

6#
ID:468209 发表于 2020-4-12 19:00 | 只看该作者
附件 已补全
回复

使用道具 举报

7#
ID:856401 发表于 2021-3-26 08:02 | 只看该作者
新的一天,从学习51单片机开始
回复

使用道具 举报

8#
ID:168911 发表于 2021-3-26 23:08 | 只看该作者
这个读写有次数寿命吗?
回复

使用道具 举报

9#
ID:468209 发表于 2021-3-27 20:19 来自手机 | 只看该作者
老当益壮 发表于 2021-3-26 23:08
这个读写有次数寿命吗?

不知啊 能等到写坏 都天荒地老了吧 怕写坏可以用外置存储
回复

使用道具 举报

10#
ID:168911 发表于 2021-5-27 00:33 | 只看该作者
24c02的我做了一个计数器,除非是断电并且数字改变的情况下储存一次,其余正常计数时不读写,
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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