为何在用仿真器与烧入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()的返回值,肯定会有错误.