我有2个单片机组成双向通信,一个主机一个从机,主机每20ms采集一次数据并向从机发送一次,从机用while(1)循环不停地向主机发送数据。程序都没有问题。现在的问题就是在主机,无论我用while(1)不停地接收数据还是用串口中断的方式接收,都接收不到从从机发过来的数据。谁能帮我分析下。现在可以肯定的是程序都没问题,可能就是有些原理性的问题,譬如中断优先级或者其他的。
主机程序:
#include <STRING.H>
#include<REG52.H>
#define _MHZ_ 11
sbit
LED1=P0^0;
sbit
LED2=P0^1;
sbit
P0_2=P0^2;
sbit
P0_3=P0^3;
sbit
K1=P0^4;
sbit
K2=P0^5;
sbit
P0_6=P0^6;
sbit
P0_7=P0^7;
sbit
LED3=P1^0;
sbit
LED4=P1^1;
sbit
LED5=P1^2;
sbit
P1_3=P1^3;
sbit
P1_4=P1^4;
sbit
P1_5=P1^5;
sbit
K3=P1^6;
sbit
K4=P1^7;
sbit
P2_0=P2^0;
sbit
P2_1=P2^1;
sbit
P2_2=P2^2;
sbit
P2_3=P2^3;
sbit
P2_4=P2^4;
sbit
P2_5=P2^5;
sbit
P2_6=P2^6;
sbit
K5=P2^7;
int a=0;
unsigned char data1[6];
unsigned char data2[6];
void init_serial0();
void init_serial1();
void coll_data() ;
void send_data(unsigned char *data1);
void recv_data(unsigned char *data2);
void delay10ms(unsigned int count);
unsigned char ecc=0x00;
/*************** 延时程序*********** */
void delay10ms(unsigned int count)
{
unsigned int i;
unsigned char j;
for(i=0; i<count; i++)
for(j=0; j<200; j++);
//for(k=0; k<150; k++);
}
/******************采集数据**********************/
void coll_data()
{
data1[0]=0xC5;
data1[1]=0xFF;
data1[2]=0xF6;
data1[3]=0xC8;
/***************** ******************/
/*****************?1******************/
if(K1==0)
{
delay10ms(1);
if(K1==0)
{
data1[1]=data1[1]&0x7F;
}
}
if(K2==0)
{
delay10ms(1);
if(K2==0)
{
data1[1]=data1[1]&0xBF;
}
}
if(K3==0)
{
delay10ms(1);
if(K3==0)
{
data1[1]=data1[1]&0xDF;
}
}
if(K4==0)
{
delay10ms(1);
if(K4==0)
{
data1[1]=data1[1]&0xEF;
}
}
if(K5==0)
{
delay10ms(1);
if(K5==0)
{
data1[1]=data1[1]&0xF7;
}
}
data1[4]=0xC5+ data1[1]+ 0xF6+0xC8;//D£?é×??ú£?oí×??ˉò?3?è?×?μí8??
}
/****************** ·发送数据 **********************/
void send_data(unsigned char *data1)
{
int i;
/* ·¢?íêy?Y */
for(i=0; i<5; i++)
{
TI = 0;
SBUF = data1[i];
while(!TI);
TI = 0;
}
}
/****************串口初始化********************/
void init_serial1()
{
TMOD = 0x20;
TH1 = 250;
TL1 = 250;
TR1 = 1;
PCON = 0x80;
SCON = 0x50;
}
/* *****************?¨ê±?÷0 **********************/
void init_serial0()
{
TMOD = 0x10;
TH0 = 0xB8;
TL0 = 0x00;
TR0 = 1;
ET0=1;
EA=1;
}
/*************** 定时器0中断*********** */
void timer0_int () interrupt 1 using 1
{
TH0 = 0xB8;
TL0 = 0x00;
send_data(data1);
coll_data();
}
/* 接收数据*/
void recv_data(unsigned char *data2)
{
int i;
/* ?óê?êy?Y */
for(i=0; i<5; i++)
{
while(!RI);
data2[i] = SBUF;
RI = 0;
}
ecc=(data2[0])+(data2[1])+(data2[2])+(data2[3]);
data2[5]=0;
if((data2[0]==0xA5)&&(data2[4]==ecc))
{
if((data2[1]&0x80)==0x80)
LED1=1;
else
LED1=0;
if((data2[1]&0x40)==0x40)
LED2=1;
else
LED2=0;
if((data2[1]&0x20)==0x20)
LED3=1;
else
LED3=0;
if((data2[1]&0x10)==0x10)
LED4=1;
else
LED4=0;
if((data2[1]&0x08)==0x08)
LED5=1;
else
LED5=0;
}
}
/* **********************主程序******************** */
void main(void)
{
init_serial1(); //串口初始化
init_serial0(); //启动定时器0
TI=0;
RI=0;
IE=0x92;
while(1)
{
recv_data(data2); //接收程序
}
}
//////串口中断///////////
void Serial_INT() interrupt 4
{
int i;
/* ?óê?êy?Y */
for(i=0; i<5; i++)
{
RI = 0;
while(!RI);
data2[i] = SBUF;
RI = 0;
}
ecc=(data2[0])+(data2[1])+(data2[2])+(data2[3]);
data2[5]=0;
// ±íê?êy?Y?áê?
/* 如果接收到程序,使灯亮 */
//if((data2[0]==0xA5)&&(data2[4]==ecc))
{
if((data2[1]&0x80)==0x80)
LED1=1;
else
LED1=0;
if((data2[1]&0x40)==0x40)
LED2=1;
else
LED2=0;
if((data2[1]&0x20)==0x20)
LED3=1;
else
LED3=0;
if((data2[1]&0x10)==0x10)
LED4=1;
else
LED4=0;
if((data2[1]&0x08)==0x08)
LED5=1;
else
LED5=0;
}
} |