|
程序目的:單片機(jī)多機(jī)通信
功能:主機(jī)先發(fā)送地址碼01給從機(jī),從機(jī)收到地址后和自己的地址比較,若和自己的地址相同就返回1A表示應(yīng)答,地址不同就繼續(xù)等待地址。
本案例摘自51單片機(jī)應(yīng)用開發(fā)范例大全第10章----單片機(jī)通信
現(xiàn)在的問題是每次用串口工具發(fā)送01時(shí),分機(jī)返回的是1A, FF. 其中多了FF。 想了很多辦法,就是沒辦法去掉這個(gè)FF,不知道是什么問題,請教一下大家。
源程序如下;
#include<11f02e.h>
#include<intrins.h> /*偽定義*/
#define BUF_MAX_LEN 10 /*緩沖區(qū)的最大長度*/
#define ADDR_ACK 0x1A
#define DATA_ACK 0x2A
#define DATA_ERR 0x3A
sbit LEDR=P1^7;
unsigned char recv_buf[BUF_MAX_LEN+1]; /*函數(shù)聲明*/
unsigned char recv_data_frame( void ); /*接收數(shù)據(jù)幀*/
void send_ack( unsigned char ack ); /*發(fā)送應(yīng)答信息*/
void recv_addrframe( void ); /*接收地址幀*/
void serial_init( void ); /*串口初始化*/
/*********主程序中serial_init()*********/
void main( void )
{
unsigned char recv_tmp=0;
serial_init();
while(1)
{
recv_addrframe(); /*接收主機(jī)發(fā)送的地址幀*/
send_ack( ADDR_ACK ); /*發(fā)送地址收到應(yīng)答*/
if( recv_data_frame() == DATA_ACK )
{
send_ack( DATA_ACK );
}
else if (recv_data_frame == DATA_ERR )
{
send_ack( DATA_ERR );
}
}
}
/*********接收數(shù)據(jù)幀函數(shù)********/
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++) /* 接收數(shù)據(jù)幀,注意最后一個(gè)字節(jié)為校驗(yàn)字節(jié) */
{
while( !RI );
if( RB8 ) return 0;
recv_buf[i] = SBUF;
}
for( i=0;i<BUF_MAX_LEN;i++) /* 由接收到的數(shù)據(jù)計(jì)算校驗(yàn)和 */
{
check_sum += recv_buf[i];
}
if( recv_buf[ BUF_MAX_LEN+1]==check_sum )
{
return DATA_ACK; /* 校驗(yàn)和正確則返回?cái)?shù)據(jù)正確 */
}
else
{
return DATA_ERR; /*否則返回錯(cuò)誤*/
}
}
/*********函數(shù)void send_ack()********/
void send_ack( unsigned char ack )
{
TI = 0;
TB8 = 0;
SBUF= ack;
while( !TI );
TI = 0;
}
/*********接收地址幀函數(shù)*********/
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 ); /*等待接收地址數(shù)據(jù)*/
RI = 0;
recv_tmp = SBUF;
}
}
/*********串行口初始化函數(shù)*********/
void serial_init( void )
{
TMOD= 0x20 ;
TH1 = 0xFD ;
TL1 = 0xFD ;
EA = 0;
ET0 = 0;
ES = 0;
SCON= 0xD0 ;
PCON= 0x00 ;
TR1 =1;
}
|
|