📄 +Ȧ
字号:
#ifndef _MIGONG_H_
#define _MIGONG_H_
#include "che.h"
#include "lcd1602.h"
uint i_l,i_r;
uint i_bai;
#define flag_stop 10
#define left_xun 0 //左转的循环扫描次数
#define right_xun 0 //右转的循环扫描次数
#define qian_duo 80
#define xun_sure 10
//uchar migong_s[30]={L,L,U,L,U,L,U,L,L,L,L,L,U,L,L,U,L,U,S,L,U,L,L};
//uchar f_mg_s=23,f_mg_e=0;
uchar migong_s[30]={0};
uchar f_mg_s=0,f_mg_e=0;
bit flag_end,flag_mg,flag_beep_en;
sbit beep = P3^5;
/*********************
*************************8**/
void migong_dispose(uchar dat)
{
migong_s[f_mg_s] = dat;
f_mg_s++;
write_sfm2(2,13,f_mg_s);
delay_1ms(20);
}
void migong_path() // 得到最最短路径
{
static uchar value,i,j;
f_mg_e = f_mg_s;
if(migong_s[0] == U)
i = 1;
else
i = 0;
while(1)
{
if(migong_s[i] == U)
{
if((migong_s[i-1] == L) && (migong_s[i] == U) && (migong_s[i+1] == L))
{
migong_s[i-1] = S;
}
else if((migong_s[i-1] == S) && (migong_s[i] == U) && (migong_s[i+1] == L))
{
migong_s[i-1] = R;
}
else if((migong_s[i-1] == L) && (migong_s[i] == U) && (migong_s[i+1] == S))
{
migong_s[i-1] = R;
}
else if((migong_s[i-1] == S) && (migong_s[i] == U) && (migong_s[i+1] == S))
{
migong_s[i-1] = U;
}
else if((migong_s[i-1] == L) && (migong_s[i] == U) && (migong_s[i+1] == R))
{
migong_s[i-1] = U;
}
else if((migong_s[i-1] == R) && (migong_s[i] == U) && (migong_s[i+1] == L))
{
migong_s[i-1] = U;
}
else if((migong_s[i-1] == R) && (migong_s[i] == U) && (migong_s[i+1] == R))
{
migong_s[i-1] = S;
}
for(value = i;value < f_mg_e;value++)
{
migong_s[value] = migong_s[value + 2];
}
if((f_mg_e != 1) && (f_mg_e != 2))
f_mg_e -= 2;
migong_s[f_mg_e + 1] = migong_s[f_mg_e + 2] = 8; //清除最后两位
delay_1ms(20);
write_sfm2(2,11,i);
if(i != 0)
i --;
}
else
i++;
if(i > f_mg_s)
{
for(j=0;j<10;j++)
write_sfm1(2,j,migong_s[j]);
break;
}
}
f_mg_e = 0;
}
void migong_e_dispose()
{
if(migong_s[f_mg_e] == S)
{
go();
}
else if(migong_s[f_mg_e] == U)
{
right_s_90_while(); //180();
}
else if(migong_s[f_mg_e] == L)
{
left_s_90_while(); //90();
}
else if(migong_s[f_mg_e] == R)
{
right_s_90_while(); //90();
}
f_mg_e++;
}
/******************还原寻迹用的变量*****************/
void xunji_clear()
{
x_ll = 1;
x_l = 1;
x_z = 1;
x_r = 1;
x_rr = 1;
x_ll_value = 0;
x_l_value = 0;
x_z_value = 0;
x_r_value = 0;
x_rr_value = 0;
}
/******************过插路口时 用做计是那种路口的*****************/
void xun_shizi(uchar dat)
{
uchar i;
for(i=0;i<dat;i++)
{
if(xun_ll == 0)
{
x_ll_value++;
if(x_ll_value > xun_sure)
{
x_ll = 0;
}
}
else
{
x_ll_value = 0;
}
if(xun_l == 0)
{
x_l_value++;
if(x_l_value > xun_sure)
{
x_l = 0;
}
}
else
x_l_value = 0;
if(xun_z == 0)
{
x_z_value++;
if(x_z_value > xun_sure)
{
x_z = 0;
}
}
else
x_z_value = 0;
if(xun_r == 0)
{
x_r_value++;
if(x_r_value > xun_sure)
{
x_r = 0;
}
}
else
x_r_value = 0;
if(xun_rr == 0)
{
x_rr_value++;
if(x_rr_value > xun_sure)
{
x_rr = 0;
}
}
else
x_rr_value = 0;
}
}
/******************延时 用做能缠上5个寻迹传感器都能过了黑线得到正确的状态值*****************/
void time0_yanshi()
{
if((x_rr == 0) || (x_ll == 0))
{
TR0 = 1;
}
if((x_rr == 1) && (x_ll == 1))
{
time_value = 0;
flag_100ms = 0;
TR0 = 0;
}
}
// 白线为 1 黑线为 0
void xunji_zhixian()
{
xun_shizi(1);
if((xun_ll==1) && (xun_l==1) && (xun_z==0) && (xun_r==1) && (xun_rr==1))
{
go(); //小车前进
che_zt = c_11011;
}
if(((xun_ll==1) && (xun_l==1) && (xun_z==0) && (xun_r==0) && (xun_rr==1)) ||
((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==0) && (xun_rr==1)) ||
((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==0) && (xun_rr==0)) ||
((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==0)))
{
right();
che_zt = c_11001;
}
if(((xun_ll==1) && (xun_l==0) && (xun_z==0) && (xun_r==1) && (xun_rr==1)) ||
((xun_ll==1) && (xun_l==0) && (xun_z==1) && (xun_r==1) && (xun_rr==1)) ||
((xun_ll==0) && (xun_l==0) && (xun_z==1) && (xun_r==1) && (xun_rr==1)) ||
((xun_ll==0) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1)))
{
left();
che_zt = c_10011;
}
}
void xunji_bai()
{
if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1))
{
if(che_zt == c_11001)
go();
else if(che_zt == c_10011)
go();
else
go();
// beep = 0;
i_bai++;
if(i_bai > 1300)
{
delay_1ms(1);
// beep = 1;
if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1))
{
// if(che_zt == c_11011)
// {
// back();
// delay_1ms(1);
// }
if(che_zt == c_11001)
left();
else if(che_zt == c_10011)
right();
else
back();
delay_1ms(1);
migong_dispose(U);
right_s_90_while(); //180 aaa
}
}
}
else
i_bai = 0;
}
// 白线为 1 黑线为 0
void xunji()
{
/*********--------------左手法则-------------------*********/
if((x_ll==0) && (x_l==0) && (x_z==0) && (x_r==0) && (x_rr==0))
{
beep = 0;
go();
delay_1ms(qian_duo);
stop();
delay_1ms(flag_stop);
beep = 1;
if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0))
{
stop(); // 到终点停下
migong_path(); // 得到最最短路径
flag_end = 0;
}else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1))
{
migong_dispose(L); //丁字路口
left_s_90_while();
}
else if((xun_ll==1) && (xun_rr==1))
{ // --|-- 十字路口
// beep = 0;
migong_dispose(L);
left_s_90_while();
// beep = 1;
}
xunji_clear();
}
if((x_ll==0) && (x_l==0) && (x_z==0) && (x_rr==1))
{
i_l ++;
if(i_l >= left_xun)
{
i_r = 0; i_l = 0;
// beep = 0;
go();
// xun_shizi(200); xun_shizi(200);
delay_1ms(qian_duo);
beep = 1;
stop();
delay_1ms(flag_stop);
if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0)) //左转90
{
// beep = 0;
migong_dispose(L);
left_s_90_while();
beep = 1;
}
else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1)) //左转90
{
// beep = 0;
left_s_90_while(); //正常左转
beep = 1;
}
else if((xun_ll==1) && (xun_rr==1)) //左转90
{ // __|
migong_dispose(L);
left_s_90_while(); // --|
}
xunji_clear();
}
}
// else
// i_l = 0;
if((x_ll==1) && (x_z==0) && (x_r==0) && (x_rr==0))
// if((xun_ll==1) && (xun_r==0) && (xun_rr==0))
{
i_r ++;
if(i_r >= right_xun)
{
i_r = 0; i_l = 0;
// beep = 0;
go();
// xun_shizi(200); xun_shizi(200);
delay_1ms(qian_duo);
beep = 1;
stop();
delay_1ms(flag_stop);
if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0)) //左转90
{
// beep = 0;
migong_dispose(L);
left_s_90_while();
beep = 1;
}
else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1)) //
{
// beep = 0; // |__
right_s_90_while(); //90 正常右转
beep = 1;
}
else if((xun_ll==1) && (xun_rr==1))
{ //右|--路口 前进
migong_dispose(S); //
go();
}
xunji_clear();
}
}
// else
// i_r = 0;
/*********************************走直线的左右转*****************************************/
}
void migong()
{
/*********--------------左手法则-------------------*********/
if((x_ll==0) && (x_l==0) && (x_z==0) && (x_r==0) && (x_rr==0))
{
// beep = 0; //---
go();
delay_1ms(qian_duo);
stop();
delay_1ms(flag_stop);
beep = 1;
if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0))
{
stop(); //180
flag_mg = 0;
}else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1))
{
migong_e_dispose(); //丁字路口
}
else if((xun_ll==1) && (xun_rr==1))
{ // --|-- 十字路口
migong_e_dispose();
}
xunji_clear();
}
if((x_ll==0) && (x_l==0) && (x_z==0) && (x_rr==1))
{
go();
delay_1ms(qian_duo);
stop();
delay_1ms(flag_stop);
if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0)) //左转90
{
migong_e_dispose();
}
else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1)) //左转90
{
left_s_90_while(); //正常左转
}
else if((xun_ll==1) && (xun_rr==1)) //左转90
{ // __|
migong_e_dispose();
}
xunji_clear();
}
if((x_ll==1) && (x_z==0) && (x_r==0) && (x_rr==0))
{
i_r ++;
if(i_r > right_xun)
{
go();
// beep = 0;
delay_1ms(qian_duo); //右转 90时 这个延时好一些
// beep = 1;
stop();
delay_1ms(flag_stop);
if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0)) //左转90
{
migong_e_dispose();
}
else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1)) //
{ // |__
right_s_90_while(); //90 aaa 正常右转
}else if((xun_ll==1) && (xun_rr==1))
{ //右|--路口
migong_e_dispose();
}
xunji_clear();
}
}
if((x_ll==1) && (x_l==1) && (x_z==1) && (x_r==1) && (x_rr==1))
{
if(che_zt == c_11001)
right();
else if(che_zt == c_10011)
left();
else
go();
// beep = 0;
i_bai++;
if(i_bai > 1300)
{
// delay_1ms(3);
//// beep = 1;
// if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1))
// {
// migong_dispose(U);
// right_s_90_while(); //180 aaa
// }
}
}
else
i_bai = 0;
/*********************************走直线的左右转*****************************************/
// xunji_zhixian();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -