程序目的:单片机多机通信
功能:主机先发送地址码01给从机,从机收到地址后和自己的地址比较,若和自己的地址相同就返回1A表示应答,地址不同就继续等待地址。
本案例摘自51单片机应用开发范例大全第10章----单片机通信
现在的问题是每次用串口工具发送01时,分机返回的是1A, FF. 其中多了FF。 想了很多办法,就是没办法去掉这个FF,不知道是什么问题,请教一下大家。
源程序如下;
#include<11f02e.h>
#include<intrins.h> /*伪定义*/
#define BUF_MAX_LEN 10 /*缓冲区的最大长度*/
#define ADDR_ACK 0x1A
#define DATA_ACK 0x2A
#define DATA_ERR 0x3A
sbit LEDR=P1^7;
unsigned char recv_buf[BUF_MAX_LEN+1]; /*函数声明*/
unsigned char recv_data_frame( void ); /*接收数据帧*/
void send_ack( unsigned char ack ); /*发送应答信息*/
void recv_addrframe( void ); /*接收地址帧*/
void serial_init( void ); /*串口初始化*/
/*********主程序中serial_init()*********/
void main( void )
{
unsigned char recv_tmp=0;
serial_init();
while(1)
{
recv_addrframe(); /*接收主机发送的地址帧*/
send_ack( ADDR_ACK ); /*发送地址收到应答*/
if( recv_data_frame() == DATA_ACK )
{
send_ack( DATA_ACK );
}
else if (recv_data_frame == DATA_ERR )
{
send_ack( DATA_ERR );
}
}
}
/*********接收数据帧函数********/
unsigned char recv_data_frame( void )
{
unsigned char i;
unsigned char check_sum=0;
SM2= 0;
for( i=0;i<BUF_MAX_LEN+1;i++) /* 接收数据帧,注意最后一个字节为校验字节 */
{
while( !RI );
if( RB8 ) return 0;
recv_buf[i] = SBUF;
}
for( i=0;i<BUF_MAX_LEN;i++) /* 由接收到的数据计算校验和 */
{
check_sum += recv_buf[i];
}
if( recv_buf[ BUF_MAX_LEN+1]==check_sum )
{
return DATA_ACK; /* 校验和正确则返回数据正确 */
}
else
{
return DATA_ERR; /*否则返回错误*/
}
}
/*********函数void send_ack()********/
void send_ack( unsigned char ack )
{
TI = 0;
TB8 = 0;
SBUF= ack;
while( !TI );
TI = 0;
}
/*********接收地址帧函数*********/
void recv_addrframe( void )
{
unsigned char client_addr,recv_tmp;
client_addr = 0x01;
recv_tmp = 0 ;
SM2 = 1; /*只接收地址帧*/
while( recv_tmp != client_addr )
{
RI = 0;
while( !RI ); /*等待接收地址数据*/
RI = 0;
recv_tmp = SBUF;
}
}
/*********串行口初始化函数*********/
void serial_init( void )
{
TMOD= 0x20 ;
TH1 = 0xFD ;
TL1 = 0xFD ;
EA = 0;
ET0 = 0;
ES = 0;
SCON= 0xD0 ;
PCON= 0x00 ;
TR1 =1;
}
|