楼上的程序是我在http://z.baidu.com/question/115232752.html回答的,也是我写的。竟然被人引用了!!那个程序一个只能发送,一个只能接受,而不能满足你半双工的要求。
下面是我写了一个是用查询方式,甲机先将数据发送给已机,甲机判断是不是停止位,是,就停止发送,然后是已机发送,判断停止位,是,停止发送,如此反复发送,中间有握手信号联络两机。我不清楚你的半双工是怎么工作的,只是写了一个两机循环发送的程序,可以的话,你可以参考一下。
我觉得中断应该比较容易实现的。
下面是程序 甲机
#include
#include
#define uchar unsigned char
#define uint unsigned int
unsigned char data sendData[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x9};//定义要发送的数据
//设置串口工作方式
void uart_init()
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
PCON=0x00;
TR1=1;
SCON=0x50;
} //设置串口工作方式
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
//延时程序
void shakeHand()
{
do
{
SBUF=0x01;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
}
while(SBUF!=0x02) ;
} //握手信号
void send(unsigned char sendData)
{
SBUF=sendData;
while(TI==0);
TI=0;
}//发送数据程序
unsigned char receive()
{
while(RI==0);
RI=0;
return (SBUF);
}
void main()
{
uart_init();
shakeHand();
while(1)
{
unsigned char i=0;
for(;i
send(sendData[i]);
delay(500) ;
}
shakeHand();
do
P2=receive();
while(SBUF!=0x09) ;
shakeHand();
}
}
已机部分
#include
#include
#define uchar unsigned char
#define uint unsigned int
unsigned char data sendData[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x9};//定义要发送的数据
//设置串口工作方式
void uart_init()
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
PCON=0x00;
TR1=1;
SCON=0x50;
} //设置串口工作方式
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
//延时程序
void shakeHand()
{
do
{
SBUF=0x02;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
}
while(SBUF!=0x01) ;
} //握手信号
void send(unsigned char sendData)
{
SBUF=sendData;
while(TI==0);
TI=0;
}//发送数据程序
unsigned char receive()
{
while(RI==0);
RI=0;
return (SBUF);
}
void main()
{
uart_init();
shakeHand();
while(1)
{
unsigned char i=0;
do
P2=receive();
while(SBUF!=0x09) ;
shakeHand();
for(;i
send(sendData[i]);
delay(500);
}
shakeHand();
}
}
两机之间需要建立握手信号,告知接受机发送机开始发送地位数据,接受机才开始接受数据。
#include
#define uchar unsigned char
#define uint unsigned int
void uart_init()
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
PCON=0x00;
TR1=1;
SCON=0x50;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void main()
{
uart_init();
do
{
SBUF=0x01;
while(TI==0);
TI=0;
while(RI==0);
REN=0;
}
while(SBUF!=0x02) ;
while(1)
{
SBUF=0x07;
while(TI==0);
TI=0;
delay(500) ;
SBUF=0x00;
while(TI==0);
TI=0;
delay(500) ;
}
}
#include
#define uchar unsigned char
#define uint unsigned int
void uart_init()
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
PCON=0x00;
TR1=1;
SM0=0; //串口方式1
SM1=1;
REN=1;
}
void main()
{
uart_init();
do
{
SBUF=0x02;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
P2=SBUF;
}
while(P2!=0x01);
while(1)
{
while(RI==0);
P1=SBUF;
RI=0;
}
}
你把单片机的串口线交叉连接,TXA-RXB RXA-TXB
然后A发信息,B收到后再返回,A收到后,再返回给B 你用中断和查询法都可以,你自己写写试试 关键自己多动手练习 搞电子每天都要学习 都要动手 别人给你程序实例对你基本没用 因为你完全可以自己写出来,别人看到你的分,都心动了,哈哈