#define ROW 36
#define COLUMN 70
#define SAMP_ROW_START 11
#define THRESHOLD 0x20
#define ROW_START 1
#define BLACK 0
#define WHITE 1
#define BLACK_LINE_MAX0 15
#define BLACK_LINE_MIN0 4
#define BLACK_LINE_MAX1 12
#define BLACK_LINE_MIN1 2
#define CENTER 35
unsigned char Buffer[ROW][COLUMN];
unsigned char Buffer1[ROW][COLUMN];
unsigned char SampleFlag=0 ;
unsigned char jiange;
unsigned int m=0;
unsigned int n=0;
unsigned int line=0;
unsigned char Flag=0;
unsigned int Line_Center[ROW]={20};
//--------------初始化函数----------------//
/*时钟初始化程序*/
{锁相环时钟=2*16*(2+1)/(1+1)=48MHz
锁相环锁定
选定外部时钟
}
//--------------行场中断初始化-------------//
void IC_Init(void)
{
TIOS=0x00;
TCTL4=0x09;
TSCR1=0x80;
TIE=0x03;
TFLG1=0xFF;
}
void IO_Init(void)
{
}
//----------初始化SCI0---------------------//
void SCI_Init()
{
SCI0BD=312;
SCI0CR1=0;
SCI0CR2=0X2C;
}
//---------------写SCI数据-------------------//
void SCI_Write(unsigned char sendchar)
{
}
//黑线的中值滤波
int get_mid(unsigned int a,unsigned int b,unsigned int c)
unsigned int x=0;
if(a>b){x=b;b=a;a=x;}
if(b>c){x=c;c=b;b=x;}
if(a>b){x=b;b=a;a=x;}
return b ;
}
//求绝对值
int abs_1(int x)
{
if(x<0)x=-x;
return(x);
}
void black_extract(void)
{
黑线丢失计数器
unsigned char stop=0; //停车圈数计数器
int temp=0;
unsigned char left_flag1=0,right_flag1=0,left_flag2=0,right_flag2=0;
////////////////////////////////////////////////////
/////图像前部分用边缘检测法
///////////////////////////////////////////////////
左右跳变清零,这是必须的!!
right=0;
两边搜索 最边界干扰略去
{left=j;left_flag1++;}
求黑线的中心
过滤过宽过细的黑线
Line_Center[i]=(right+left+1)/2;
黑线丢失清零
else /////////////////过宽过细黑线进行插值
}
}
/////图像后部分用边缘检测法
///////////////////////////////////////////////////
左右跳变清零,这是必须的!!
right=0;
两边搜索 最边界干扰略去
{left=j;left_line=left;}
}
求黑线的中心
过滤过宽过细的黑线
Line_Center[i]=(right+left+1)/2;
黑线丢失清零
else /////////////////过宽过细黑线进行插值
}
}
for(i=2;i 黑线是连续的 值还需要确认 即相差多少就认为是错误 } //黑线的中值滤波程序! for(i=1;i void Image_binaryzation(unsigned int row) //二值化程序 { unsigned char *p_Image; unsigned char *q_Image; { void chuli(void) { unsigned char i,j; int temp=0; for(i=0;i SCI_Write(' ') ; } Flag=1; void main(void) { /* put your own code here */ PLL_Init(); IC_Init(); IO_Init(); SCI_Init(); for(;;) { black_extract(); chuli(); // _FEED_COP(); /* feeds the dog */ } /* loop forever */ /* please make sure that you never leave main */ } #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 8 Port0_Interrupt() { TFLG1_C0F=1; 行计数器加 1 if ( SampleFlag == 0 || line { 判断是否从新的一场开始 } if(line<=132)jiange=12; else if(line>132&&line<=200) jiange=8; else if(line>200&&line<=248) jiange=6; if(line%jiange==0) { Buffer[m][0]=PORTA; Buffer[m][n+0]=PORTA; Buffer[m][1]=PORTA; Buffer[m][n+1]=PORTA; Buffer[m][2]=PORTA; Buffer[m][n+2]=PORTA; Buffer[m][68]=PORTA; Buffer[m][n+68]=PORTA; Buffer[m][69]=PORTA; Buffer[m][n+69]=PORTA; m++; } Image_binaryzation(m); } #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 9 Port1_interrupt() { TFLG1_C1F=1; //清场中断 TFLG1_C0F=1; //清行中断 列清零 行计数器 SampleFlag=1;//场标志位置 1 Flag=0; }下载本文