非常感谢您,提供的这些注意事项,我按照您的提示调试,另外还请教一个,STC8H1K28的EEPROM的大小由下载 ...
您参考这个资料,应该可以明白哈
8H8K64U 发表于 2024-12-25 10:03
您参考这个资料,应该可以明白哈
谢谢、谢谢{:baoquan:} 用MAX6675比较好用、方便 zwf33335 发表于 2024-12-25 09:32
非常感谢您,提供的这些注意事项,我按照您的提示调试,另外还请教一个,STC8H1K28的EEPROM的大小由下载 ...
起始地址都是从0x0000开始的 小坤 发表于 2024-12-26 08:52
起始地址都是从0x0000开始的
感谢您,但现在还没存储上啊 8H8K64U 发表于 2024-12-25 10:03
您参考这个资料,应该可以明白哈
版主老师,又遇到一个问题,上电时,输出端误动作一下,程序端口都关闭了,上电还是动一下,我把电路图图片传上去,请教您看是哪里问题,谢谢,DC电源接的是24V电压 小坤 发表于 2024-12-26 08:52
起始地址都是从0x0000开始的
这个是官方的库函数直接调用,
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com---------------------------------------*/
/* --- QQ:800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
#include "STC8G_H_EEPROM.h"
//========================================================================
// 函数: void ISP_Disable(void)
// 描述: 禁止访问ISP/IAP.
// 参数: non.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void DisableEEPROM(void)
{
IAP_CONTR = 0; //禁止IAP操作
IAP_CMD = 0; //去除IAP命令
IAP_TRIG= 0; //防止IAP命令误触发
IAP_ADDRH = 0xff; //清0地址高字节
IAP_ADDRL = 0xff; //清0地址低字节,指向非EEPROM区,防止误操作
}
//========================================================================
// 函数: void EEPROM_Trig(void)
// 描述: 触发EEPROM操作.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2014-6-30
//========================================================================
void EEPROM_Trig(void)
{
F0 = EA; //保存全局中断
EA = 0; //禁止中断, 避免触发命令无效
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5; //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
//送完A5H后,IAP命令立即被触发启动
//CPU等待IAP完成后,才会继续执行程序。
_nop_();
_nop_();
EA = F0; //恢复全局中断
}
//========================================================================
// 函数: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
// 描述: 从指定EEPROM首地址读出n个字节放指定的缓冲.
// 参数: EE_address:读出EEPROM的首地址.
// DataAddress: 读出数据放缓冲的首地址.
// number: 读出的字节长度.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
{
IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
IAP_READ(); //送字节读命令,命令不需改变时,不需重新送命令
do
{
IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送地址低字节
EEPROM_Trig(); //触发EEPROM操作
*DataAddress = IAP_DATA; //读出的数据送往
EE_address++;
DataAddress++;
}while(--number);
DisableEEPROM();
}
//========================================================================
// 函数: void EEPROM_SectorErase(u16 EE_address)
// 描述: 把指定地址的EEPROM扇区擦除.
// 参数: EE_address:要擦除的扇区EEPROM的地址.
// 返回: non.
// 版本: V1.0, 2013-5-10
//========================================================================
void EEPROM_SectorErase(u16 EE_address)
{
IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
IAP_ERASE(); //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
//只有扇区擦除,没有字节擦除,512字节/扇区。
//扇区中任意一个字节地址都是扇区地址。
IAP_ADDRH = EE_address / 256; //送扇区地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送扇区地址低字节
EEPROM_Trig(); //触发EEPROM操作
DisableEEPROM(); //禁止EEPROM操作
}
//========================================================================
// 函数: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
// 描述: 把缓冲的n个字节写入指定首地址的EEPROM.
// 参数: EE_address:写入EEPROM的首地址.
// DataAddress: 写入源数据的缓冲的首地址.
// number: 写入的字节长度.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
{
EEPROM_SectorErase(EE_address);
IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
IAP_WRITE(); //宏调用, 送字节写命令
do
{
IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送地址低字节
IAP_DATA= *DataAddress; //送数据到IAP_DATA,只有数据改变时才需重新送
EEPROM_Trig(); //触发EEPROM操作
EE_address++; //下一个地址
DataAddress++; //下一个数据
}while(--number); //直到结束
DisableEEPROM();
}/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com---------------------------------------*/
/* --- QQ:800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
#ifndef __EEPROM_H
#define __EEPROM_H
#include "config.h"
//========================================================================
// 定义声明
//========================================================================
#define STC8X1K08 8
#define STC8X1K16 16
#define STC8XxK32 32
#define STC8XxK60 60
// 选择MCU型号
#define MCU_Type STC8X1K08//STC8X1K08, STC8X1K16, STC8XxK32, STC8XxK32, STC8XxK60
/************************** ISP/IAP *****************************
型号 大小扇区数开始地址 结束地址 MOVC读偏移地址
STC8X1K08 4K 8扇区 0x0000~0x0FFF 0x2000
STC8X1K1612K 24扇区0x0000~0x2FFF 0x4000
STC8XxK3232K 64扇区0x0000~0x7FFF 0x8000
STC8XxK60 4K 8扇区 0x0000~0x0FFF 0xF000
*/
#if (MCU_Type == STC8X1K08)
#define MOVC_ShiftAddress 0x2000
#elif (MCU_Type == STC8X1K16)
#define MOVC_ShiftAddress 0x4000
#elif (MCU_Type == STC8XxK32)
#define MOVC_ShiftAddress 0x8000
#elif (MCU_Type == STC8XxK60)
#define MOVC_ShiftAddress 0xF000
#else
#define MOVC_ShiftAddress 0xC000 //用户自定义
#endif
void DisableEEPROM(void);
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number);
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number);
void EEPROM_SectorErase(u16 EE_address);
#endif zwf33335 发表于 2025-1-3 19:54
感谢您,但现在还没存储上啊
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com---------------------------------------*/
/* --- QQ:800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
#include "STC8G_H_EEPROM.h"
//========================================================================
// 函数: void ISP_Disable(void)
// 描述: 禁止访问ISP/IAP.
// 参数: non.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void DisableEEPROM(void)
{
IAP_CONTR = 0; //禁止IAP操作
IAP_CMD = 0; //去除IAP命令
IAP_TRIG= 0; //防止IAP命令误触发
IAP_ADDRH = 0xff; //清0地址高字节
IAP_ADDRL = 0xff; //清0地址低字节,指向非EEPROM区,防止误操作
}
//========================================================================
// 函数: void EEPROM_Trig(void)
// 描述: 触发EEPROM操作.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2014-6-30
//========================================================================
void EEPROM_Trig(void)
{
F0 = EA; //保存全局中断
EA = 0; //禁止中断, 避免触发命令无效
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5; //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
//送完A5H后,IAP命令立即被触发启动
//CPU等待IAP完成后,才会继续执行程序。
_nop_();
_nop_();
EA = F0; //恢复全局中断
}
//========================================================================
// 函数: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
// 描述: 从指定EEPROM首地址读出n个字节放指定的缓冲.
// 参数: EE_address:读出EEPROM的首地址.
// DataAddress: 读出数据放缓冲的首地址.
// number: 读出的字节长度.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
{
IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
IAP_READ(); //送字节读命令,命令不需改变时,不需重新送命令
do
{
IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送地址低字节
EEPROM_Trig(); //触发EEPROM操作
*DataAddress = IAP_DATA; //读出的数据送往
EE_address++;
DataAddress++;
}while(--number);
DisableEEPROM();
}
//========================================================================
// 函数: void EEPROM_SectorErase(u16 EE_address)
// 描述: 把指定地址的EEPROM扇区擦除.
// 参数: EE_address:要擦除的扇区EEPROM的地址.
// 返回: non.
// 版本: V1.0, 2013-5-10
//========================================================================
void EEPROM_SectorErase(u16 EE_address)
{
IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
IAP_ERASE(); //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
//只有扇区擦除,没有字节擦除,512字节/扇区。
//扇区中任意一个字节地址都是扇区地址。
IAP_ADDRH = EE_address / 256; //送扇区地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送扇区地址低字节
EEPROM_Trig(); //触发EEPROM操作
DisableEEPROM(); //禁止EEPROM操作
}
//========================================================================
// 函数: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
// 描述: 把缓冲的n个字节写入指定首地址的EEPROM.
// 参数: EE_address:写入EEPROM的首地址.
// DataAddress: 写入源数据的缓冲的首地址.
// number: 写入的字节长度.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
{
EEPROM_SectorErase(EE_address);
IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
IAP_WRITE(); //宏调用, 送字节写命令
do
{
IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送地址低字节
IAP_DATA= *DataAddress; //送数据到IAP_DATA,只有数据改变时才需重新送
EEPROM_Trig(); //触发EEPROM操作
EE_address++; //下一个地址
DataAddress++; //下一个数据
}while(--number); //直到结束
DisableEEPROM();
}
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com---------------------------------------*/
/* --- QQ:800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
#ifndef __EEPROM_H
#define __EEPROM_H
#include "config.h"
//========================================================================
// 定义声明
//========================================================================
#define STC8X1K08 8
#define STC8X1K16 16
#define STC8XxK32 32
#define STC8XxK60 60
// 选择MCU型号
#define MCU_Type STC8X1K08//STC8X1K08, STC8X1K16, STC8XxK32, STC8XxK32, STC8XxK60
/************************** ISP/IAP *****************************
型号 大小扇区数开始地址 结束地址 MOVC读偏移地址
STC8X1K08 4K 8扇区 0x0000~0x0FFF 0x2000
STC8X1K1612K 24扇区0x0000~0x2FFF 0x4000
STC8XxK3232K 64扇区0x0000~0x7FFF 0x8000
STC8XxK60 4K 8扇区 0x0000~0x0FFF 0xF000
*/
#if (MCU_Type == STC8X1K08)
#define MOVC_ShiftAddress 0x2000
#elif (MCU_Type == STC8X1K16)
#define MOVC_ShiftAddress 0x4000
#elif (MCU_Type == STC8XxK32)
#define MOVC_ShiftAddress 0x8000
#elif (MCU_Type == STC8XxK60)
#define MOVC_ShiftAddress 0xF000
#else
#define MOVC_ShiftAddress 0xC000 //用户自定义
#endif
void DisableEEPROM(void);
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number);
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number);
void EEPROM_SectorErase(u16 EE_address);
#endif
直接用。
页:
1
[2]