STC12C5A60S2单片机的内置EEPROM的使用

    xiaoxiao2025-10-09  4

            EEPROM可以用来存储一些需要在掉电以后不丢失的数据,STC12C5A60S2单片机内部有1k byte的EEPROM,2个扇区,在编程的时候注意,对于一个扇区的数据都要一起写进去,即使不改也要重新写。

    测试的代码:

    #include <STC12C5A.H>

    #include"intrins.h"

    #include<stdio.h>  

     

    #define uchar unsigned char

    #define uint unsigned int

    #define ADC_POWER  0x80

    #define ADC_FLAG   0x10

    #define ADC_START  0x08

    #define CMD_IDLE 0     //IAP等待

    #define CMD_READ 1     //读flash

    #define CMD_PROGRAM  2   //写入

    #define CMD_ERASE 3    //擦除

    #define IAP_EN 0x83

    #define iap_ADDRESS 0x0000           //地址        

    char  td[10]= {'a','b','c','d','e','f','g','h','j','k'};

     

    void delay(int k)    //延时函数

    {

        int i,j;

        for(i=0; i<184; i++)

            for(j=0; j<k; j++);

    }

    //使硬件或软件操作停止

    void iap_IDLE()

    {

        IAP_CONTR=0;  //禁止IAP读写擦除

        IAP_CMD=0;  //等待

        IAP_TRIG=0;  //命令未触发

        IAP_ADDRH=0x80;  //高位数据地址

        IAP_ADDRL=0;     //低位

    }

    //从数据里面读取数据

    uchar iap_READ(uint addr)

    {   uchar datas;

        IAP_CONTR=IAP_EN; //控制允许位

        IAP_CMD=CMD_READ;   //写入读命令

        IAP_ADDRL=addr;  //自定义地址

        IAP_ADDRH=addr>>8;

        IAP_TRIG=0x5a;  //命令有效

        IAP_TRIG=0xa5;

        _nop_();

        datas=IAP_DATA;

        iap_IDLE();

        return datas;  //返回读出的数据

    }

    //写一个比特ISP写到某个地方

    void iap_PROGRAM(uint addr,uchar datas)

    {

        IAP_CONTR=IAP_EN;

        IAP_CMD=CMD_PROGRAM;

        IAP_ADDRL=addr;

        IAP_ADDRH=addr>>8;

        IAP_DATA=datas;

        IAP_TRIG=0x5a;

        IAP_TRIG=0xa5;

        _nop_();

        iap_IDLE();

    }

    //擦掉某个区域

    void iap_ERASE(uint addr)

    {

        IAP_CONTR=IAP_EN;

        IAP_CMD=CMD_ERASE;

        IAP_ADDRL=addr;

        IAP_ADDRH=addr>>8;

        IAP_TRIG=0x5a;

        IAP_TRIG=0xa5;

        _nop_();

        iap_IDLE();

    }    

     

    void uart_init(void) //串口的初始化

        TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2 

        TH1=0xfd;//设置波特率为9600 

        TL1=0xfd; 

        TR1=1;//启动定时器/计数器1        

        SCON=0x50; //0101 0000.串口工作方式1,允许串行控制 

        PCON=0x00;//设置SMOD=0 

        IE=0x90; //CPU允许中断,串行允许中断     

        TI=1;//直接使用printf必须加入此句才能实现发送 

    }

    main()

        int i;

           iap_ERASE(iap_ADDRESS);      //擦除扇区

           for(i=0;i<10;i++)

           {

       iap_PROGRAM(iap_ADDRESS+i,td[i]);//向这个区间512字节里面写东西

           }

           uart_init();  //串口初始化

        while(1)

        {

             for(i=0;i<10;i++)

             {

             printf("iap_READ[%d]=%c \n",i,iap_READ(iap_ADDRESS+i)); //在串口上输出

          delay(1000); 

             }

        }

    }

    转载请注明原文地址: https://ju.6miu.com/read-1302997.html
    最新回复(0)