找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

  [复制链接]
跳转到指定楼层
楼主
ID:977804 发表于 2022-2-19 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
论坛看到一个朋友上传了这个的代码,但是他的里面有些串口不相关的部分,我这个EEPROM只有最简单的一个按键,一个LED,
题外话,一个C里面多个H文件时,先用到的H,在C文件里先包含,

单片机源程序如下:
//说明
//  定义了一个BIT 位 y,上电读取y值 ,附给LED,
//  按键切换LED状态,
//  断电,重新上电,如果成功,LED则会还原断电前状态

#include<STC15W.H>
#include <intrins.h>  
#include<STC15EEPROM.H>        
#include<KEY_02.H>        

sbit led=P2^2;

void main()
{
        y=DU_eeprom(0x0400);   //上电,读一次数值

        while(1)
        {
        led=y;                                   //把读到的数附给led
        Key_Scan2();
        }
        
}




#ifndef __STC15EEPROM_H__
#define __STC15EEPROM_H__


//sfr  IAP_DATA=  0XC2;
//sfr  IAP_ADDRH        =   0XC3;
//sfr  IAP_ADDRL        =   0XC4;
//sfr  IAP_CMD   =   0XC5;
//sfr  IAP_TRIG  =    0XC6;
//sfr  IAP_CONTR        =  0XC7;


#define ENABLE_IAP 0x82
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3



typedef unsigned char BYTE;
typedef unsigned int WORD;
//Byte IapReadByte(WORD addr);
//#define IAP_ADDRESS 0x0400
//BYTE IapReadByte(WORD addr);


// 关闭 IAP
void iapidle()
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0X80;
IAP_ADDRL=0;
}

//  读一个字节
BYTE DU_eeprom(WORD addr)
{
BYTE dat;
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0XA5;
_nop_();
dat=IAP_DATA;
iapidle();

return dat;

}

//  写一个字节
void XIE_eeprom(WORD addr,BYTE dat)
{

IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0X5a;
IAP_TRIG=0XA5;
_nop_();

iapidle();
}

//  扇区擦除
void CA_eeprom(WORD addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;

IAP_TRIG=0X5a;
IAP_TRIG=0XA5;
_nop_();

iapidle();
}




#endif






#ifndef __KEY_02_H__
#define ___KEY_02_H__

#define u8 unsigned char
sbit KEY_02=P3^4;
bit y;

void Key_Scan2()        ///////////////////////////////////按键1
{
        static u8 j2=0,k2=0;

        if(KEY_02==0)
        {
                if(j2==0)
                {
                        if(KEY_02==0&&k2++>=20)
                        {
                            j2=1;
                                                        y=~y;
                                                        CA_eeprom(0x0400);        //先擦
                                                        XIE_eeprom(0x0400,y);        //再写
                        }                       
                }
        }
        else  //按键释放
        {
                j2=0;
                k2=0;
        }
}



#endif


以上的Keil代码工程下载: 3 单独测试EEPROM -把其他的H文件删了.rar (23.6 KB, 下载次数: 84)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:230500 发表于 2022-3-5 15:13 | 只看该作者
不错, 值得我们这些新手学习了解!
回复

使用道具 举报

板凳
ID:399179 发表于 2022-3-23 21:11 来自手机 | 只看该作者
一直无法实现
回复

使用道具 举报

地板
ID:977804 发表于 2022-3-23 22:16 来自手机 | 只看该作者
快乐眼泪 发表于 2022-3-23 21:11
一直无法实现

你是完全用的我这个代码吗?单片机是这个型号吗?我测试是正常可用,才发上来的,可惜这个型号没有仿真,
回复

使用道具 举报

5#
ID:977804 发表于 2022-3-23 22:18 来自手机 | 只看该作者
a399288395 发表于 2022-3-5 15:13
不错, 值得我们这些新手学习了解!

同是新手,我也是东拼西凑的
回复

使用道具 举报

6#
ID:960619 发表于 2022-3-23 23:00 来自手机 | 只看该作者
Stc的E2PROM在官方下载软件有现成的。
回复

使用道具 举报

7#
ID:977804 发表于 2022-3-24 08:22 来自手机 | 只看该作者
baobao125 发表于 2022-3-23 23:00
Stc的E2PROM在官方下载软件有现成的。

这就是官方手册里抄来的,但是改了判断方法,只用。只用一个按键,一个led来判断掉电保存是否正常。
回复

使用道具 举报

8#
ID:796012 发表于 2022-5-17 16:02 | 只看该作者
我实验可以了,只是要两只按键控制,1开2关,任意按键保存0或1就可以了。只是欠缺掉电检测
回复

使用道具 举报

9#
ID:795427 发表于 2023-1-19 13:05 | 只看该作者
手册上,STC15W408AS的 EEPROM起始扇区地址在:0x2000,你的程序的 EEPROM起始扇区地址写的是0x400,该起始地址对应的是STC15W401AS型号的才对。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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