第一次搞双机通信,出了点问题,我都搞了好多天,怎么也搞不定,谁能帮帮我,谢谢!
过程:单片机1设置3位数码管值,同时把设置值传送给单片机2,单片机2有4位数码管显示采集的温度(用MAX6675采集数据大概要0.2s),我按下面的程序
两边数码管都要闪烁的现象.
问题:发送和接收到都要等待的话,单片机2在采集数据完后才能接收(此时单片机1就在不停的等待).请问如何做到单片机1一直发送而不用等待,单片机2到时间就接受,是不是要用到异步通信的中断,该如何实现呢?
单片机1:
void send_usart()
{
TXEN=1;//发送允许
CREN=1;//接收允许
for(k=0;k<3;k++)
{
TXREG=send[k];
while(1)
{
if(TXIF==1)break;//等待发送完成
}
while(1)
{
if(RCIF==1)break;//等待接收完成
}
RCREG=RCREG;//读响应字节,清RCIF
}
}
void main(void)
{
uint m;
TRISA=0x38;
ANSEL=0;
TRISC=0xC0; //RC6 RC7输入
sciint();
di();
while(1)
{
for(m=0;m<100;m++) //数码管显示
{
send[0]=temp1(send[0]); //按键1返回值
send[1]=temp2(send[1]); //按键2返回值
send[2]=temp3(send[2]); //按键3返回值
disp(10,send[0],send[1],send[2]);//数码管显示
}
send_usart();
}
}
单片机2:
main()
{
uint m;
uchar a1,a2,a3,a0;
uint settemp;
TRISC=0xe0;
TRISB=0x00;
PORTB=0xff;
ANSELH=0;
SCK=0;
CS=1;
sciint(); //SCI部件初始化
di();
CREN=1; //接收允许
TXEN=1; //发送允许
delayms(500);
while(1){
for(k=0;k<3;k++ ){
while(1){
if(RCIF==1) break;
} //等待接收数据
rec[k]=RCREG; //读取接收数据,同时清掉RCIF
TXREG=rec[k]; //发送接收到的数据
while(1){
if(TXIF==1) break;
} //等待写入完成
}
settemp=100*rec[0]+10*rec[1]+rec[2]; //设置温度值
P_Temp=Re_Convert(); //采集温度值
if(P_Temp>settemp)
a0=11;
else a0=10;
a1=P_Temp/100;
a2=P_Temp%100/10;
a3=P_Temp%10;
for(m=0;m<100;m++) //数码管显示
disp(a0,a1,a2,a3);
}
}
单片机2
main()
{
uint m;
uchar a1,a2,a3,a0;
uint settemp;
TRISC=0xe0;
TRISB=0x00;
PORTB=0xff;
ANSELH=0;
SCK=0;
CS=1;
sciint(); //SCI部件初始化
di();
CREN=1; //接收允许
TXEN=1; //发送允许
delayms(500);
while(1){
for(k=0;k<3;k++ ){
while(1){
if(RCIF==1) break;
} //等待接收数据
rec[k]=RCREG; //读取接收数据,同时清掉RCIF
TXREG=rec[k]; //发送接收到的数据
while(1){
if(TXIF==1) break;
} //等待写入完成
}
settemp=100*rec[0]+10*rec[1]+rec[2]; //设置温度值
P_Temp=Re_Convert(); //采集温度值
if(P_Temp>settemp)
a0=11;
else a0=10;
a1=P_Temp/100;
a2=P_Temp%100/10;
a3=P_Temp%10;
for(m=0;m<100;m++) //数码管显示
disp(a0,a1,a2,a3);
}
}
楼主可以通过232电平转换芯片用PC来监看你的MCU串口输出是否正确,对初学者而言,一个串口监视器是很有用的工具。
先确定发送方是否有问题,再去调试接受方。
楼上没明白我的意思
数据传输没有问题,我用protues仿真过,搭电路实验过。只是两边数码管都要点闪烁。
通俗的说,我1 s给你打个电话,你忙要2s才接电话,我要在2s不停地等你接电话(所以我这边数码管在闪),你2s后接电话的时候我的数码管在显示,等我数码管显示停了,才能给你打电话(所以你的数码管也在闪),如果能做到我不用等你接电话一直给你打电话就可以了。
去掉
单片机1中
while(1) { if(RCIF==1)break;//等待接收完成 } RCREG=RCREG;//读响应字节,清RCIF } }
和for(m=0;m<100;m++) {}
右边的数码管没显示了,要两边数码管都正常显示不闪烁,不知道程序改怎么改呢