3ms程序代码手册.docx
《3ms程序代码手册.docx》由会员分享,可在线阅读,更多相关《3ms程序代码手册.docx(46页珍藏版)》请在冰豆网上搜索。
3ms程序代码手册
#include/*commondefinesandmacros*/
#include/*derivativeinformation*/
#pragmaLINK_INFODERIVATIVE"mc9s12dg128b"
//#include"sci.h"
#definesciflag1;
#defineflag1;
externucharcflag;
externinti,j,m,n;
externbytecs[40][60];
/*-----------------------*/
/*-------初始化----------*/
voidInputInit(){
TIE_C1I=0;//channel0interruptDISable
TIOS_IOS1=0;//channel0inputcapture
TCTL4_EDG1A=1;
TCTL4_EDG1B=0;
}
/*-----------------------*/
/*--中断初始化--------------------*/
voidinit_IRQ(){
INTCR_IRQE=1;//IRQselectedgesensitiveonly
INTCR_IRQEN=1;//externalIRQenable
}
/*------ADT初始化--------------*/
voidADCInit(void)
{
ATD0CTL2_ADPU=1;//ENABLEATDPOWER
ATD0CTL2_AFFC=1;//FASTCLEARFLAGALL
ATD0CTL2_ASCIE=1;
ATD0CTL3_S1C=1;//ConversionSequenceLength
ATD0CTL3_S4C=0;
ATD0CTL3_S2C=0;
ATD0CTL3_S8C=0;
//ATD0CTL3=ATD0CTL3_S1C_MASK;
//每个序列2次转换,NoFIFO,Freeze模式下继续转换
ATD0CTL4_SRES8=1;
ATD0CTL4_PRS=0;
ATD0CTL5_DJM=1;
//8位精度,1个时钟+4A/D时钟周期,ATDClock=[BusClock*0.5]/[PRS+1];PRS=5,divider=12
//AD时钟10MATDclock=[BusClock]/[PRS+1]*0.5
ATD0CTL5_CC=0;
ATD0CTL5_CA=0;
ATD0CTL5_CB=0;
ATD0DIEN=0x00;//禁止数字输入
}
#pragmaCODE_SEGNON_BANKED
#pragmaTRAP_PROC
interruptvoidInputInt(void){
TFLG1_C1F=1;
j=0;
i++;
if(i==315){
TIE_C1I=0;
INTCR_IRQEN=0;
}
#ifflag
ATD0CTL5_SCAN=0;
if(i>=35&&i<315&&(i<169&&(i-35)%5==0)){
ATD0CTL5_SCAN=1;
m=(i-35)/5;
}
if(i>=169&&i<315&&(i-169)%12==0){
ATD0CTL5_SCAN=1;
m=(i-169)/12+27;
}
#else
ATD0CTL5_SCAN=1;
#endif
}
#pragmaCODE_SEGDEFAULT
#pragmaCODE_SEGNON_BANKED
#pragmaTRAP_PROC
voidIRQ_ISR()
{
TIE_C1I=1;;
//DDRB=0XFF;
//PORTB=0XF0;
//while
(1);
i=0;
j=0;
}
#pragmaCODE_SEGDEFAULT
#pragmaCODE_SEGNON_BANKED
#pragmaTRAP_PROC
voidInt_AD0(void)
{wordAD_wData;
AD_wData=ATD0DR0;
#ifflag
cs[m][j++]=(byte)AD_wData;
#else
cs[i][j++]=(byte)AD_wData;
#endif
}
#pragmaCODE_SEGDEFAULT
#include/*commondefinesandmacros*/
#include
#pragmaLINK_INFODERIVATIVE"mc9s12dg128b"
voidSciInit(){
SCI0BD=208;//SCIbaudrate=SCImoduleclock/(16xBR)
SCI0CR1=0x00;//normaloperation,8-bitdata,noparity
SCI0CR2=0x0C;//enabletransmitter,enablereceiver
}
/***********************************
************************************/
voidtransmit_sci(uchartransmit_data)
{
while(SCI0SR1_TC!
=1);
while(SCI0SR1_TDRE!
=1);//waituntiltransmitfinished
SCI0DRL=transmit_data;
}
/***********************************
************************************/
voidSciTransmitString(uchar*t,intn){
uinti;
for(i=0;iwhile(!
SCI0SR1_TDRE);
SCI0DRL=*t;
//while(!
SCI0SR1_TC);
t++;
}
}
#include
#include
#pragmaLINK_INFODERIVATIVE"mc9s12dg128b"
#include
#include
#include"pwm.h"
#definerow40
#defineline40
#defineBLACKMAX130
#defineWHITEMAX255
#defineyuzhi25
#defineyuzhihou18
#defineThresholdkp116
#defineThresholdkp28
#definexganrao1
#definebganrao2
#definewganrao3
#definewellroad5
#definezhidao6
#definewandao7
#definesroad8
#definesroadb9
#definesroads10
//#definewandaor9
#definexroadblacke6
externwordSpeedValue;
externwordspeedzhankongbi;
wordzspeedvalue=0;
wordsspeedvalue=0;
wordwspeedvalue=0;
wordcspeedvalue=0;
bytebc[33];
bytejiaochaxian=0;
byteruwanbiaozhi=0;
bytechazhib=0;
bytedifnum=0;
bytechazhis=40;
bytedifarray[26];
bytestangle(void);
typedefstructpoint{
intx;
inty;
}point;
intangle=0;
intlastangle=0;
intoutangle=0;
byteK;
byteKD;
uchargetlinecenter(uchari);
ucharfgetlinecenter(uchari);
uchargetlinecenter1(uchari);
bytegetstartlinecenter(ucharj);
bytegetblackline(byteoline,byteorow);
bytecopycs[40][42];
ucharbline[40];
bytethreshold=WHITEMAX;
bytethresholdmax=0;
bytethresholdmin=255;
ucharstart=0;
ucharend=0;
byteendp=0;
externbytecs[40][60];
externucharfz[row];
externbytemax[row];
externbytecmax[21];
bytexz=0;
longblackcontrol;
bytenumber=0;
//均值
byteroad;
doublejuzhi=0;
doublefangcha=0;
ulongleicha=0;
voidroadtype();
bytestartkind=0;
byteslrecognise(void);
voidanglecontrol(void);
/*******************************************/
/********赛道判断变量***********/
voidroadparameter(void);
voidsdch(pointp1,pointp2);
voidchange(pointp[6]);
doublesa;
doubleca;
doublesdpuan(void);
doubled,xp,pe;
pointceshi[7];
doublepancha[10];
bytemincenter=0;
bytemincenternum=0;
bytemaxcenterend=0;
bytemaxcenterstart=0;
bytemaxcenterstartnum=0;
bytemaxcenterendnum=0;
bytemincenterend=0;
bytemincenterstart=0;
byteroadkind;
bytelastroadkind=0;
bytesroadcount=0;
bytezhidaocount=0;
bytewandaocount=0;
bytenumcenter=0;
bytebnum=0;
byteroadturnl=0;
/****************************************/
//直线拟合变量
pointx[10];
voidzhixian(void);
voidlinenihe(void);
intfun(intt,intn);
voidquqi(int*a,int*b,int*c,int*d);
intf0[10];
intf1[10];
intf2[10];
doubleh=0;
doublech[4];
doublea=0;
doubleb=0;
doublepc=0;
//inti=0;
//intj=0;
intA,B,C,D;
intF1=0;
intF2=0;
floatpianjiao=0;
floatlpianjiao=0;
doubleq=0;
intsroadcontrol(void);
/********************************************/
ucharCountThreshold(inti)
{
unsignedintmax1=BLACKMAX,max2=BLACKMAX,min1=WHITEMAX,min2=WHITEMAX;
intj;
for(j=3;j<40;j++){
//if((cs[i][j]WHITEMAX))
//continue;
if(cs[i][j]>max1){
max2=max1;
max1=cs[i][j];
}elseif(cs[i][j]>max2){
max2=cs[i][j];
}elseif(cs[i][j]min2=min1;
min1=cs[i][j];
}elseif(cs[i][j]min2=cs[i][j];
}
//死循环标志
//PORTB_BIT0=0;
}
if(i>20)
return((uchar)((max2+min2)/2-(uchar)(Thresholdkp1*(max2-min2)/100)));
else
return((uchar)((max2+min2)/2-(uchar)(Thresholdkp2*(max2-min2)/100)));
//return120;
}
/**************************************************************************/
voidvideo(){
//////////////////////////////////////////////////////////
////
//黑线提取与虑波//
////
////
//////////////////////////////////////////////////////////
uchari=0;
ucharu=0;
byteonum=0;
max[end]=0;
start=0;
end=0;
for(i=0;imax[i]=0;
}
for(i=row-1;i>=19;i=i-5){
fz[i]=CountThreshold(i);
}
thresholdmax=0;
thresholdmin=255;
for(i=row-1;i>=19;i=i-5){
if(thresholdmaxthresholdmax=fz[i];
}
for(i=row-1;i>=19;i=i-5){
if(thresholdmin>fz[i])
thresholdmin=fz[i];
}
threshold=(byte)((fz[39]+fz[34]+fz[29]+fz[24]+fz[19]-thresholdmin-thresholdmax)/3);
/******************************************************************/
/*for(i=row-1;i>=20;i--)
for(j=4;jif(cs[i][j]copycs[i][j]=0;
else
copycs[i][j]=255;*/
/********************************************************************/
for(i=row-1;i>=19;i--){
max[i]=getlinecenter(i);
if(max[i]>=39||max[i]<5)
max[i]=0;
}
for(i=row-1;i>0;i--){
if(max[i]!
=0){
start=i;
break;
}
}
for(i=19;iif(max[i]!
=0){
end=i;
break;
}
/**********************************************/
if(start>=19)
if(getstartlinecenter(start)!
=xganrao)
for(i=start-1;i>=19;i--){
if(getstartlinecenter(i)==xganrao)
max[i]=max[i+1];
//死循环标志
//PORTB_BIT1=0;
}else
for(i=start-6;i<=start;i++){
if(getstartlinecenter(i)==xganrao)
max[i]=max[i-1];
//sixunhuan
//PORTB_BIT2=0;
}
if(end<=start){
if(fabs(max[end]-fgetlinecenter(end))>4){
for(i=end;iif(fabs(max[i]-fgetlinecenter(i))<4){
xz=max[i];
u=i;
break;
}
for(i=end;i
if(fabs(fgetlinecenter(i)-max[i])>3){
if(fabs(fgetlinecenter(i)-xz)max[i]=fgetlinecenter(i);
}
}
//while
(1);
}
elseif(fabs(max[start]-fgetlinecenter(start))>4){
for(i=end+1;i<=start;i++){
if(fabs(fgetlinecenter(i)-max[i-1])max[i]=fgetlinecenter(i);
}
}
elseif(fabs(max[end]-fgetlinecenter(end))<4&&fabs(max[start]-fgetlinecenter(start))<4){
for(i=end+1;iif(fabs(max[i]-max[i+1])>4||fabs(max[i]-max[i-1])>4){
if(fabs(fgetlinecenter(i)-max[end])max[i]=fgetlinecenter(i);
}
}
}
/////////////////////////////////////////////////////////
if(start>=end)
for(i=start-1;i>end+1;i--){
if(fabs(max[i]-max[i+1])>4&&fabs(max[i]-max[i-1])>4)
max[i]=max[i-1];
//SIXUNHUAN
//PORTB_BIT3=0;
}
end=0;
for(i=19;iif(max[i]!
=0){
end=i;
break;
}
/*for(i=end;i>0;i--){
max[i]=getblackline(max[i+1],i);
}*/
if(end!
=0){
onum=0;
for(i=end;i>0;i--){
max[i]=getblackline(max[i+1],i);
if(max[i]!
=0)
onum=0;
if(max[i]==0&&onum<3){
max[i]=max[i+1];
cs[i][max[i]]=cs[i+1][max[i+1]];
onum++;
/*if(onum==2){
PORTB=0XF0;
while
(1);
}*/
}
if(onum==3){
break;
}
}
if(max[1]!
=0){
max[0]=getblackline(max[1],0);
}
}
for(i=0;iif(max[i]!
=0){
end=i;
break;
}
}
///发数据
//transmit_sci(222);
//SciTransmitString(max,40);
//transmit_sci(end);
/*********算前20中心平均值*************************/
for(i=row-1;i>20;i--){
blackcontrol=max[i]+blackcontrol;
if(max[i]!
=0)
number++;
}
blackcontrol=(long)(blackcontrol/number);
//while
(1);
//////////////////////////////////////////////////////////
////
//赛道判断//
////
////
//////////////////////////////////////////////////////////
roadparameter();
/////////清标志
roadkind=0;
/**************s弯判断******************/
mincenter=0;
mincenternum=0;
maxcenterend=0;
maxcenterstart=0;
maxcenterstartnum=0;
maxcenterendnum=0;
mincenterend=0;
m
|
|
|
|