STC15编程之矩阵寻迹(第五天)

言之者无罪,闻之者足以戒。 - “诗序”

其实前两天我就以为自己的矩阵已经调好了,我得出这个结论并不是编造的,而是它已经能够完成寻迹了,只是有些不完美,就是总会有些摇头晃脑,我自己本身也是想调的更好一些,所以我就仔细的检查了自己的代码,认真的过一遍逻辑,又用Debug调试了一遍,发现还是有些错误的。

我们先看一下之前的数据处理的程序:

/*数据处理函数*/
void Data_Handling()
{
		u8 i,j;
		u8 sum_l[5] = {0},sum_r[5] = {0}; 
		float sum[5] = {0};
		if(Data_Flag == 1)
		{
			Data_Flag = 0;
			for(j = 0;j < 5;j++)
			{
					Bit_Buf[0] = (Row_Col[j]) & (0X01);
					Bit_Buf[1] = (Row_Col[j]) & (0X02);
					Bit_Buf[2] = (Row_Col[j]) & (0X04);
					Bit_Buf[3] = (Row_Col[j]) & (0X08);
					Bit_Buf[4] = (Row_Col[j]) & (0X10);
					Bit_Buf[5] = (Row_Col[j]) & (0X20);
					Bit_Buf[6] = (Row_Col[j]) & (0X40);
					if(Bit_Buf[0] != 0)
					{
						sum_l[j] = 0;
					}
					else
					{
						for(i = 0;i < 7;i++)
						{
							if(Bit_Buf[i] < Bit_Buf[i+1])
							{
									sum_l[j] = i+1;
									break;
							}
						}
					}
					if(Bit_Buf[6] != 0)
					{
						sum_l[j] = 6;
					}
					else
					{
						for(i = 0;i < 7;i++)
						{
							if(Bit_Buf[i] > Bit_Buf[i+1])
							{
									sum_r[j] = i;
									break;
							}
						}
					}
					sum[j] = (float)((sum_l[j] + sum_r[j])/2.0 - 3); 
			}
			Sum_All = sum[0] + sum[1] + sum[2] + sum[3] + sum[4]; 
		}
}

这个处理程序的问题在于,如果有一行没有没有扫到黑线,那么我们希望的是左右边线的坐标都是零,但是事实上不是零,所以转弯的时候会总是晃半天才能过去。这就是因为左右边线的值不是零所以计算出来的结果和我们预想的不一样。

针对上面的问题,我做了一些改动,下面看一下我改过之后的数据处理程序:

/*数据处理函数*/
void Data_Handling()
{
		u8 i,j;
		u8 sum_l[5] = {0},sum_r[5] = {0}; 
		float sum[5] = {0};
			for(j = 0;j < 5;j++)
			{
					Bit_Buf[0] = (Row_Col[j]) & (0X01);
					Bit_Buf[1] = (Row_Col[j]) & (0X02);
					Bit_Buf[2] = (Row_Col[j]) & (0X04);
					Bit_Buf[3] = (Row_Col[j]) & (0X08);
					Bit_Buf[4] = (Row_Col[j]) & (0X10);
					Bit_Buf[5] = (Row_Col[j]) & (0X20);
					Bit_Buf[6] = (Row_Col[j]) & (0X40);
					if(Bit_Buf[0] != 0)
					{
						sum_l[j] = 0;
					}
					else
					{
						for(i = 0;i < 6;i++)
						{
							if(Bit_Buf[i] < Bit_Buf[i+1])
							{
									sum_l[j] = i+1;
									break;
							}
							if((i == 5) && (sum_l[j] == 0))
								sum_l[j] = 0;
						}
						
					}
					if(Bit_Buf[6] != 0)
					{
						sum_r[j] = 6;
					}
					else
					{
						for(i = 0;i < 6;i++)
						{
							if(Bit_Buf[i] > Bit_Buf[i+1])
							{
									sum_r[j] = i;
									break;
							}
							if((i == 5) && (sum_r[j] == 0))
								sum_r[j] = 0;
						}
					}
					if(sum_r[j] != 0)
						sum[j] = (float)((sum_l[j] + sum_r[j])/2.0 - 3); 
			}
			Sum_All = sum[0] + sum[1] + sum[2] + sum[3] + sum[4]; 
}

这样处理之后的出来的结果就是正确的了,再拐直角弯道的时候就比以前顺利多了。

猜你喜欢

转载自blog.csdn.net/weixin_42994525/article/details/84951129