导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→请教I2C双机通讯的问题(附程序)[yjshappy]

 *第44429篇: 请教I2C双机通讯的问题(附程序)

  
楼 主:yjshappy 2006年11月14日16:15
 请教I2C双机通讯的问题(附程序)
大家好,请帮我看下这个程序应该怎么样修改才能实现:16F876为被控器通过I2C总线连续发送数据到主控器16F877。他们的RC3与RC4都是连在一起的,通过1K电阻接到+5V的。
下面是我写的程序,只能够发送一个数据到PIC16F877,也就是在PORTB端口的8个二极管显示出011100111。
而16F876的PORTB端口的二极管显示11001101,RC2脚接的二极管不亮。   万分感激!!!!
//16f877作为主控接收器的程序
#include    <pic.h>  
#include    <pic1687x.h>  
#define  PORTBIT(add,bit)  ((unsigned)(&add)*8+(bit)
static  bit  PORTD_7@ PORTBIT(PORTD,7);
static  bit  PORTD_6@ PORTBIT(PORTD,6);
unsigned char n;
unsigned char m;
void i2_cinit();
void i2_cstart();

//i2c初始化子程序
void i2_cinit()
{TRISC=0X18;//RC3,RC4设定为输出
 SSPADD=19;//8MHZ晶振设定传送率为100KHZ
 SSPSTAT=0X80;
 SSPCON=0X38;
 
 }
//i2c发送启动信号子程序
void i2_cstart()
{for(n=255;n--;)
   {for(m=255;m--;);}  //延时一会
  SEN=1;  // 发送启动信号
 while(SSPIF==0);
 SSPIF=0; 
 }

//主程序
 main()
{TRISD=0;
 TRISB=0;
 PORTB=0;          //清输出
 PORTD=0;          //清输出
 i2_cinit();
 i2_cstart();
 SSPBUF=0X29;       //发送从机地址选通
 
 while (STAT_BF==1);
 while (ACKSTAT);    //等待从机应答
 while (SSPIF==0);
 SSPIF=0; 
 RCEN=1;
 
 while(SSPIF==0);
 ACKDT=0;
 ACKEN=1;
 PORTB=SSPBUF; //B端口接8个发光二极管,显示从机传来的数据
 SSPIF=0;
 
 RCEN=1;
 while(SSPIF==0);
 PORTD_7=1; //RD7接发光二极管显示是否运行到这步
 PORTB=SSPBUF;//B端口接8个发光二极管,显示从机传来的数据

 while(1); // 暂停,看显示
}
###############################
###############################
//16F876作为被控发送器发送数据到主控接收器16F877
#include    <pic.h>  
#include    <pic1687x.h>  
#define  PORTBIT(add,bit)  ((unsigned)(&add)*8+(bit)
static  bit  GO   @ PORTBIT(ADCON0,2);
static  bit  PORTC_0@ PORTBIT(PORTC,0);
static  bit  PORTC_1@ PORTBIT(PORTC,1);
static  bit  PORTC_2@ PORTBIT(PORTC,2);
static  bit  PORTC_3@ PORTBIT(PORTC,3);

void i2c_ini();
//i2c初始化
void i2c_ini()
 {SSPCON=0X36;  
  SSPADD=0X28;  //设定地址为0X28
  do {;}
  while(STAT_S==0);//检测到启动信号
  PORTC_0=1;
  while(SSPIF==0);
  PORTB=SSPBUF; //8位发光二极管显示接受的地址
  SSPIF=0; 
  }

main()
{TRISC=0X18;  //RC3,RC4为输入
 TRISB=0;
 PORTB=0;  //清端口B
 PORTC=0;
 SSPIF=0;
 i2c_ini();
 SSPBUF=0X73;//发送一个数据0X73
 CKP=1;
 while(SSPIF==0);
 SSPIF=0;
 SSPBUF=0XCD;//继续发送一个数据0XCD
 CKP=1;
 while(SSPIF==0)
 PORTB=SSPBUF;
 PORTC_2=1;//RC2接一个发光二极管,检测是否运行到这步
 while(1);

}

  
2楼:yjshappy 2006年11月15日10:43
 
没人帮忙啊,自己顶下~~

>>>>>>对该主题发表你的看法

本主题贴数2,分页: [第1页]


[上一篇主题]:产品被盗版令我吃尽苦-大家能给些好招么??

[下一篇主题]:全兼容AT89C4051性价比更高-原装无铅大量现货SM894051-DIP/SOP