当前位置:文档之家› 电脑鼠走迷宫算法C语言

电脑鼠走迷宫算法C语言


#include "stdio.h"
#include "action.h"
#include "bmp_pixel.h"
#include "NOKIA_5110.h"
#include "configuration.h"


void Stop_On_Going()
{
Wheel_Control(LEFT,WHEEL_FRONT,255);
Wheel_Control(RIGHT,WHEEL_FRONT,255);
delay_ms(20);

}

void Turn_Left()
{
Stop_On_Going();
Wheel_Control(LEFT,WHEEL_BACK,80);
Wheel_Control(RIGHT,WHEEL_FRONT,80);
delay_ms(20);
}

void Go_straight() //直走的具体实现
{

Wheel_Control(LEFT,WHEEL_FRONT,80);
Wheel_Control(RIGHT,WHEEL_FRONT,80);
delay_ms(20);

}

void Turn_Right() //右转的具体实现
{
Stop_On_Going();
Wheel_Control(LEFT,WHEEL_FRONT,80);
Wheel_Control(RIGHT,WHEEL_BACK,80);
delay_ms(20);

}

void Turn_back() //调头的具体实现
{

Wheel_Control(LEFT,WHEEL_FRONT,80);
Wheel_Control(RIGHT,WHEEL_BACK,80);
delay_ms(20);

}

void Left_Adjust() //左偏 后向 右微调 的具体实现
{
Wheel_Control(LEFT,WHEEL_FRONT,80);
Wheel_Control(RIGHT,WHEEL_FRONT,70);
delay_ms(10);
}

void Right_Adjust() //右偏 后向 左微调 的具体实现
{
Wheel_Control(LEFT,WHEEL_FRONT,70);
Wheel_Control(RIGHT,WHEEL_FRONT,80);
delay_ms(10);
}

void main()
{
u16 mode ;
u8 sensor ;


u8 i=180,count=0,dir=0,pn =0,dis[20];
u16 l_count,r_count;
//功能模块初始化
// GPIO_config(); //STC15W4K32S4 PWM复用口 由高阻初始化为双向口
EXTI_config(); //外部中断 测速
Timer_config(); //定时器
PCA_config(); //PWM
UART_config(); //串口
ADC_config(); //AD 电压检测
//液晶屏初始化
LCD_init();
LCD_clear();
LCD_draw_bmp_pixel(15,0,BMP,48,56);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
LCD_clear();
LCD_write_english_string(2,0," Welcome To ");
LCD_write_english_string(2,1," S W J T U ");
LCD_write_english_string(2,2," DNS VER 2.1 ");
LCD_write_english_string(2,3,"Nokia5110 LCD ");
LCD_write_chinese_string(1,4,12,6,0,2);
//wait for the start key down


while(Start_Key); /////


// 延时启动(start按键按下,等待n秒后启动)
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
LCD_clear();
//开总中断
SET_EA();

while(1)
{

Go_straight(); //测试直走

}


while(1)
{

while(1)
{
Go_straight();
}
while(1)
{

sensor = P1&0xf8;
switch(sensor)
{
case 0x18 : mode = 1; break; ////00011000 左转
case 0xd8 : mode = 2; break; ////11011000 直走
case 0xc0 : mode = 3; break; ////11000000 左转
case 0x00 : mode = 4; break; ////00000000 掉头


case 0x98 : mode = 10; break; ////10011000 稍微

偏左,后续调整
case 0xc8 : mode = 11; break; ////11001000 稍微偏右,后续调整

default : mode = 2; break; ////其他情况,执行直走
}

switch(mode)
{
case 1 : Turn_Left(); break;
case 2 : Go_straight(); break;
case 3 : Turn_Right(); break;
case 4 : Turn_back(); break;

case 10 : Left_Adjust(); break;
case 11 : Right_Adjust(); break;

default : Turn_Right(); break;
}

}

/* 以下是电脑鼠功能模块测试程序,方便测试各个模块功能是否正常,测试完毕后可注释掉或者删除 */
if(timer0_flag)
{
timer0_flag = 0;
count ++;
}
if(count == 10)
{
count = 0;

l_count = left_count;
r_count = right_count;
left_count = 0;
right_count = 0;
// 电机控制测试 加速->减速->反转->加速->减速...如此循环
if(i<180)
{
dir = !dir;
pn = 1;
}
if(i>254)
pn = 0;
if(pn) i++;
else i--;
Wheel_Control(LEFT,dir,255-i);
Wheel_Control(RIGHT,dir,255-i);
// PWM 显示
sprintf(dis,"PWM :%d %3.0f%%",(int)i,(float)i/255*100);
LCD_write_english_string(0,0,dis);
// 电机供电电池电压 显示
sprintf(dis,"Vmotor:%.1fV",(float)(4.98/Get_ADC10bitResult(0)*Get_ADC10bitResult(1)));
LCD_write_english_string(0,2,dis);
// 单片机供电电池电压 显示
sprintf(dis,"Vmcu :%.1fV",(float)(4.98/Get_ADC10bitResult(0)*Get_ADC10bitResult(2)));
LCD_write_english_string(0,3,dis);
// 中断测速
sprintf(dis,"L:%d",(int)l_count);
LCD_write_english_string(0,4,dis);

sprintf(dis,"R:%d",(int)r_count);
LCD_write_english_string(40,4,dis);

}
}
/* 以上是电脑鼠功能模块测试程序,方便测试各个模块功能是否正常,测试完毕后可注释掉或者删除 */
}

相关主题
文本预览
相关文档 最新文档