简易电老鼠整个流程

时间:2023-02-06 06:08:16



 这几周做的电老鼠,我搞的的是软件方向;

由于之前没有基础 就拿邱哥之前做的东西 拿来参考

简易电老鼠整个流程

文件夹的全部文件; 研究一个项目 我们要看的是.c 和.h文件 其他的都是编译产生的附带文件

这里说一下: 

设计这个采用一种设计模式,保证维护性好

main.c 是我们的主文件 里面写了整个流程的实现

moto.c 是我们的电老鼠的方法实现 比如移动 转向 减速等等 而main.c里面就是如果要用电老鼠的话就加moto.c的方法 如果要用流水灯就用引入led.c

这个复用性高很多


至于moto.h  就是把一些定义放里面  比如一些常量 还有方法(类似接口的实现)


然后在来分析下这三个文件;

首先给出的是

moto.h

/********************************************************************************************
* 文件名: Moto.h																			*
* 创建人: 邱作霖  创建时间 : 2013-4-3 15:30:38												*
* 修改人: 邱作霖  修改时间 : 2013-4-3 15:30:40												*
* 功能	: AVR单片机初始化程序																*
* 版权	: 邱作霖																			*
********************************************************************************************/
#ifndef	Moto_H
#define	Moto_H
/********************************************************************************************/
/* 共享宏定义 这部分宏定义可以给外部函数调用				*/
/************************************************************/
/* 宏定义													*/
#define	u16	unsigned int									//
#define	u08	unsigned char									//
#define	c08	const unsigned char								//
/************************************************************/
/* 共享常量定义	可以给外部函数调用							*/
#define	c_MOTO_RUN				1							// 电机转动
#define	c_MOTO_STOP				0							// 电机停止
/************************************************************/
/* 共享变量定义	可以给外部函数调用							*/
/************************************************************/
/* 函数说明列表												*/
void	Moto_Init( void	);
void	Moto_Run( void );
void	Moto_Brake(	void );
void	MotoL_Run( void	);
void	MotoL_Brake( void );
void	MotoR_Run( void	);
void	MotoR_Brake( void );
void	MotoL_Speed( void );
void	MotoR_Speed( void );
void	Moto_Test( void	);									// 电机测试
void	Mouse_Turnleft(	void );
void	Mouse_Turnright( void );
void	Mouse_Turnback(	void );
/************************************************************/
#endif

注释都写的很清楚了


Moto.c

/********************************************************************************************
* 文件名: Moto.c																			*
* 创建人: 邱作霖  创建时间 : 2013-4-3 15:30:05												*
* 修改人: 邱作霖  修改时间 : 2013-4-11 4:47:10												*
* 功能	: 直流电机控制																		*
* 版权	: 邱作霖																			*
********************************************************************************************/
#include <iom128v.h>										// Target :	ATmega128 CPU寄存器定义
#include <macros.h>											// 常用宏定义
/*******************************************************************************************/
/* 宏定义													*/
#define	u16	unsigned int									//
#define	u08	unsigned char									//
#define	c08	const unsigned char								//
/************************************************************/
/* 系统常数													*/
#define	c_FC_OSC				16000000					// 晶振频率16MHz
/************************************************************/
#define	true					1							//
#define	false					0							//
#define	bit7					0x80						//
#define	bit6					0x40						//
#define	bit5					0x20						//
#define	bit4					0x10						//
#define	bit3					0x08						//
#define	bit2					0x04						//
#define	bit1					0x02						//
#define	bit0					0x01						//
/************************************************************/
/* 常用汇编指令												*/
#define	sbi( x,	y )				( x	|= y )					// x置第y位
#define	cbi( x,	y )				( x	&=~y )					// x清除第y位
#define	cki( x,	y )				( x	&  y )					// 测试x的第y位	结果0表示0 结果非0表示1
/************************************************************/
/* 硬件外设资源												*/
#define	MotoL_Enable()			sbi(PORTB,bit4)				// 打开PWM管脚
#define	MotoL_Disable()			cbi(PORTB,bit4)				// 关闭PWM管脚
#define	MotoL_Forward()			sbi(PORTC,bit0)				// 左电机正向 前进方向
#define	MotoL_Reverse()			cbi(PORTC,bit0)				// 左电机反向
#define	MotoL_Mode_Brake()		sbi(PORTC,bit1)				// 左电机控制芯片A3950模式 1:制动
#define	MotoL_Mode_Sync()		cbi(PORTC,bit1)				// 左电机控制芯片A3950模式 1:同步整流
#define	MotoL_Sleep_On()		cbi(PORTC,bit2)				// 左电机控制芯片A3950休眠 0:休眠
#define	MotoL_Sleep_Off()		sbi(PORTC,bit2)				// 左电机控制芯片A3950休眠 1:退出休眠,芯片正常工作
#define	MotoL_Chreset()			cbi(PORTC,bit3)				// 左电机辩向电路逻辑芯片D触发器初始化 1:有效,0:正常工作
															//
#define	MotoR_Enable()			sbi(PORTB,bit7)				// 打开PWM管脚
#define	MotoR_Disable()			cbi(PORTB,bit7)				// 关闭PWM管脚
#define	MotoR_Forward()			cbi(PORTC,bit4)				// 右电机正向 前进方向
#define	MotoR_Reverse()			sbi(PORTC,bit4)				// 右电机反向
#define	MotoR_Mode_Brake()		sbi(PORTC,bit5)				// 右电机控制芯片A3950模式 1:制动
#define	MotoR_Mode_Sync()		cbi(PORTC,bit5)				// 右电机控制芯片A3950模式 1:同步整流
#define	MotoR_Sleep_On()		cbi(PORTC,bit6)				// 右电机控制芯片A3950休眠 0:休眠
#define	MotoR_Sleep_Off()		sbi(PORTC,bit6)				// 右电机控制芯片A3950休眠 1:退出休眠,芯片正常工作
#define	MotoR_Chreset()			cbi(PORTC,bit7)				// 右电机辩向电路逻辑芯片D触发器初始化 1:有效,0:正常工作
															//
#define	Led_Left_On()			sbi(PORTD,bit4)				// 左边指示灯 1:点亮
#define	Led_Left_Off()			cbi(PORTD,bit4)				// 左边指示灯 0:灭
#define	Led_Right_On()			sbi(PORTA,bit0)				// 右边指示灯 1:点亮
#define	Led_Right_Off()			cbi(PORTA,bit0)				// 右边指示灯 0:灭
/**************************************** ********************/
/* 常量定义													*/
/************************************************************/
/* 电机常量													*/
#define	c_MotoL_Forward			1							// 左边电机在左转
#define	c_MotoL_Reverse			0							// 左边电机在右转
#define	c_MotoR_Forward			1							// 右边电机在左转
#define	c_MotoR_Reverse			0							// 右边电机在右转
#define	c_MOTO_RUN				1							// 电机转动
#define	c_MOTO_STOP				0							// 电机停止
#define	c_MOTOL_SPEED			0x0060						// 电机初始速度
#define	c_MOTOR_SPEED			0x0060						// 电机初始速度
/************************************************************/
/* 变量定义													*/
/************************************************************/
/* 位变量定义												*/
//static	u08	b_MotoL_Dir;									// 左边电机旋转方向
//static	u08	b_MotoR_Dir;									// 左边电机旋转方向
/************************************************************/
/* 数据变量定义												*/
static	u16	g_MotoL_Sum;									// 电机转过的步数累加
static	u16	g_MotoR_Sum;									// 电机转过的步数累加
static	u16	g_MotoL_Tcnt;									// 电机数据处理变量
static	u16	g_MotoR_Tcnt;									//
static	u16	g_MotoL_Speed;									// 电机数据处理变量
static	u16	g_MotoR_Speed;									//
/*******************************************************************************************/
//															//
/* 代码开始													*/
//															//
/************************************************************/
//说明:毫秒延时
//输入:g_Ms:延时的时间
//输出:无
void Moto_Delay_Ms(	u16	g_Ms )								// ms 延时
{
#define	c_Delay_Ms				(u16)(c_FC_OSC/7000-2)		// 1个循环大约7个周期计算方法:时钟/7000,再减去计算延时计数器g_Ms的周期

	u16	j;													// 特别要注意 用static声明的变量,编译后的代码是不一样的。特别是这类延时程序。

	for( ; g_Ms	> 0; g_Ms--	)
	{
		for( j = 0;	j <	c_Delay_Ms;	j++	);					// 根据仿真一个双字节变量的for循环大约7个周期
	}
}

