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