发表于:2010/5/28 16:13:21
#0楼
程序如下。仿真芯片坏了,调试起来很难,我盯着看了半天找不到原因。
我把93C46连接为储存16位数据模式,程序按照16位来编写。
要实现的功能是,把0xF00F储存到EEPROM中,再读取出来。
情况是这样的:ReDataH得不到我储存进去的值,LED显示出依然是P1=0。
麻烦各位帮我看看我的程序。
另外根据我的理解,1KB的EEPROM储存16位数据的地址为十进制的0~63。程序中我使用了25。这个理解正确吗?
#include<reg51.h>
#include<intrins.h>
sbit CS=P0^3;
sbit SK=P0^2;
sbit DI=P0^0;
sbit DO=P0^1;
//写允许、写禁止、擦除全部、写满存储区等指令的操作步骤
//address=100aaXXX X(aa=11 写允许 aa=00 写禁止 aa=10 擦除全部 aa=01 写满存储区)
void SysCommand(uchar address)
{
uchar temp;
CS=1;
for(temp=0;temp<=8;temp++) //打入9位地址,最低位任意
{
DI=address & 0x80;
SK=1; SK=0;
address<<=1;
}
CS=0;
}
//写允许
void EWEN()
{
SysCommand(0x98);
}
//写禁止
void EWDS()
{
SysCommand(0x80);
}
//擦除全部
void ERAL()
{
SysCommand(0x90);
}
//写满存储区
void WRAL()
{
SysCommand(0x88);
}
//写数据
//address=0~0x3f,Indata(H/L) 写入的数据高8位和低8位
void WRITE(uint address,uint IndataH,uint IndataL)
{
uint temp;
EWEN(); //写允许
address=address&0x7f; //使address=01XXXXXX
CS=1;
DI=1; //打入开始位1
SK=1;SK=0;
for(temp=0;temp<=7;temp++) //打入地址
{
DI=address & 0x80;
SK=1; SK=0;
address<<=1;
}
for(temp=0;temp<=7;temp++) //写入高8位
{
DI=IndataH & 0x80;
SK=1; SK=0;
IndataH<<=1;
}
for(temp=0;temp<=7;temp++) //写入低8位
{
DI=IndataL & 0x80;
SK=1; SK=0;
IndataL<<=1;
}
CS=0;
_nop_();_nop_();_nop_();_nop_();
CS=1;
while(!DO); //判忙
CS=0;
EWDS(); //写禁止
}
//读数据
//address=0~0x3f,Redata(H/L) 储存读出数据高8位和低8位的变量地址
void READ(uint address,uint *ReDataH,uint *ReDataL)
{
uint temp;
ReDataH=0;ReDataL=0;
address&=0xbf; //使address=10XXXXXX
CS=1;
DI=1; //打入开始位1
SK=1;SK=0;
for(temp=0;temp<=7;temp++) //打入地址
{
DI=address & 0x80;
SK=1; SK=0;
address<<=1;
}
DO=1;
for(temp=0;temp<=7;temp++) //打入地址
{
SK=1; SK=0;
*ReDataH|=DO;
*ReDataH<<=1;
}
for(temp=0;temp<=7;temp++) //打入地址
{
SK=1; SK=0;
*ReDataL|=DO;
*ReDataL<<=1;
}
CS=0;
}
/////////////////////////////////
// 主函数 //
/////////////////////////////////
main()
{
uint ReDataH;
uint ReDataL;
ReDataH=0;
ReDataL=0;
WRITE(20,0xf0,0x0f);
READ(&ReDataH,&ReDataL);
P1=ReDataH;
}
我把93C46连接为储存16位数据模式,程序按照16位来编写。
要实现的功能是,把0xF00F储存到EEPROM中,再读取出来。
情况是这样的:ReDataH得不到我储存进去的值,LED显示出依然是P1=0。
麻烦各位帮我看看我的程序。
另外根据我的理解,1KB的EEPROM储存16位数据的地址为十进制的0~63。程序中我使用了25。这个理解正确吗?
#include<reg51.h>
#include<intrins.h>
sbit CS=P0^3;
sbit SK=P0^2;
sbit DI=P0^0;
sbit DO=P0^1;
//写允许、写禁止、擦除全部、写满存储区等指令的操作步骤
//address=100aaXXX X(aa=11 写允许 aa=00 写禁止 aa=10 擦除全部 aa=01 写满存储区)
void SysCommand(uchar address)
{
uchar temp;
CS=1;
for(temp=0;temp<=8;temp++) //打入9位地址,最低位任意
{
DI=address & 0x80;
SK=1; SK=0;
address<<=1;
}
CS=0;
}
//写允许
void EWEN()
{
SysCommand(0x98);
}
//写禁止
void EWDS()
{
SysCommand(0x80);
}
//擦除全部
void ERAL()
{
SysCommand(0x90);
}
//写满存储区
void WRAL()
{
SysCommand(0x88);
}
//写数据
//address=0~0x3f,Indata(H/L) 写入的数据高8位和低8位
void WRITE(uint address,uint IndataH,uint IndataL)
{
uint temp;
EWEN(); //写允许
address=address&0x7f; //使address=01XXXXXX
CS=1;
DI=1; //打入开始位1
SK=1;SK=0;
for(temp=0;temp<=7;temp++) //打入地址
{
DI=address & 0x80;
SK=1; SK=0;
address<<=1;
}
for(temp=0;temp<=7;temp++) //写入高8位
{
DI=IndataH & 0x80;
SK=1; SK=0;
IndataH<<=1;
}
for(temp=0;temp<=7;temp++) //写入低8位
{
DI=IndataL & 0x80;
SK=1; SK=0;
IndataL<<=1;
}
CS=0;
_nop_();_nop_();_nop_();_nop_();
CS=1;
while(!DO); //判忙
CS=0;
EWDS(); //写禁止
}
//读数据
//address=0~0x3f,Redata(H/L) 储存读出数据高8位和低8位的变量地址
void READ(uint address,uint *ReDataH,uint *ReDataL)
{
uint temp;
ReDataH=0;ReDataL=0;
address&=0xbf; //使address=10XXXXXX
CS=1;
DI=1; //打入开始位1
SK=1;SK=0;
for(temp=0;temp<=7;temp++) //打入地址
{
DI=address & 0x80;
SK=1; SK=0;
address<<=1;
}
DO=1;
for(temp=0;temp<=7;temp++) //打入地址
{
SK=1; SK=0;
*ReDataH|=DO;
*ReDataH<<=1;
}
for(temp=0;temp<=7;temp++) //打入地址
{
SK=1; SK=0;
*ReDataL|=DO;
*ReDataL<<=1;
}
CS=0;
}
/////////////////////////////////
// 主函数 //
/////////////////////////////////
main()
{
uint ReDataH;
uint ReDataL;
ReDataH=0;
ReDataL=0;
WRITE(20,0xf0,0x0f);
READ(&ReDataH,&ReDataL);
P1=ReDataH;
}