/************************************************************/
//说明:左电机调速
//输入:直线运行中定时调用
//输出:无
void MotoL_Speed( void )
{
	g_MotoL_Tcnt = TCNT1;

	TCNT1H = 0x00;
	TCNT1L = 0x00;

	if(	g_MotoL_Tcnt >=	g_MotoL_Speed )
	{
		OCR0 -=	0x01;				// 调整占空比
		if(	OCR0 ==	0xFF)
		{
			OCR0 = 0x00;			// 调整占空比
		}
	}
	else
	{
		OCR0 +=	0x01;				// 调整占空比
		if(	OCR0 ==	0x00)
		{
			OCR0 = 0xFF;			// 调整占空比
		}
	}
}

/************************************************************/
//说明:右电机调速
//输入:直线运行中定时调用
//输出:无
void MotoR_Speed( void )
{
	g_MotoR_Tcnt = TCNT3;

	TCNT3H = 0x00;
	TCNT3L = 0x00;

	if(	g_MotoR_Tcnt >=	g_MotoR_Speed )
	{
		OCR2 -=	0x01;				// 调整占空比
		if(	OCR2 ==	0xFF)
		{
			OCR2 = 0x00;			// 调整占空比
		}
	}
	else
	{
		OCR2 +=	0x01;				// 调整占空比
		if(	OCR2 ==	0x00)
		{
			OCR2 = 0xFF;			// 调整占空比
		}
	}
}

/************************************************************/
//说明:电机运行(2个电机同时)
//输入:直线运行中调用
//输出:无
void Moto_Run( void	)
{
	MotoL_Forward();										// 左电机正向
	MotoR_Forward();										// 左电机正向
	MotoL_Enable();											// 先启动电机
	MotoR_Enable();											// 先启动电机
															// 再连接OC0
	TCCR0 &=~BIT(COM00);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR0 |= BIT(COM00);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留,其他模式OC0取反
//	TCCR0 &=~BIT(COM01);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
	TCCR0 |= BIT(COM01);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零

	TCCR2 &=~BIT(COM20);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR2 |= BIT(COM20);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留
//	TCCR2 &=~BIT(COM21);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
	TCCR2 |= BIT(COM21);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零

	TCCR0 |= 0x06;											// 定时器启动,分频比:clkT0S/256  (来自预分频器) 4ms
	TCCR2 |= 0x04;											// 定时器启动,分频比:clkT0S/256  (来自预分频器)  4ms
}

/************************************************************/
//说明:电机停止(2个电机同时)
//输入:直线运行中调用
//输出:无
void Moto_Brake( void )										// 左电机控制制动
{
	TCCR0 &= 0xF8;											// 先停止定时器运行, 无时钟 T/C 不工作
	TCCR2 &= 0xF8;											// 先停止定时器运行,无时钟	T/C	不工作
															// 再断开OC0连接
	TCCR0 &=~BIT(COM00);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR0 |= BIT(COM00);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留,其他模式OC0取反
	TCCR0 &=~BIT(COM01);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
//	TCCR0 |= BIT(COM01);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零
															// 再断开OC2连接
	TCCR2 &=~BIT(COM20);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR2 |= BIT(COM20);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留
	TCCR2 &=~BIT(COM21);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
//	TCCR2 |= BIT(COM21);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零

	MotoL_Reverse();										// 左电机反向
	MotoR_Reverse();										// 电机反向
	MotoL_Enable();											// 先启动电机
	MotoR_Enable();											// 先启动电机

/*
	if(b_MotoL_Dir)											// 判断是否停转
	{
		while(!b_MotoL_Dir);
	}
	else
	{
		while(b_MotoL_Dir);
	}
*/

//	Moto_Delay_Ms(100);										// 倒退20ms	具体反转时间需要调节

	MotoL_Disable();										// 强制关闭电机
	MotoR_Disable();										// 强制关闭电机
}

/************************************************************/
//说明:左电机停止
//输入:转弯运行中调用
//输出:无
void MotoL_Brake( void )									// 左电机控制制动
{
	TCCR0 &= 0xF8;											// 先停止定时器运行, 无时钟 T/C 不工作
															// 再断开OC0连接
	TCCR0 &=~BIT(COM00);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR0 |= BIT(COM00);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留,其他模式OC0取反
	TCCR0 &=~BIT(COM01);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
//	TCCR0 |= BIT(COM01);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零

//	MotoL_Reverse();										// 左电机反向 这部分是否有必要,调试来验证
//	MotoL_Enable();											// 先启动电机
//	Moto_Delay_Ms(20);										// 倒退20ms	具体反转时间需要调节

	MotoL_Disable();										// 强制关闭电机
}

/************************************************************/
//说明:左电机运行
//输入:转弯运行中调用
//输出:无
void MotoL_Run(	void )
{
//	MotoL_Forward();										// 左电机正向
	MotoL_Enable();											// 先启动电机
															// 再连接OC0
	TCCR0 &=~BIT(COM00);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR0 |= BIT(COM00);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留,其他模式OC0取反
//	TCCR0 &=~BIT(COM01);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
	TCCR0 |= BIT(COM01);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零

	TCCR0 |= 0x06;											// 定时器启动,分频比:clkT0S/256  (来自预分频器) 4ms
}

/************************************************************/
//说明:右电机停止
//输入:转弯运行中调用
//输出:无
void MotoR_Brake( void )									// 右电机控制制动
{
	TCCR2 &= 0xF8;											// 先停止定时器运行,无时钟	T/C	不工作
															// 再断开OC2连接
	TCCR2 &=~BIT(COM20);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR2 |= BIT(COM20);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留
	TCCR2 &=~BIT(COM21);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
//	TCCR2 |= BIT(COM21);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零

//	MotoR_Reverse();										// 左电机反向  这部分是否有必要,调试来验证
//	MotoR_Enable();											// 先启动电机
//	Moto_Delay_Ms(20);										// 倒退20ms	具体反转时间需要调节

	MotoR_Disable();										// 强制关闭电机
}

/************************************************************/
//说明:右电机运行
//输入:运行中调用
//输出:无
void MotoR_Run(	void )
{
//	MotoR_Forward();										// 左电机正向
	MotoR_Enable();											// 启动电机

	TCCR2 &=~BIT(COM20);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR2 |= BIT(COM20);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留
//	TCCR2 &=~BIT(COM21);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
	TCCR2 |= BIT(COM21);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零
															// 再连接OC2
	TCCR2 |= 0x04;											// 定时器启动,分频比:clkT0S/256  (来自预分频器)  4ms
}

/************************************************************/
//说明:连续右转弯45度或90度
//输入:角度
//输出:无
void Mouse_Turnright( void )
{
	u08	g_OCR0;
	u08	g_OCR2;
	int	g_Turnright_Tcnt;

	g_OCR0 = OCR0;
	g_OCR2 = OCR2;
	TCCR0 &= 0xF8;											// 先停止定时器运行, 无时钟 T/C 不工作
	TCCR2 &= 0xF8;											// 先停止定时器运行,无时钟	T/C	不工作
															// 再断开OC0连接
	TCCR0 &=~BIT(COM00);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR0 |= BIT(COM00);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留,其他模式OC0取反
	TCCR0 &=~BIT(COM01);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
//	TCCR0 |= BIT(COM01);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零
															// 再断开OC2连接
	TCCR2 &=~BIT(COM20);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR2 |= BIT(COM20);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留
	TCCR2 &=~BIT(COM21);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
//	TCCR2 |= BIT(COM21);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零

	MotoL_Enable();											// 右转弯即左轮全速运行
	MotoR_Disable();										// 强制关闭电机:右转弯即右轮停止,依靠惯性做弧线运动
	Led_Right_On();											// 右转弯开始
	TCNT1 =	0x00;											// 左右电机速度差即编码器输出的差值
	TCNT3 =	0x00;

	while(1)
	{
		g_MotoL_Tcnt = TCNT1;
		g_MotoR_Tcnt = TCNT3;
		g_Turnright_Tcnt = g_MotoL_Tcnt	- g_MotoR_Tcnt;
		if(	g_Turnright_Tcnt > 0x0400 )						// 需反复调整左转弯的步数
		{
			break;											// 转过来即可
		}
	}

//	MotoL_Disable();										// 强制关闭电机
//	MotoR_Disable();										// 强制关闭电机
//	Moto_Delay_Ms(1500);
	TCNT1 =	0x00;
	TCNT3 =	0x00;
	OCR0 = g_OCR0;
	OCR2 = g_OCR2;
	Led_Right_Off();										// 右转弯结束
	Moto_Run();												// 右转弯后直线运行
}

/************************************************************/
//说明:连续左转弯45度或90度
//输入:角度
//输出:无
void Mouse_Turnleft( void )
{
	int	g_Turnleft_Tcnt;

	TCCR0 &= 0xF8;											// 先停止定时器运行, 无时钟 T/C 不工作
	TCCR2 &= 0xF8;											// 先停止定时器运行,无时钟	T/C	不工作
															// 再断开OC0连接
	TCCR0 &=~BIT(COM00);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR0 |= BIT(COM00);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留,其他模式OC0取反
	TCCR0 &=~BIT(COM01);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
//	TCCR0 |= BIT(COM01);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零
															// 再断开OC2连接
	TCCR2 &=~BIT(COM20);									// 比较输出模式	 四种模式	COM01和COM00控制
//	TCCR2 |= BIT(COM20);									// 00:正常的端口操作,OC0 未连接  01:PWM模式下保留
	TCCR2 &=~BIT(COM21);									// 10:比较匹配发生时OC0 清零,计数到TOP 时OC0 置位
//	TCCR2 |= BIT(COM21);									// 11:比较匹配发生时OC0 置位,计数到TOP 时OC0 清零

	MotoL_Disable();										// 强制关闭电机:左转弯即左轮停止,依靠惯性做弧线运动
	MotoR_Enable();											// 左转弯即右轮全速运行
	Led_Left_On();											// 左转弯开始
	TCNT1 =	0x00;											// 左右电机速度差即编码器输出的差值
	TCNT3 =	0x00;

	while(1)
	{
		g_MotoL_Tcnt = TCNT1;
		g_MotoR_Tcnt = TCNT3;
		g_Turnleft_Tcnt	= g_MotoR_Tcnt - g_MotoL_Tcnt;
		if(	g_Turnleft_Tcnt	> 0x0600 )						// 需反复调整左转弯的步数
		{
			break;											// 转过来即可
		}
	}

	Led_Left_Off();											// 左转弯结束
	Moto_Run();												// 左转弯后直线运行
}

/************************************************************/
//说明:掉头
//输入:直线运行前方有障碍物时调用
//输出:无
void Mouse_Turnback( void )
{
	int	g_Turnback_Tcnt;

	Moto_Brake();											// 先刹车,左右电机的PWM控制管脚脱离定时器

//	MotoL_Reverse();										// 左电机反向 目的是为了掉头的时候尾部可以避过障碍物,当然如果刹车及时,可以不需要倒退
//	MotoR_Reverse();										// 电机反向
//	MotoL_Enable();											// 先启动电机
//	MotoR_Enable();											// 先启动电机
//	Moto_Delay_Ms(60);										// 倒退20ms	具体反转时间需要调节

	MotoL_Forward();										// 左电机正向
	MotoR_Reverse();										// 右电机反向
	MotoL_Enable();											// 先启动电机
	MotoR_Enable();											// 先启动电机
	Led_Right_On();											// 掉头开始,右转方向

	TCNT1 =	0x00;											// 开始掉头,初始化掉头计数器
	TCNT3 =	0x00;											// 左右电机速度差即编码器输出的差值

	while(1)
	{
		g_MotoL_Tcnt = TCNT1;
		g_MotoR_Tcnt = TCNT3;
		g_Turnback_Tcnt	= g_MotoR_Tcnt + g_MotoL_Tcnt;
		if(	g_Turnback_Tcnt	> 0x0580 )						// 需反复调整掉头的步数
		{
			break;
		}
	}
	Led_Right_Off();										// 掉头结束

//	Moto_Brake();											// 先刹车,左右电机的PWM控制管脚脱离定时器
	Moto_Run();												// 掉头后直线运行

//	while(1);                								// 调试用,掉头后暂停看效果
}

/************************************************************/
//说明:搜索前进
//输入:无
//输出:无
void Mouse_Search( void	)
{
}

/************************************************************/
//说明:电机初始化,包括I/O端口,使用到的资源
//输入:初始化调用
//输出:无
void Moto_Init(	void )
{
	DDRC  =	0xFF;											// 初始化端口为输出
	PORTC =	0xFF;;											// 初始化输出1

	MotoL_Forward();										// 左电机正向
//	MotoL_Reverse();										// 左电机反向
	MotoL_Mode_Brake();										// 左电机控制芯片A3950模式 1:制动
//	MotoL_Mode_Sync();										// 左电机控制芯片A3950模式 0:同步整流
	MotoL_Chreset();										// 左电机辩向电路逻辑芯片D触发器初始化 1:复位 0:正常工作

	MotoR_Forward();										// 右电机正向
//	MotoR_Reverse();										// 右电机反向
	MotoR_Mode_Brake();										// 右电机控制芯片A3950模式 1:制动
//	MotoR_Mode_Sync();										// 右电机控制芯片A3950模式 0:同步整流
	MotoR_Chreset();										// 右电机辩向电路逻辑芯片D触发器初始化 1:复位 0:正常工作

//	MotoL_Sleep_On();										// 左电机控制芯片A3950休眠 0:休眠
	MotoL_Sleep_Off();										// 左电机控制芯片A3950休眠 1:退出休眠,芯片正常工作
//	MotoR_Sleep_On();										// 右电机控制芯片A3950休眠 0:休眠
	MotoR_Sleep_Off();										// 右电机控制芯片A3950休眠 1:退出休眠,芯片正常工作

//	b_MotoL_Dir	= c_MotoL_Forward;
//	b_MotoL_Dir	= c_MotoL_Reverse;
//	b_MotoR_Dir	= c_MotoR_Forward;
//	b_MotoR_Dir	= c_MotoR_Reverse;

	g_MotoL_Speed =	c_MOTOL_SPEED;
	g_MotoR_Speed =	c_MOTOR_SPEED;

	MotoL_Brake();											// 开机初始化的时候电机停转
	MotoR_Brake();											// 开机初始化的时候电机停转
}

