单片机对62256读写操作!为何读写数据只能读写到0x03ff?
时间:10-02
整理:3721RD
点击:
#include <reg51.h> //51芯片管脚定义头文件
#include <intrins.h> //内部包含延时函数 _nop_();
#include <absacc.h> //绝对地址访问的头文件
#define uchar unsigned char
#define uint unsigned int
sbit WE=P3^6; //62256接到单片机的控制引脚! ALE接74HC573对低8位数据锁存!P2接高7位数据!(A8-A14)
sbit CE=P2^7;
sbit RD=P3^7;
uint RAMADDR=0x0300; //当地址定义大于0x0400数据就读不出?
#define addr 0x0313
#define RAM_62256 XBYTE[RAMADDR] //62256地址范围0000H-7FFFH
bit ERR;
uchar num,temp,t;
char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节
uchar tab[]={0x20,0x43,0x21,0x22,0x13,0x34,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0f,0x10,0x21};
uchar shuju[100];
void delay(uint k)
{
uint x,y;
for(x=0;x<k;x++)
for(y=0;y<1000;y++);
}
void init()
{
EA=1;TMOD=0x20;
SCON=0x40;PCON=0x00;
TH1=TL1=0xfa;
TR1=1;
}
void send(unsigned char dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void write()
{
uint i=0;
RAMADDR= 0x0400; //62256首地址
while(RAMADDR != addr) //62256末地址
{
RAM_62256=tab[i]; //数据写入62256
_nop_();
RAMADDR++; //修改62256地址
i++;
}
}
void read()
{
uint i=0;
RAMADDR = 0x0400; //62256首地址
while(RAMADDR != addr)
{
shuju[i] = RAM_62256; //从62256中读取数据
RAMADDR++; //修改62256地址
if(shuju[i]!=tab[i]) //数据比较
{
ERR=1;
break;
}
i++;
}
t=i;
}
/**********************************************************
主函数
**********************************************************/
void main(void)
{
uint i=0;
init();
P0=0xff;
P2=0xff;
num=0x02;
ERR=0;
write();
read();
if(ERR==1)
P1 = 0x00; //P0口LED显示
else if(ERR==0)
{
for(i=0;i<t;i++)
{
P1 = temp; //P0口LED显示
send(shuju[i]); //串口发送读写到的数据!
delay(1000);
}
}while(1);
}
/**********************************************************/
#include <intrins.h> //内部包含延时函数 _nop_();
#include <absacc.h> //绝对地址访问的头文件
#define uchar unsigned char
#define uint unsigned int
sbit WE=P3^6; //62256接到单片机的控制引脚! ALE接74HC573对低8位数据锁存!P2接高7位数据!(A8-A14)
sbit CE=P2^7;
sbit RD=P3^7;
uint RAMADDR=0x0300; //当地址定义大于0x0400数据就读不出?
#define addr 0x0313
#define RAM_62256 XBYTE[RAMADDR] //62256地址范围0000H-7FFFH
bit ERR;
uchar num,temp,t;
char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节
uchar tab[]={0x20,0x43,0x21,0x22,0x13,0x34,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0f,0x10,0x21};
uchar shuju[100];
void delay(uint k)
{
uint x,y;
for(x=0;x<k;x++)
for(y=0;y<1000;y++);
}
void init()
{
EA=1;TMOD=0x20;
SCON=0x40;PCON=0x00;
TH1=TL1=0xfa;
TR1=1;
}
void send(unsigned char dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void write()
{
uint i=0;
RAMADDR= 0x0400; //62256首地址
while(RAMADDR != addr) //62256末地址
{
RAM_62256=tab[i]; //数据写入62256
_nop_();
RAMADDR++; //修改62256地址
i++;
}
}
void read()
{
uint i=0;
RAMADDR = 0x0400; //62256首地址
while(RAMADDR != addr)
{
shuju[i] = RAM_62256; //从62256中读取数据
RAMADDR++; //修改62256地址
if(shuju[i]!=tab[i]) //数据比较
{
ERR=1;
break;
}
i++;
}
t=i;
}
/**********************************************************
主函数
**********************************************************/
void main(void)
{
uint i=0;
init();
P0=0xff;
P2=0xff;
num=0x02;
ERR=0;
write();
read();
if(ERR==1)
P1 = 0x00; //P0口LED显示
else if(ERR==0)
{
for(i=0;i<t;i++)
{
P1 = temp; //P0口LED显示
send(shuju[i]); //串口发送读写到的数据!
delay(1000);
}
}while(1);
}
/**********************************************************/
此回复同步到 腾讯微博 | 回帖并转播 回帖后跳转到最后一页
经过测试,程序读写数据只能读写到0x03ff;即1K的内存;我查了资料;有些网友说设置声明地址的数据类型unsigned int addr只能读写单片机内部的1k的rom;要设置改成unsigned int xdata addr ;才能读写外部数据!但是改成这样数据就读写不了?求哪位大神帮忙解答?
小弟也在开始学,能教教吗?244816711
我也搞不懂啊,来此求教。