|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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);
} |
|