本帖最后由 青石向晚 于 2010-5-30 17:44 编辑
A机代码:
#include <reg51.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char sendData[]={'1','2','3','4','5','a','n','b','f'};//定义要发送的数据
void uart_init() //设置串口工作方式
{
TMOD=0x20;
TH1=0xFD;
PCON=0x00;
TR1=1;
SCON=0x50;
}
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;
}
void send_char(void)
{
uchar i=0;
uchar j=0;
uart_init();
shakeHand();
for(;i<strlen(sendData)-1;i++)
send(sendData);
}
void main()
{
send_char();
}
B机代码:
#include <reg51.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
uchar receivedata[15]={};
uchar count=0;
void baudrate_code(uchar a)
{
switch (a)
{
case 0: TH1=0xfd;break;
case 1: TH1=0xfa;break;
case 2: TH1=0xf4;break;
case 3: TH1=0xe8;break;
default:TH1=0xfd;
}
}
/******************* AB机握手时钟 **********************/
void resettime(void)
{
EA = 1 ; /*开全局中断*/
TMOD = 0x21 ; /*定时器0方式1 定时器1方式2*/
TH0 = 0x3C ; /*定时器0 50MS定时*/
TL0 = 0xB0 ;
ET0 = 1 ; /*开定时器0中断*/
TR0 = 1 ; /*启动T0 */
PT0 = 1 ; /*定时0 高优先级*/
}
void stoptime(void)
{
TR0 = 0 ;
}
void int50ms(void) interrupt 1 //定时中断,实现波特率自动跟踪
{
TH0 = 0x3C ;
TL0 = 0xB0 ;
count++;
if(count>3)
count=0;
baudrate_code(count);
}
void uart_init() //设置串口工作方式
{
TMOD=0x20;
TH1=0xe8;
PCON=0x00;
TR1=1;
SCON=0x50;
}
void shakeHand() //握手信号
{
resettime();
do{
SBUF=0x02;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
}while(SBUF!=0x01) ;
stoptime();
}
unsigned char receive() //字符接受程序
{
while(RI==0);
RI=0;
return (SBUF);
}
void receive_char(void)
{
uchar i=0;
uart_init();
shakeHand();
do{
receivedata=receive();
i++;
}while(SBUF!='f') ;
}
void main()
{
receive_char();
}
这是一个双机通信的程序,具有波特率自动跟随功能,可是如果去掉A机代码中那句红色的语句(那句没有任何实际意义,定义的j变量根本就不需要),通信就不能成功,研究了半天没研究出来什么原因,请各位大虾帮忙~~~ |