本帖最后由 qq986433936 于 2020-12-19 21:08 编辑
应该没啥问题啊。给你贴个我正常使用的测试程序。可以从串口观察读出的数值是否正确。
//艾瑞泽5自动大灯编程
//STC8G1K08A_SOP8,晶振频率11.0592mhz,串口波特率115200
//使用了STC的资料及程序
#include <STC8G.H>
#include "intrins.h"
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar Mem1,Mem2,Mem3;
uchar EEPROM_READ(uint); //读指定地址的一个字节
void EEPROM_IDLE(void); //关闭EEPROM操作
void EEPROM_WRITE(uint, uchar); //向指定地址写入一个字节
void EEPROM_ERASE(uint); //擦除指定地址的扇区
void Delay100ms(void); //@11.0592MHZ
//_____________程序开始_____________________
void main(void)
{
_nop_();
_nop_();
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xFE; //设定定时初值115200@11.0592MHZ
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
TI = 1; //允许串口中断,printf函数需要此条语句
EA = 1; //总中断开关打开
while(1) //EEPROM读写测试
{
EEPROM_ERASE(0x0); //擦除指定地址的扇区
EEPROM_WRITE(0x01,0x7F); //向指定地址写入0x7f
EEPROM_WRITE(0x02,0xAA); //向指定地址写入0xAA
EEPROM_WRITE(0x03,0x55); //向指定地址写入0x55
Mem1 =0;
Mem2 =0;
Mem3 =0;
Mem1 = EEPROM_READ(0x01); //读入存储的3个数值
Mem2 = EEPROM_READ(0x02);
Mem3 = EEPROM_READ(0x03);
printf("Mem1:%X ",(uint)Mem1);
printf("Mem2:%X ",(uint)Mem2);
printf("Mem3:%X ",(uint)Mem3);
printf("\n"); //回车换行
Delay100ms();
}
}
//******************************************
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 6;
j = 157;
k = 59;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//********以下是EEPROM操作函数,全部通过,无需再改
//关闭ISP/IAP/EEPROM功能
void EEPROM_IDLE(void)
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //standby模式
IAP_TRIG = 0; //清触发寄存器
IAP_ADDRH = 0x80; //指向非EEPROM地址区,防止误操作
IAP_ADDRL = 0;
}
//从指定的EEPROM地址Eeprom_Addr读取一个字节
uchar EEPROM_READ(uint Eeprom_Addr)
{
uchar dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; // 设置擦除等待参数 12MHz
IAP_CMD = 1; //读命令
IAP_ADDRL = Eeprom_Addr; //地址低8位
IAP_ADDRH = Eeprom_Addr>>8; //地址高8位
IAP_TRIG = 0x5a; //触发命令
IAP_TRIG = 0xa5;
_nop_();
dat = IAP_DATA; //读取EEPROM数据
EEPROM_IDLE(); //关闭IAP
return dat;
}
//说明:Eeprom_Addr写入一个字节
//注意,在此之前一定要先擦除扇区
void EEPROM_WRITE(uint Eeprom_Addr, uchar dat)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; // 设置擦除等待参数 12MHz
IAP_CMD = 2; //编程命令
IAP_ADDRL = Eeprom_Addr; //地址低8位
IAP_ADDRH = Eeprom_Addr>>8; //地址高8位
IAP_DATA = dat; //写入数据
IAP_TRIG = 0x5a; //触发命令
IAP_TRIG = 0xa5;
_nop_();
EEPROM_IDLE(); //关闭IAP
}
//擦除扇区,Eeprom_Addr为扇区起始地址
void EEPROM_ERASE(uint Eeprom_Addr)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; // 设置擦除等待参数 12MHz
IAP_CMD = 3; //擦除命令
IAP_ADDRL = Eeprom_Addr; //地址低8位
IAP_ADDRH = Eeprom_Addr>>8; //地址高8位
IAP_TRIG = 0x5a; //触发命令
IAP_TRIG = 0xa5;
_nop_();
EEPROM_IDLE(); //关闭IAP
}
|