⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 seek_line_spi.c

📁 自动小车 寻找白线 程序。 采用后轮驱动mega系列单片机控制
💻 C
字号:
/*********************************************************/

unsigned char rev_buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};	//1 to 8存储接收到的8个数据
unsigned char send_buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};


//SPI initialisation
// clock rate: 62500hz
void spi_init(void)
{
	//从机片选端设定, PD2 & PD3 进行从机选择
	PORTD |= (BIT(3) | BIT(2));
	DDRD |= (BIT(3) | BIT(2));
	
	/* 设置SS, MOSI 和SCK 为输出,其他为输入 */
	PORTB |= 0xF0;	 //
	DDRB |= ( (1<<5) | (1<<7) | (1<<4)) ;  //配置SPI输出口,
	DDRB &= ~BIT(6);	//设MISO为输入口
	
	/* 使能SPI 主机模式,设置时钟速率为fck/128 */
	SPCR = ((1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0));
	SPSR = 0x00; //setup SPI
}
/* ******************************************************************

/**********************************************************************/
//被传输数据前加的命令字
/**********************************************************************/
#define CMD_START 0X40   		  //发送数据之前先发送起动命令字	
/**********************************************************************/
#define RISEGO 0x88
#define RISEBACK 0x89
#define PUSH2GO 0x8A
#define PUSH2BACK 0x8B
#define PUSH1GO 0x87

#define PID_RESET 0XA4		//复位指令(0数据指令)
#define FREE_STOP 0X81		//自由停机指令(0数据指令)
#define SPEED_SET 0X80		//速度设定(双数据指令)
#define DISTANCE_SET 0X90	//位置设定(四数据指令)
/**********************************************************************/
//片选A,B控制器端口定义 R-A,L-B;
#define SELA PORTD &= ~BIT( 2 )
#define USELA PORTD |= BIT( 2 )
#define SELB PORTD &= ~BIT( 3 )
#define USELB PORTD |= BIT( 3 )
/**********************************************************************/
/* ******************************************************************
 * 功能:利用同步串口向从机(a,b电机)发送数据				*
 * 参数:								*
 * data: 发送数据流指针,
 * 	dataLen,发送数据流长度						*
 * 	motor,发送对象(0,A控制器;1,B控制器;3或其它,同时发送至两控制器)	*
 	motor = 1,右,  0,左
 *********************************************************************/
void Master_send( unsigned char *data, unsigned char dataLen, unsigned char motor )
{
	unsigned char i;
	
	if( motor == 0 ) SELA;
	else if( motor == 1 ) SELB;
	else
	{
		SELA;
		SELB;
	}
	
	i=100;
	while(i--);
	
	SPDR = (CMD_START | 0x00) + dataLen;  	//主机向从机发送起始命令字 
	
	while( !( SPSR & BIT( SPIF ) ) ); 
	
	for( i = 0; i < dataLen; i ++ )
	{
		SPDR = data[i];
		while( !( SPSR & BIT( SPIF ) ) );
		//delay_s(1);
	}

	USELA;
	USELB;
}

/* ******************************************************************
 * 功能:利用同步串口从从机(a,b电机)接收dataLen长度的数据				*
 * 参数:								*
 * 	dataLen, 接收数据流长度						*
 * 	motor,发送对象(0,A控制器;1,B控制器;3或其它,同时发送至两控制器)	*
 	motor = 1,右,  0,左
 *********************************************************************/
void Master_rev(unsigned char dataLen, unsigned char motor)
{
	unsigned char i = 0;
	unsigned char j = 0;
	
	if( motor == 0 ) SELA;
	else if( motor == 1 ) SELB;
	else
	{
		SELA;
		SELB;
	}
	
	j =100;
	while(j--);
	
	SPDR = (CMD_START | 0x10) + dataLen;  	//主机向从机发送起始命令字 
	
	while( !( SPSR & BIT( SPIF ) ) ); 
	
	for (i = 0; i < dataLen; i++)
	{
		j =100;
		while(j--);		//延时等待从机将数据准备好
    	SPDR = 0x00;	//启动SPI
    	while( !( SPSR & BIT( SPIF ) ) ); 	//等待发送完毕。
		rev_buf[i] = SPDR;		
	}
	
	USELA;
	USELB;
	
}

void set_stop(unsigned char motor)
{
	unsigned char buf;
	buf = FREE_STOP;
	Master_send(&buf,1,motor);
}

void set_speed (signed int num_speed ,unsigned char motor)
{
	unsigned char buf[3];
	
	buf[0] = SPEED_SET;
	buf[1] = num_speed>>8;
	buf[2] = (unsigned char)num_speed;
	
	Master_send(buf,3,motor);
}

void set_distance (signed long num_distance ,unsigned char motor)
{
	unsigned char buf[5];
	
	buf[0] = DISTANCE_SET;
	
	buf[4] = (unsigned char)num_distance;
	
	num_distance >>= 8;
	buf[3] = (unsigned char)num_distance;
	
	num_distance >>= 8;
	buf[2] = (unsigned char)num_distance;
	
	num_distance >>= 8;
	buf[1] = (unsigned char)num_distance;
	
	Master_send(buf,5,motor);	
}

void PID_reset(unsigned char motor)
{
	unsigned char buf;
     buf = PID_RESET;
     Master_send(&buf,1,motor);
}

void  risego(void)
{
    unsigned char buf[1];
	
	buf[0] = RISEGO;
	
	Master_send(buf,1,1);
	//Master_send(buf,1,0);
} 

void riseback(void)
{
    unsigned char buf[1];
	
	buf[0] = RISEBACK;
	
	//Master_send(buf,1,1);
	Master_send(buf,1,1);
} 
void push2go(void)
{
    unsigned char buf[1];
	
	buf[0] = PUSH2GO;
	
	//Master_send(buf,1,1);
	Master_send(buf,1,0);

}
void push2back(void)
{
    unsigned char buf[1];
	
	buf[0] = PUSH2BACK;
	
	//Master_send(buf,1,1);
	Master_send(buf,1,0);
}

void push1go(void)
{
    unsigned char buf[1];
	
	buf[0] = PUSH1GO;
	
	//Master_send(buf,1,1);
	Master_send(buf,1,1);
}


#pragma interrupt_handler spi_stc_isr:11
void spi_stc_isr(void)
{
 	//byte in SPDR has been sent/received
 	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -