电脑鼠走迷宫算法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

{

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);

}

}

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

}


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn