找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2673|回复: 6
收起左侧

STC15W408AS单片机的内部EEPROM使用程序

[复制链接]
ID:926564 发表于 2021-12-22 21:32 | 显示全部楼层 |阅读模式
  1. #include <STC15F2K60S2.H>
  2. #include <math.h>    //Keil library  
  3. #include <stdio.h>   //Keil library        

  4. #include "EEPROM.h"



  5. #define FOSC    11059200UL
  6. #define BAUD    115200
  7. #define     URMD    0           //0:使用定时器2作为波特率发生器
  8.                                 //1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
  9.                                 //2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器
  10.                                                                
  11.                                                                

  12. void InitUart();



  13. void main()
  14. {
  15.         uint datas;
  16.     uint i=0;
  17.         uint j=0;
  18.         uint m=0;
  19.         InitUart();
  20.         

  21.   while(EEPROM_init()==0);
  22.         TI=1;printf("Erase succeeded.\n");TI=0;                     //1111,1100 擦除成功

  23.     for (i=0; i<512; i++)           //编程512字节
  24.     {
  25.         IapProgramByte(IAP_ADDRESS+i,i);                                
  26.     }
  27. TI=1;printf("2");TI=0;                     //1111,1100 擦除成功
  28.     while (j<512)
  29.         {
  30.                 datas=IapReadByte(IAP_ADDRESS+j);
  31.                 TI=1;
  32.                 printf("%x:",IAP_ADDRESS+j);
  33.                 printf("%d\n",datas);
  34.                 TI=0;
  35.                 j++;
  36.                 Delay(1);
  37.         }
  38. }



  39. /*----------------------------
  40. 初始化串口
  41. ----------------------------*/
  42. void InitUart()
  43. {
  44.     SCON = 0x5a;                //设置串口为8位可变波特率
  45. #if URMD == 0
  46.     T2L = (65536 - (FOSC/4/BAUD));
  47.     T2H = (65536 - (FOSC/4/BAUD)) >> 8;
  48.     AUXR = 0x14;                //T2为1T模式, 并启动定时器2
  49.     AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
  50. #elif URMD == 1
  51.     AUXR = 0x40;                //定时器1为1T模式
  52.     TMOD = 0x00;                //定时器1为模式0(16位自动重载)
  53.     TL1 = (65536 - (FOSC/4/BAUD));
  54.     TH1 = (65536 - (FOSC/4/BAUD)) >> 8;
  55.     TR1 = 1;                    //定时器1开始启动
  56. #else
  57.     TMOD = 0x20;                //设置定时器1为8位自动重装载模式
  58.     AUXR = 0x40;                //定时器1为1T模式
  59.     TH1 = TL1 = (256 - (FOSC/32/BAUD));
  60.     TR1 = 1;
  61. #endif
  62. }
复制代码
  1. #include "EEPROM.h"
  2. /*----------------------------
  3. 软件延时
  4. ----------------------------*/
  5. void Delay(BYTE n)
  6. {
  7.     WORD x;

  8.     while (n--)
  9.     {
  10.         x = 0;
  11.         while (++x);
  12.     }
  13. }
  14. /*----------------------------
  15. 关闭IAP
  16. ----------------------------*/
  17. void IapIdle()
  18. {
  19.     IAP_CONTR = 0;                  //关闭IAP功能
  20.     IAP_CMD = 0;                    //清除命令寄存器
  21.     IAP_TRIG = 0;                   //清除触发寄存器
  22.     IAP_ADDRH = 0x80;               //将地址设置到非IAP区域
  23.     IAP_ADDRL = 0;
  24. }

  25. /*----------------------------
  26. 从ISP/IAP/EEPROM区域读取一字节
  27. ----------------------------*/
  28. uint IapReadByte(WORD addr)
  29. {
  30.     uchar dat;                       //数据缓冲区

  31.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  32.     IAP_CMD = CMD_READ;             //设置IAP命令
  33.     IAP_ADDRL = addr;               //设置IAP低地址
  34.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  35.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  36.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  37.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  38.     dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据
  39.     IapIdle();                      //关闭IAP功能

  40.     return dat;                     //返回
  41. }

  42. /*----------------------------
  43. 写一字节数据到ISP/IAP/EEPROM区域
  44. ----------------------------*/
  45. void IapProgramByte(WORD addr, BYTE dat)
  46. {
  47.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  48.     IAP_CMD = CMD_PROGRAM;          //设置IAP命令
  49.     IAP_ADDRL = addr;               //设置IAP低地址
  50.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  51.     IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据
  52.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  53.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  54.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  55.     IapIdle();
  56. }

  57. /*----------------------------
  58. 扇区擦除

  59. ----------------------------*/
  60. void IapEraseSector(WORD addr)
  61. {
  62.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  63.     IAP_CMD = CMD_ERASE;            //设置IAP命令
  64.     IAP_ADDRL = addr;               //设置IAP低地址
  65.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  66.     IAP_TRIG = 0x5a;                //写触发命令(0x5a),每次IAP操作时,都要对IAP_TRIG先写入5AH,再写入A5H,ISP/IAP命令才会生效。
  67.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  68.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  69.     IapIdle();
  70. }

  71. uint EEPROM_init()
  72. {
  73.         uint s;
  74.         IapEraseSector(IAP_ADDRESS);    //扇区擦除
  75.         TI=1;printf("扇区擦除\n");TI=0;
  76.        
  77.     for (s=0; s<512; s++)           //检测是否擦除成功(全FF检测)
  78.     {
  79.         if (IapReadByte(IAP_ADDRESS+s) != 0xff)
  80.                         return 0;
  81.         }
  82.    
  83.     Delay(10);                      //延时
  84.         return 1;
  85. }
复制代码


Keil代码下载: 内部EEPROM使用.rar (38.96 KB, 下载次数: 77)

评分

参与人数 2黑币 +22 收起 理由
jacky1124 + 12 很给力!
admin + 10 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:319585 发表于 2021-12-23 07:37 来自手机 | 显示全部楼层
这个stc的单片机不错,足够强大,附带很多东西
回复

使用道具 举报

ID:1005344 发表于 2022-2-16 01:22 来自手机 | 显示全部楼层
liesnake 发表于 2021-12-23 07:37
这个stc的单片机不错,足够强大,附带很多东西

谢谢分享。辛苦了
回复

使用道具 举报

ID:187370 发表于 2022-10-23 18:01 | 显示全部楼层
一次能存入大于256的数据吗?就是多字节
回复

使用道具 举报

ID:61207 发表于 2022-10-23 18:37 | 显示全部楼层
NewIdeas 发表于 2022-10-23 18:01
一次能存入大于256的数据吗?就是多字节

可以的
回复

使用道具 举报

ID:526108 发表于 2022-10-23 19:02 | 显示全部楼层
NewIdeas 发表于 2022-10-23 18:01
一次能存入大于256的数据吗?就是多字节

一次512字节
回复

使用道具 举报

ID:1042619 发表于 2022-10-24 15:46 | 显示全部楼层
    我习惯从STC开发工具包里面调用程序,稍微改改就可以拿来用
EIO$CQRKG4_D83]4N{PU1QV.png
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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