打印
[疑难问答]

帮忙检查一下EEPROM(93c46)的C51程序。

[复制链接]
2338|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laslison|  楼主 | 2010-6-27 23:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下。仿真芯片坏了,调试起来很难,我盯着看了半天找不到原因。
我把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;

}
沙发
lpydidi| | 2010-6-28 22:36 | 只看该作者
:L,还是整理一下问题吧,太长了

使用特权

评论回复
板凳
guita| | 2010-6-28 22:40 | 只看该作者
怎么能把仿真芯片弄坏?

使用特权

评论回复
地板
lpydidi| | 2010-6-30 14:39 | 只看该作者
READ(&ReDataH,&ReDataL);
P1=ReDataH;
有返回值的程序这么写?

使用特权

评论回复
5
laslison|  楼主 | 2010-7-2 23:12 | 只看该作者
4# lpydidi
是这个问题吗?那应该怎么写呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

791

帖子

1

粉丝