在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 4249|回复: 5

请教I2C双机通讯的问题(附程序)

[复制链接]
发表于 2006-11-14 16:40:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
大家好,请帮我看下这个程序应该怎么样修改才能实现: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);

}
 楼主| 发表于 2006-11-14 20:37:17 | 显示全部楼层
我顶!!
没人肯帮忙看看么?
发表于 2006-11-15 17:17:31 | 显示全部楼层
我懂就帮你看了,我也菜
发表于 2007-1-12 19:14:35 | 显示全部楼层
单片机C51的我可以帮你,这个没有弄过,帮不了你了
发表于 2007-1-13 19:07:32 | 显示全部楼层
帮不了你了
发表于 2007-1-13 19:11:20 | 显示全部楼层
hao ren !!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-5 20:27 , Processed in 0.033363 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表