/************************************************************/
//说明:搜索前进
//输入:无
//输出:无
void Moto_Test(	void )
{
	Mouse_Search();
}

/********************************************************************************************/
/* 文件结束


	while(1)
	{
		if(b_Timer1_Compa)
		{
			b_Timer1_Compa = false;
	OCR1AH = 0xFF;	// 0x0200 即512个脉冲
	OCR1AL = 0xFF;

	MotoL_Reverse();										// 左电机反向
	MotoR_Forward();

	while(!b_MotoL_Dir);

	MotoL_Disable();										// 强制关闭电机
	MotoR_Disable();										// 强制关闭电机
	Delay_Ms(1000);											// 按键后等待手离开位置,一会再跑

			if(b_Button)
			{
				Led_Busy_On();
				b_Button = false;
			}
			else
			{
				Led_Busy_Off();
				b_Button = true;
			}
			OCR1AH = 0x02;	// 0x0200 即512个脉冲
			OCR1AL = 0x00;
			MotoL_Forward();
			MotoR_Reverse();										// 电机反向
	MotoL_Enable();											// 先启动电机
	MotoR_Enable();											// 先启动电机

			b_Timer0++;
			if(b_Timer0==20)
			{
				MotoL_Disable();										// 强制关闭电机
				MotoR_Disable();										// 强制关闭电机
				while(1);
			}
		}
	}
*/


对方法的实现



main.c

这里先给出主要的main函数 看代码的时候就先看主函数 进行每个函数在跳过去看具体实现


void main( void	)
{
	u08	i;

	Init_Devices();
	Printf(s_Version);
	Printf(s_Verdata);
	Moto_Init();											// 电机初始化

	while(0)												// 初始化,读取红外环境数据基础值
	{
		if(b_Adc_Data)										// ADC数据采样完毕
		{
			b_Adc_Data = false;
			for( i = 0;	i <	c_ADC_NUM; i++ )				// 数据保存
			{
				g_Ir_Stance[i] = g_Ir_Data[i];
				Putchar(g_Ir_Stance[i]);
			}
		}
	}

	Bell(2);												// 初始化OK,灯亮,蜂鸣器响1声
	Delay_Ms(1000);

	while( (PIND & bit7	) );								// 等待按键
	Bell(1);												// 蜂鸣器响1声
	while( !(PIND &	bit7 ) );								// 等待按键松开
	Delay_Ms(1000);											// 按键后等待手离开位置,一会再跑

	Moto_Run();												// 电脑鼠出发

	while(1)
	{
	    if(b_Rxd_Buf)
		{
        	b_Rxd_Buf=0;
			Putchar(g_Rxd_Buf[0]);
			Putchar(g_Rxd_Buf[1]);
			Putchar(g_Rxd_Buf[2]);

			if(g_Rxd_Buf[0]==0x55)
			{
				OCR0 = g_Rxd_Buf[2];				// 调整占空比
				OCR2 = g_Rxd_Buf[2];				// 调整占空比
			}

			if(g_Rxd_Buf[0]==0xAA)
			{
				OCR0 = g_Rxd_Buf[2];				// 调整占空比
				OCR2 = g_Rxd_Buf[2];				// 调整占空比
			}
		}
	}
}


由于只要实现让它跑就行 就到上面那个就行 while(1)就行了



由于后面还要求跑起来的时候需要红外测距;

想着说应该是在while(1)里面调用红外测距的方法


先留着