这几周做的电老鼠,我搞的的是软件方向;
由于之前没有基础 就拿邱哥之前做的东西 拿来参考
文件夹的全部文件; 研究一个项目 我们要看的是.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 // Target : ATmega128 CPU寄存器定义
#include // 常用宏定义
/*******************************************************************************************/
/* 宏定义 */
#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)里面调用红外测距的方法
先留着