8H8K64U 发表于 2024-12-25 10:03:01

zwf33335 发表于 2024-12-25 09:32
非常感谢您,提供的这些注意事项,我按照您的提示调试,另外还请教一个,STC8H1K28的EEPROM的大小由下载 ...


您参考这个资料,应该可以明白哈

zwf33335 发表于 2024-12-26 02:12:04

8H8K64U 发表于 2024-12-25 10:03
您参考这个资料,应该可以明白哈

谢谢、谢谢{:baoquan:}

xxkj2010 发表于 2024-12-26 08:49:35

用MAX6675比较好用、方便

小坤 发表于 2024-12-26 08:52:43

zwf33335 发表于 2024-12-25 09:32
非常感谢您,提供的这些注意事项,我按照您的提示调试,另外还请教一个,STC8H1K28的EEPROM的大小由下载 ...

起始地址都是从0x0000开始的

zwf33335 发表于 2025-1-3 19:54:40

小坤 发表于 2024-12-26 08:52
起始地址都是从0x0000开始的

感谢您,但现在还没存储上啊

zwf33335 发表于 2025-1-3 20:03:46

8H8K64U 发表于 2024-12-25 10:03
您参考这个资料,应该可以明白哈
版主老师,又遇到一个问题,上电时,输出端误动作一下,程序端口都关闭了,上电还是动一下,我把电路图图片传上去,请教您看是哪里问题,谢谢,DC电源接的是24V电压

小坤 发表于 2025-1-4 08:36:29

小坤 发表于 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

小坤 发表于 2025-1-4 08:38:01

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]
查看完整版本: 各位大佬给些建议,关于加热器温度控制器的开发。