首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

为何在用仿真器与烧入IC的效果不一样?解决方法

2012-03-17 
为何在用仿真器与烧入IC的效果不一样?#includereg52.h#includeintrins.h/***************for24c02****

为何在用仿真器与烧入IC的效果不一样?
#include   <reg52.h>
#include   <intrins.h>

/***************for   24c02************************************************************/
#defineWriteDeviceAddress   0xa0                               //第6与7位控制数据的段地址,第8位控制读写,1至4位固定为1010,5位为器件代码
#defineReadDviceAddress   0xa1
#define   NOP5()   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
/***************************************************************************/
sbitSCL=P2^4;
sbitSDA=P2^5;
sbit   led     =   P2^0;
unsigned   char   darray[3]   ;
unsigned   char   paddress;


void   int_0();               //外部中断0

void   Start()   {
SDA=1;
NOP5();
SCL=1;
NOP5();
SDA=0;
NOP5();
SCL=0;
NOP5();
}

/***************************************************************************/
void   Stop()   {
SDA=0;
NOP5();
SCL=1;
NOP5();
SDA=1;
NOP5();
SCL=0;
NOP5();
}

/***************************************************************************/
void   Ack()   {
SDA=0;
NOP5();
SCL=1;
NOP5();
SCL=0;
NOP5();
SDA=1;
}

/***************************************************************************/
void   NoAck()
{
SDA=1;
NOP5();
SCL=1;
NOP5();
SCL=0;
NOP5();
}

/***************************************************************************/
bit   TestAck(void)   {
bit   ErrorBit;
SDA=1;
NOP5();
SCL=1;
NOP5();
ErrorBit=SDA;
NOP5();
SCL=0;
return(ErrorBit);
}

/***************************************************************************/
void   Write8Bit(unsigned   char   input)   {
unsigned   char   temp;
for(temp=8;temp!=0;temp--)   {
SDA=(bit)(input&0x80);
NOP5();
SCL=1;
NOP5();
SCL=0;
NOP5();
input=input < <1;
}
}

/***************************************************************************/

void   write24c02(unsigned   char   *Wdata,unsigned   char   RomAddress,unsigned   char   number)   {
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(RomAddress);
TestAck();
for(;number!=0;number--)   {
Write8Bit(*Wdata);
TestAck();
Wdata++;
}
Stop();
//delay_ms(10);
}

/***************************************************************************/
unsigned   char   Read8Bit()   {
unsigned   char   temp,rbyte=0;
for(temp=8;temp!=0;temp--)   {
SCL=1;
rbyte=rbyte < <1;
rbyte=rbyte|((unsigned   char)(SDA));
SCL=0;
}
return(rbyte);
}

/***************************************************************************/
void   read24c02(unsigned   char   *RamAddress,unsigned   char   RomAddress,unsigned   char   bytes)   {
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(RomAddress);
TestAck();
Start();
Write8Bit(ReadDviceAddress);
TestAck();
while(bytes!=1)   {
*RamAddress=Read8Bit();
Ack();
RamAddress++;
bytes--;


}
*RamAddress=Read8Bit();
NoAck();
Stop();
}

/***************************************************************************/
void   t0(void)interrupt     0  
{
EA   =   0;
    led=~led;
write24c02(darray,paddress,3);
paddress   =   paddress   +   3;
darray[0]   =   darray[0]   +1;
darray[1]   =   darray[1]   +1;
darray[2]   =   darray[2]   +1;
//led=~led;
EA   =   1;
}

void   main(){
EA=1;//开启0号中断
EX0=1;
IT0=1;

led   =0;
paddress   =   0;
darray[0]   =   1;
darray[1]   =   2;
darray[2]   =   3;
while(1)
{
}
}
以上是我的程序代码,我想通过按键触发中断,然后在中断程序中循环写24C08
代码用仿真器单步执行时结果是正确的,但烧入89C51后再测试就不对了,要么是写入的数据有误,要么就是地址不对了,看看大侠有什么高见!!!

[解决办法]
速度太快了??

有仿真器的介入后,执行速度要慢下来,我以前有过这问题,不知道你那是不是这样,呵呵
[解决办法]
你的某次写操作得到确定的ACK, 然后开始写入周期,你需要等足够时间才进行下一次写。

如果内部的写操作还没有完成,试图写下一个字节会得到NACK.

你没有检查TestAck()的返回值,肯定会有错误.

热点排行