飞思卡尔摄像头组西部赛区一等奖程序.docx
《飞思卡尔摄像头组西部赛区一等奖程序.docx》由会员分享,可在线阅读,更多相关《飞思卡尔摄像头组西部赛区一等奖程序.docx(61页珍藏版)》请在冰点文库上搜索。
飞思卡尔摄像头组西部赛区一等奖程序
#include/*commondefinesandmacros*/
#include/*derivativeinformation*/
#include
#include"sys_init.h"
#include"uart.h"
#include"SCCB.h"
#pragmaLINK_INFODERIVATIVE"mc9s12xs128"
/******************************************************************************
Êý¾ÝÀàÐͶ¨Òå¼°È«¾Ö±äÁ¿³õʼ»¯
******************************************************************************/
#defineINT8Uunsignedchar
#defineINT8Ssignedchar
#defineINT16Uunsignedshort
#defineINT16Ssignedshort
#defineINT32Uunsignedlong
#defineINT32Ssignedlong
voidrow_deal(void);
voidpoopctl(void);
voidPDCalc(void);
voidput01(void);
voidputdark(void);
voidgetadd(void);
voidspeedcontrol(void);
voiddelayms(intms);
voidgetrowend(void);
voidgetzhidao(void);
INT16UCountThreshold(void);
#definecolumn_max100
#definerow_max50
//#definemiddle23300
//#definemaxleft2300
//#definemaxright4000
/*#defineadd30
#definewan270
#definezhi450//245*/
//#defineruwan20
//#definePUT_01//put01
//ͼÏñ´¦Àí±äÁ¿
#defineBUFF_ADDR0x2500
INT8Uleftadd=25,rightadd=25;
INT16Sfazhi=0,max1=0,min1=0,middle=0,maxdifference,maxnum,maxnum2,maxdifference2,mindifference3,minnum,mindifference,heixian,minnum2;
INT8Ucmos[row_max][column_max]@BUFF_ADDR;
INT16Sboundary_left,boundary_right,value_left,value_right,left_spare,right_spare;
INT16Srow_i=0,row_counter=0,flag=1,speed_flag=0;
INT16Si,j,k=0,a;
INT16Sfield_sum=0,break_sum=0,row_middle[row_max];
//¶æ»ú¿ØÖƱäÁ¿
INT16Slastpart1_sum=0,part1_sum=0,lastpart2_sum=0,part2_sum=0,sum_m=0,field_lost=0;
INT16Ssum_m4=0,lastline1,lastline2,preline,nextline1,nextline2;//ÐÐÓëÐÐÖ®¼äµÄ²îÖµ
INT16Upoop=7500,poop_back=7500;
INT16Sxiaos,xiaos1,xiaos2,xiaos3,xiaos4,xiaos5,xiaos6,das;
INT16SLastsum1,Prevsum1,dsum1,Lastsum2,Prevsum2,dsum2,Lastsum3,Prevsum3,dsum3,Proportion1=3,Derivative1=4,Proportion2=2,Derivative2=2,Proportion3=5,Derivative3=40;
INT32Umiddle2,maxleft,maxright;
//µç»ú¿ØÖƱäÁ¿
INT16Sii=0,gg=0,stopnum=0,num=0,hh=0,bb=0,dd=850;
INT16Swan,zhi,man,a1,a2,speed,lastspeed;
//µÃµ½Ò»·ùͼÏñµÄ×îºóµÄÒ»¸öÓÐЧÐÐ
INT16Sfazhi1=0,maxdifference1,maxnum1,maxnum21,maxdifference21,mindifference31,minnum1,mindifference1,heixian1,minnum21;
INT16Sboundary_left1,boundary_right1,value_left1,value_right1,left_spare1,right_spare1;
INT16Si1,j1,k1=0,sum_m1,lost_flag1,field_lost1,rowend,rowend1,rowend2,rowend3,rowend4;
INT16Sbreak_sum1=0,row_middle1[row_max];
INT16Smax,min,maxnum11,maxnum3,minnum11,slope,x,minnum3,ruwan;
unsignedcharTempData[column_max];
constunsignedcharsegcode[]={//¹²Òõ¼«PBisoutputsegacodeportPM0--DS1PM1--DS2
0x3F,//0
0x06,//1
0x5B,//2
0x4F,//3
0x66,//4
0x6D,//5
0x7D,//6
0x07,//7
0x7F,//8
0x6F,//9
0x77,//A
0x7C,//B
0x39,//C
0x5E,//D
0x79,//E
0x71,//F
0x80//dot
};
chartxtbuf[50]="";
/*******************¿ª¹ØµÄÑ¡Ôñ*****************/
#pragmaCODE_SEGNON_BANKED,
voidinterrupt24PJI(void)
{
INT16Swan1,zhi1,zhi2;
PIFJ=0Xff;
PIEJ=0X00;
a++;
if(a>10)
a=0;
switch(a)
{
case0:
wan1=260,zhi1=390,zhi2=400,dd=850,bb=17,a1=35,a2=30,middle2=3975,maxleft=middle2-750,maxright=middle2+750,PORTB=PORTB=segcode[0];break;
case1:
wan1=280,zhi1=300,zhi2=350,dd=850,bb=17,a1=30,a2=28,middle2=3975,maxleft=middle2-690,maxright=middle2+720,PORTB=PORTB=segcode[1];break;
case2:
wan1=300,zhi1=310,zhi2=390,dd=850,bb=25,a1=30,a2=28,middle2=3975,maxleft=middle2-700,maxright=middle2+750,PORTB=PORTB=segcode[2];break;
case3:
wan1=320,zhi1=330,zhi2=400,dd=850,bb=25,a1=30,a2=28,middle2=3975,maxleft=middle2-700,maxright=middle2+750,PORTB=PORTB=segcode[3];break;
case4:
wan1=330,zhi1=350,zhi2=420,dd=850,bb=25,a1=30,a2=28,middle2=3975,maxleft=middle2-700,maxright=middle2+750,PORTB=PORTB=segcode[4];break;
case5:
wan1=340,zhi1=360,zhi2=420,dd=850,bb=25,a1=30,a2=28,middle2=3975,maxleft=middle2-700,maxright=middle2+750,PORTB=PORTB=segcode[5];break;
case6:
wan1=350,zhi1=370,zhi2=440,dd=850,bb=25,a1=30,a2=28,middle2=3975,maxleft=middle2-700,maxright=middle2+750,PORTB=PORTB=segcode[6];break;
case7:
wan1=280,zhi1=300,zhi2=350,dd=1800,bb=25,a1=30,a2=28,middle2=3975,maxleft=middle2-700,maxright=middle2+750,PORTB=PORTB=segcode[7];break;
case8:
wan1=300,zhi1=330,zhi2=410,dd=1800,bb=25,a1=30,a2=28,middle2=3975,maxleft=middle2-700,maxright=middle2+750,PORTB=PORTB=segcode[8];break;
case9:
wan1=310,zhi1=340,zhi2=420,dd=1800,bb=25,a1=30,a2=28,middle2=3975,maxleft=middle2-700,maxright=middle2+750,PORTB=PORTB=segcode[9];break;
case10:
wan1=350,zhi1=370,zhi2=440,dd=1800,bb=25,a1=30,a2=28,middle2=3975,maxleft=middle2-700,maxright=middle2+750,PORTB=PORTB=segcode[10];break;
}
PIEJ=0Xff;
delayms(30000);
delayms(30000);
//delayms(30000);
//delayms(30000);
wan=wan1;
zhi=zhi1;
man=zhi2;
}
/*******************¿ª¹ØµÄÑ¡Ôñ*****************/
/************************************³¬Æµ*****************************/
voiddelayms(intms)//40MHz--1ms
{
intii,jj;
if(ms<1)ms=1;
for(ii=0;iifor(jj=0;jj<0xff;jj++);
}
/************************Ö÷º¯Êý**************************/
unsignedchartemp_reg;
voidmain(void)
{
DisableInterrupts;
//=======ÉèÖüĴæÆ÷Çø========================================
SetBusCLK_16M();
PUCR_PUPEE=1;//PE¿ÚÉÏÀ
SCL_DR=OUT;//³õʼsccbÊä³ö
SDA_DR=OUT;
I2cByteWrite(ov7620_addr,0X2D,0xC1);//193QVGA60FRAME/S
I2cByteWrite(ov7620_addr,0X14,0x24);//
//==============================================
SetBusCLK_40M();//80MHz
vIOPortInit();
//for(i=0;i<40;i++)
SCI_Init();
vinterruptsinit();
PWM_Init();
flag=1;
row_i=0;
row_counter=0;
value_left=fazhi;
value_right=fazhi;
putstr("videotest\r\n");
//key_set();
//PORTB=0X00;
delayms(10);
EnableInterrupts;
for(;;)
{
}/*waitforever*/
/*pleasemakesurethatyouneverleavethisfunction*/
}
//declarefunctionandvariables
//externvoidgetline(void);
//externvoidtempdata_to_arry(void);
externunsignedcharbuff[1][column_max];
externvoidcaptureline(void);
/************************ͼÏñ»ñµÃ************************/
#pragmaCODE_SEG__NEAR_SEGNON_BANKED
voidinterrupt8Port0_interrupt(void)
{
TFLG1_C0F=1;//Çå³ýÐÐÖжϱêÖ¾
if(row_counter>40&&row_counter<=140&&row_counter%5==0)//20
{
captureline();
row_i++;
}
elseif(row_counter>140&&row_counter<=200&&row_counter%4==0)//15
{
captureline();
row_i++;
}
elseif(row_counter>200&&row_counter<=230&&row_counter%2==0)//15
{
captureline();
row_i++;
}
/*elseif(row_counter>177&&row_counter<=230&&row_counter%5==0)//10
{
captureline();
row_i++;
}*/
elseif(row_counter>230)//×î¶à242ÐÐelseif(row_counter>=241)
{
TCTL4=0X08;
//putdark();//////////////////////////////
#ifdefPUT_01
put01();////////////////////////////
#endif
row_deal();
poopctl();
//getadd();
getrowend();
getzhidao();
speedcontrol();
//speed_setblur();
//PIDCalc();
}
row_counter++;
}
#pragmaCODE_SEGDEFAULT
/***************************³¡Öжϴ¦Àí******************************************/
#pragmaCODE_SEG__NEAR_SEGNON_BANKED//³¡ÖжÏ
voidinterrupt9Port1_interrupt(void)
{
introw_sum=0;
TFLG1_C1F=1;
if(flag==1)
{
TCTL4=0X09;
flag=0;
}
else
{
for(i=48;i>row_i;i--)
row_sum+=row_middle[i];
if(row_sum<10)
PWMDTY01=poop_back;
poop_back=poop;
field_sum++;
//break_sum=0;
row_i=0;
row_counter=0;
TCTL4=0X09;//¿ªÆôÐÐÖжÏ
}
}
#pragmaCODE_SEGDEFAULT
voidrow_deal(void)
{
intjj;
charlost_flag=0,tri_flag=0;
break_sum=0;
sum_m4=0;
sum_m=0;
part1_sum=0;
part2_sum=0;
fazhi=CountThreshold();
value_left=fazhi+4;
value_right=fazhi;
for(j=0;j<20;j++)//»ù×¼Ïß²éÕÒ
{
for(k=1;k<98;k++)
{
if(cmos[j][k]<20||cmos[j][k]>250)
cmos[j][k]=(cmos[j][k-1]+cmos[j][k+1])>>1;
}
maxdifference=cmos[j][2]-cmos[j][0];
mindifference3=cmos[j][2]-cmos[j][0];
for(k=1;k<98;k++)
{
maxdifference2=cmos[j][k+2]-cmos[j][k];
maxdifference=(maxdifference>maxdifference2)?
maxdifference:
maxdifference2;
maxnum=(maxdifference>maxdifference2)?
maxnum2:
k;
maxnum2=maxnum;
mindifference3=(mindifference3mindifference3:
maxdifference2;
minnum=(mindifference3minnum2:
k;
minnum2=minnum;
}
if(cmos[j][minnum-1]>fazhi&&cmos[j][minnum-2]>fazhi&&cmos[j][minnum-3]>fazhi&&cmos[j][maxnum+1]>fazhi&&cmos[j][maxnum+2]>fazhi&&cmos[j][maxnum+3]>fazhi)
heixian=1;
else
heixian=0;
if((maxnum-minnum>1)&&(maxnum-minnum)<9)
{
boundary_left=minnum2;
boundary_right=maxnum2;
row_middle[j]=(boundary_right+boundary_left)>>1;
break;
}
else
{//·ÀÖ¹Óкڵã»òÕßÊÇÖÜΧ»·¾³µÄÎÛȾ
row_middle[j]=50;
lost_flag++;
}
if(lost_flag==7)//ÅжÏÊÇ·ñÊdzµÕýÆ«³öÈüµÀ
{
field_lost=1;
//PORTB=segcode[4];
return;
}
sum_m+=(row_middle[j]-50);//¼ÆË㳵ƫ³öÖÐÐÄÏßµÄ×ܵÄÊýÁ¿
}
//==================================================================================================
for(i=j+1;i<50;i++)
{
left_spare=boundary_left;
right_spare=boundary_right;
if(cmos[i][boundary_left]{
k=8;
while(k--&&boundary_left-2>=0)
{
if(cmos[i][boundary_left-1]>=value_left&&cmos[i][boundary_left-2]>=value_left)
break;
boundary_left--;
}
if(k==0)
boundary_left=left_spare;
elseif(boundary_left-2<0)
boundary_left=0;
else
value_left=(cmos[i][boundary_left-2]+cmos[i][boundary_left-1]+cmos[i][boundary_left]+cmos[i][boundary_left+1])>>2;
}//==============================
elseif(cmos[i][boundary_left]>value_left)
{
k=6;
while(k--&&boundary_left+2{
if(cmos[i][boundary_left+1]<=value_left&&cmos[i][boundary_left+2]<=value_left)
break;
bou