• 简易电老鼠整个流程




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

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


    文件夹的全部文件; 研究一个项目 我们要看的是.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)里面调用红外测距的方法


    先留着

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    today lazy . tomorrow die .
  • 相关阅读:
    python操作redis之hash操作
    mongodb数据库分片实现链接
    python连接redis数据库的两种方式
    python操作rabbitmq实现消息过滤接收
    python操作rabbitmq实现广播效果
    关于java和python同时使用rabbitmq时队列同名问题的探讨
    java操作rabbitmq实现简单的消息发送(socket编程的升级)
    python使用rabbitmq实现简单的消息转发
    optiongroup标签选项组
    day05_日常SQL练习(一)
  • 原文地址:https://www.cnblogs.com/france/p/4808626.html
Copyright © 2020-2023  润新知