| 
 
| 我用PIC18F2480单片机,在proteus里面调试,结果是当加上I2C DEBUGGER测试器的时候通讯正常,可以将值写入EEPROM里,PORTD输出的显示也正常(数码管),但是拿掉I2C DEBUGGER单片机就写不进EEPROM里了,用示波器查了一下原因,发现拿掉I2C DEBUGGER后PIC单片机I2C在发送了SEN=1的起始条件后,EEPROM不给应答信号请问这是怎么回事啊?现象如图所示 
 以下是源代码
 #include<pic18.h>
 #define uchar unsigned char
 #define uint unsigned int
 const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
 0x07,0x7f,0x6f};
 uchar read_data[9];
 void delay(uint z);
 void I2Cinit();
 void I2Cwrite();
 void I2Cread();
 void main()
 {
 
 I2Cinit();
 I2Cwrite();
 delay(50);
 I2Cread();
 while(1)
 {
 uchar i;
 for(i=0;i<9;i++)
 {
 PORTD=read_data;
 delay(500);
 RA0=1;RA1=1;//加入指示灯调程序
 delay(100);
 RA0=0;RA1=0;
 }
 }
 }
 void delay(uint z)
 {
 uint x,y;
 for(x=z;x>0;x--)
 for(y=110;y>0;y--);
 }
 void I2Cinit()
 {
 INTCON=0;
 PIE1=0;
 PIE2=0;
 TRISC3=1;
 TRISC4=1;//设置为输入
 TRISD=0;
 TRISA=0;
 SSPSTAT=0x80;//标准速度100K其他的都为检测位先设为零
 SSPCON1=0x38;//使能同步串口SSP  时钟为100K
 SSPCON2=0;
 SSPADD=0x09;
 RA0=1;
 delay(10);//调程序标志
 RA0=0;
 
 }
 void I2Cwrite()
 {
 uchar i;
 SSPIF=0;
 SEN=1;   //使能ssp通信
 while(!SSPIF);//通过检测 sspif 代替应答信号
 SSPIF=0;
 SSPBUF=0xA0; //发送器件地址P0=0;A=0;
 while(!SSPIF);
 SSPIF=0;
 SSPBUF=0;  //发送写的地址的高八位
 while(!SSPIF);
 SSPIF=0;
 SSPBUF=0x01;  //发送写的地址的低八位0x01
 while(!SSPIF);
 SSPIF=0;
 for(i=0;i<9;i++)
 {
 SSPBUF=table;//依次写入要写的9个数
 while(!SSPIF);
 SSPIF=0;
 RA0=1;
 delay(100);
 RA0=0;
 }
 PEN=1;    //发送停止信号
 while(!SSPIF);
 SSPIF=0;
 }
 void I2Cread()
 {
 
 uchar i;
 SSPIF=0;
 SEN=1;
 while(!SSPIF);
 SSPIF=0;
 SSPBUF=0xA0;
 while(!SSPIF);
 SSPIF=0;
 SSPBUF=0;  //发送写的地址的高八位
 while(!SSPIF);
 SSPIF=0;
 SSPBUF=0x01;  //发送写的地址的低八位0x01;
 while(!SSPIF);
 SSPIF=0;
 // SSPIF=0;
 RSEN=1;    //发送开始信号
 while(!SSPIF);
 SSPIF=0;
 SSPBUF=0xA1;  //读指令
 while(!SSPIF);
 SSPIF=0;
 for(i=0;i<9;i++)
 {
 RCEN=1;
 while(!SSPIF);
 read_data=SSPBUF;
 while(!SSPIF);
 SSPIF=0;
 RA1=1;
 delay(100);
 RA1=0;
 if(i>=8)
 {
 ACKDT=1;
 }
 else
 {
 ACKDT=0;
 }
 ACKEN=1;
 while(!SSPIF);
 SSPIF=0;
 }
 PEN=1;
 while(!SSPIF);
 SSPIF=0;
 }
 
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |