六位数存入EEPROM的问题 10
用的单片机是STC12C5A60S2,内部EEPROM两个扇区,第一扇区起始地址0000h,结束地址1ffh,第二扇区起始地址200h,结束地址3ffh。现在想把一个6位...
用的单片机是STC12C5A60S2,内部EEPROM两个扇区,第一扇区起始地址0000h,结束地址1ffh,第二扇区起始地址200h,结束地址3ffh。现在想把一个6位的十进制数如123456存入EEPROM,用C语言怎么实现?
展开
展开全部
#include<STC12C5A> //注意此处调用的为STC提供的STC12C5A系列库文件
#include<intrins.h>
typedef unsigned int WORD;
typedef unsigned char BYTE;
void EEPROM_Delay(BYTE n)
{
WORD x;
while(n--)
{
x=0;
while(++x);
}
}
void EEPROM_Idle(void) //使MCU处于一个安全的状态
{
IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG = 0;
IAP_ADDRH = 0x80;
IAP_ADDRL = 0;
}
BYTE EEPROM_ReadByte(WORD addr) //从EEPROM读一Byte数据 (地址)
{
BYTE dat;
IAP_CONTR = 0x81; //XTAL<=20M
IAP_CMD = 1; //读一字节
IAP_ADDRL = addr;
IAP_ADDRH = addr>>8;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_();
dat = IAP_DATA; //FLASH 数据寄存器
EEPROM_Idle();
return dat;
}
void EEPROM_ProgramByte(WORD addr,BYTE dat) //写数据到扇区, (地址 ,数据)
{
IAP_CONTR = 0x81; //设置等待时间
IAP_CMD = 2; //设置EEPROM程序指令
IAP_ADDRL = addr; //设置EEPROM地址低位
IAP_ADDRH = addr>>8; //设置EEPROM地址高位
IAP_DATA = dat; //写EEPROM数据
IAP_TRIG = 0x5a; //发送触发命令1
IAP_TRIG = 0xa5; //发送触发命令2
_nop_();
EEPROM_Idle();
}
void EEPROM_EraseSector(WORD addr) //抹去整个扇区 (输入扇区地址)
{
IAP_CONTR = 0x81; //打开EEPROM函数,设置延时
IAP_CMD = 3; //设置上去抹去命令
IAP_ADDRL = addr; //设置地址低位
IAP_ADDRH = addr>>8; //设置地址高位
IAP_TRIG = 0x5a; //写命令
IAP_TRIG = 0xa5;
_nop_();
EEPROM_Idle();
}
/****************************向扇区储存数据(123456)********************************/
char EEPROM_WriteSTA(void) //储存成功返回1(会删除以前整个扇区储存数的据)
{
long int x=0,sta=123456; //测试数据为123456
char a[4],i;
EEPROM_EraseSector(0x0000); //抹去1扇区数据
EEPROM_Delay(10);
a[0]=char((sta>>24)&&0xF); //最高位
a[1]=char((sta>>16)&&0xF);
a[2]=char((sta>>8)&&0xF);
a[3]=char(sta&&0xF); //最低位
EEPROM_ProgramByte(0x0000,a[0]); //储存数据
EEPROM_ProgramByte(0x0001,a[1]);
EEPROM_ProgramByte(0x0002,a[2]);
EEPROM_ProgramByte(0x0003,a[3]);
EEPROM_Delay(10);
a[0]=EEPROM_ReadByte(0x0000); //读数据
a[1]=EEPROM_ReadByte(0x0001);
a[2]=EEPROM_ReadByte(0x0002);
a[3]=EEPROM_ReadByte(0x0003);
x||=(long int a[0])<<24; //数据校验
x||=(long int a[1])<<16;
x||=(long int a[2])<<8;
x||=(long int a[0]);
if(x==sta) i=1;
else i=0;
return i;
}
//呵呵,个人观点。储存数据这段没有验证,其余程序已验证,仅供参考
#include<intrins.h>
typedef unsigned int WORD;
typedef unsigned char BYTE;
void EEPROM_Delay(BYTE n)
{
WORD x;
while(n--)
{
x=0;
while(++x);
}
}
void EEPROM_Idle(void) //使MCU处于一个安全的状态
{
IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG = 0;
IAP_ADDRH = 0x80;
IAP_ADDRL = 0;
}
BYTE EEPROM_ReadByte(WORD addr) //从EEPROM读一Byte数据 (地址)
{
BYTE dat;
IAP_CONTR = 0x81; //XTAL<=20M
IAP_CMD = 1; //读一字节
IAP_ADDRL = addr;
IAP_ADDRH = addr>>8;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_();
dat = IAP_DATA; //FLASH 数据寄存器
EEPROM_Idle();
return dat;
}
void EEPROM_ProgramByte(WORD addr,BYTE dat) //写数据到扇区, (地址 ,数据)
{
IAP_CONTR = 0x81; //设置等待时间
IAP_CMD = 2; //设置EEPROM程序指令
IAP_ADDRL = addr; //设置EEPROM地址低位
IAP_ADDRH = addr>>8; //设置EEPROM地址高位
IAP_DATA = dat; //写EEPROM数据
IAP_TRIG = 0x5a; //发送触发命令1
IAP_TRIG = 0xa5; //发送触发命令2
_nop_();
EEPROM_Idle();
}
void EEPROM_EraseSector(WORD addr) //抹去整个扇区 (输入扇区地址)
{
IAP_CONTR = 0x81; //打开EEPROM函数,设置延时
IAP_CMD = 3; //设置上去抹去命令
IAP_ADDRL = addr; //设置地址低位
IAP_ADDRH = addr>>8; //设置地址高位
IAP_TRIG = 0x5a; //写命令
IAP_TRIG = 0xa5;
_nop_();
EEPROM_Idle();
}
/****************************向扇区储存数据(123456)********************************/
char EEPROM_WriteSTA(void) //储存成功返回1(会删除以前整个扇区储存数的据)
{
long int x=0,sta=123456; //测试数据为123456
char a[4],i;
EEPROM_EraseSector(0x0000); //抹去1扇区数据
EEPROM_Delay(10);
a[0]=char((sta>>24)&&0xF); //最高位
a[1]=char((sta>>16)&&0xF);
a[2]=char((sta>>8)&&0xF);
a[3]=char(sta&&0xF); //最低位
EEPROM_ProgramByte(0x0000,a[0]); //储存数据
EEPROM_ProgramByte(0x0001,a[1]);
EEPROM_ProgramByte(0x0002,a[2]);
EEPROM_ProgramByte(0x0003,a[3]);
EEPROM_Delay(10);
a[0]=EEPROM_ReadByte(0x0000); //读数据
a[1]=EEPROM_ReadByte(0x0001);
a[2]=EEPROM_ReadByte(0x0002);
a[3]=EEPROM_ReadByte(0x0003);
x||=(long int a[0])<<24; //数据校验
x||=(long int a[1])<<16;
x||=(long int a[2])<<8;
x||=(long int a[0]);
if(x==sta) i=1;
else i=0;
return i;
}
//呵呵,个人观点。储存数据这段没有验证,其余程序已验证,仅供参考
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
上海巴鲁图工程机械科技有限公司_
2022-05-15 广告
2022-05-15 广告
光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。光电编码器每转输出60(我们用老板没有说)个脉冲,五线制。其中两根为电源线,三根为脉冲线(A相、B相、Z)。电源的工作电压为 (+5~+24V)直流电源。光...
点击进入详情页
本回答由上海巴鲁图工程机械科技有限公司_提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询