#includehidef.h#includemc9s12dg128.h#defineHIGHSPEED8000#defineLOWSPEED11000/*速度变量,0-24000数值越大,速度越慢*/voidPWMout(int,int);/*24000-20000*/voidIOtest(void){staticunsignedchari=0,j=0x01,k;DDRB=DDRA=0xFF;PORTB=0xf0;for(;;){k=(~j)&0x7f;PORTA=PORTB=k;while(TCNT!=0x0000);while(TCNT==0x0000){if(i9){j=j1;i=0;}i++;}if(j=0x80)j=0x01;}}voidPWMtest(void){intcounter=-4500;DDRB=0xff;PORTB=0xff;TSCR1=0x80;/*enabletimerTCNT*/TSCR2=0x00;/*TCNTprescalersetup*/for(;;){while(TCNT!=0x0000);while(TCNT==0x0000);counter=counter+30;if(counter=3000){counter=0;PWMout(4500,LOWSPEED);}if(counter==1500){PWMout(-4500,LOWSPEED);}PORTB=(char)(counter/100);}}voidSignalTest(void){unsignedcharsignal;intDirection,Velocity;Direction=0;Velocity=LOWSPEED;DDRA=0x00;DDRB=0xff;signal=PORTA;PORTB=~signal;switch(signal){case0x08:/*00011000*/case0x10:Direction=800;Velocity=HIGHSPEED;break;case0x04:/*00100100*/case0x20:Direction=1500;Velocity=HIGHSPEED;break;case0x02:/*01000010*/case0x40:Direction=2800;Velocity=HIGHSPEED;break;case0x01:/*10000001*/case0x80:Direction=4000;Velocity=LOWSPEED;break;case0x3c:/*00111100overstartline*/case0xff:/*11111111overcrossingline*/case0x00:/*00000000gostraightnotneedchangedstate*/default:break;}if(signal0x0f)Direction=-Direction;PWMout(Direction,LOWSPEED);}/*************************************************************************************LCD1620.c*ICC-AVRapplicationbuilder:2006-1-821:43:48*Target:M8*Crystal:4.0000Mhz**Note:Don'tchangethisfileifpossible.**********************************************************************************/#defineCMD_CLEAR0x01#defineCMD_RESET0x02#includeiom8v.h#includemacros.h#defineLCD_DATA0xff#defineLCD_EN0x01//PORTC0#defineLCD_RS0x02//PORTC1#defineLCD_RW0x04//PORTC2#defineLCD_DATAPORTPORTB#defineLCD_ENPORTPORTA#defineLCD_RSPORTPORTA#defineLCD_RWPORTPORTAvoidlcd_init(void);voidlcd_write_cmd(unsignedcmd,unsigneddata);voidlcd_setxy(unsignedcharx,unsignedchary);voidlcd_write_string(unsignedcharX,unsignedcharY,unsignedchar*str);voiddelay_nus(unsignedintn);voiddelay_nms(unsignedintn);voidlcd_init(void){DDRB|=LCD_DATA;DDRA|=LCD_EN|LCD_RS|LCD_RW;LCD_RWPORT&=~LCD_RW;LCD_DATAPORT=0x30;//控制字规则:5:8bit,4:16x2,3:5x7LCD_ENPORT|=LCD_EN;delay_nus(1);LCD_ENPORT&=~LCD_EN;delay_nus(40);lcd_write_cmd(0,0x38);//8bittestlcd_write_cmd(0,0x0c);//显示开lcd_write_cmd(0,0x01);//显示清屏lcd_write_cmd(0,0x06);//显示光标移动设置}voidlcd_write_cmd(unsignedcmd,unsigneddata){if(cmd==0)LCD_RSPORT&=~LCD_RS;elseLCD_RSPORT|=LCD_RS;LCD_DATAPORT&=0x00;LCD_DATAPORT=data;LCD_ENPORT|=LCD_EN;delay_nus(10);LCD_ENPORT&=~LCD_EN;delay_nus(10);}voidlcd_setxy(unsignedcharx,unsignedchary){unsignedcharaddr;if(y==0)addr=x+0x80;elseaddr=x+0xc0;lcd_write_cmd(0,addr);}voidlcd_write_string(unsignedcharX,unsignedcharY,unsignedchar*str){lcd_setxy(X,Y);while(*str){lcd_write_cmd(1,*str);str++;}}voiddelay_1us(void)//1us延时函数{asm(nop);}voiddelay_nus(unsignedintn)//Nus延时函数{unsignedinti=0;for(i=0;in;i++)delay_1us();}voiddelay_1ms(void)//1ms延时函数{unsignedinti;for(i=0;i1140;i++);}voiddelay_nms(unsignedintn)//Nms延时函数{unsignedinti=0;for(i=0;in;i++)delay_1ms();}//callthisroutinetoinitializeallperipheralsvoidmain(void){lcd_init();while(1){lcd_write_cmd(0,0x01);//清屏delay_nms(2);lcd_write_string(0,0,happynewyear);delay_nms(100);lcd_write_string(0,1,LCDsuccessful!);delay_nms(100);}}/*******************************程序结束*********************************/关于飞思卡尔智能车模起跑线识别方法的设计与实现2007-12-0200:33设计思想及算法实现车模与赛道的参数如图1所示。车模运行的主要形式主要是车模的规定的赛道内行进,赛道中央有一条25mm宽的黑色引导线。常用的车模巡线方案有光电传感器阵列和CCD探测法等,这里介绍光电传感器阵列的设计方案。光电传感器是靠红外发射管和红外接收管组成的传感器,如图2所示。红外发射管发射的红外线具有一定的方向性,当红外线照射到白色表面上时会有较大的反射,如果距离Dl取值合适,红外接收管可接收到反射回的红外线,再利用红外接收管的电气特性,在电路中处理红外线的接收信息;如果反射表面为黑色,红外光会被表面将其大部分吸收,红外接收管就难以收到红外线。这样,就可以利用红外收发管组成的光电传感器检测赛道黑线,实现智能车的巡线方案。光电传感器阵列布局参数的确定如图3所示,光电传感器阵列参数主要有管距D(管内侧距离),管直径d,影响光电传感器阵列参数的主要因素有:起跑标志线和十字交叉线;比赛规则对车模尺寸的限制;跑道黑色引导线的宽度;舵机转弯精度。根据以上影响因素,建立模型如图3和图4所示。起跑标志线和十字交叉线的识别方案要和光电传感器阵列参数联系起来考虑,所以首先根据起跑标志线的基本识别方法来确定光电传感器阵列参数。单片机在处理起跑标志线和十字交叉线的区别时,较方便的方法就是当光电传感器阵列经过十字交叉线时7个传感器全检测到黑线,而经过起跑标志线时会有个别传感器检测到白色赛道表面。根据这个道理,建立模型如图3和图4所示,分两种情况讨论:1)光电传感器阵列有2个传感器检测到白色跑道而其它传感器检测到黑线时,如图3所示;2)光电传感器阵列有1个传感器检测到白色跑道而其它传感器检测到黑线时,如图4所示。根据以上两种情形,在光电传感器阵列采用等距分布的情况下,可有如(1)式所示的数学描述。(1)(2)(3)根据(3)式,做如图5所示的数轴标注方法来表示不等式的取值范围。图5中计算所得的D值范围为(25,30-1.5d)。但是也要考虑特殊情况。由于车身在经过起跑标志线时并不是每次都能保持和跑道引导线平行,所以要考虑当车身偏斜进入起跑线时的情况会不会使(1)式有所变化。如图5所示。考虑偏斜的角度如图6所示,车身偏斜时在起跑线白色间隙的长度f=19mm,这样(1)式的数学描述中发生变化的仅仅是图4所示中的跑道间隙值17.5mm,该值被f代替。带入新值后用数轴标注法标注D值的区间如图7所示。比较图6发现,A点向B点靠近形成A′点,并没有超过B点;C点和D点分别移动到C′点和D′点位置,所以D的取值范围有扩大的趋势,这样,图5标注的D值范围符合要求。如果偏斜角度继续增大,前排光电传感器阵列不能同时进入起始标志线,这样在单片机编程算法中很容易处理这种情况。综合以上讨论,可知:光电传感器的管距(管内侧距离)D取值范围为(25,30-1.5d);根据误差理论,单纯从传感器的外径尺寸上考虑,其值d越小越好;本设计中取光电管直径d值为3mm,D值范围(25mm,25.5mm)。实测效果根据以上分析的光电传感器的管距D取值范围制作车模的寻线传感器阵列,对车模进行了大于50次的测试,实测结果表明:车模均能正确识别到起跑线。但是,设计还存在一些问题,主要有:*对D的取值要求苛刻;*要求红外传感器的正常工作率为90%以上。结语本文分析了智能车模比赛中的相关技术参数,建立了光电传感器阵列的数学模型,确定了阵列参数。这为车模系统的路况记忆算法提供了基本参考点。本文还分析了起跑线识别方法的实测效果,实测结果表明:车模均能正确识别到起跑线。(因版面有限,本文已作部分删节)第二届“飞思卡尔”杯全国大学生智能车大赛侧记2007年08月27日星期一14:22转眼间,智能车大赛已经进入了第二个年头。今年的全国总决赛在上海交通大学举行,华工的九头鸟队再次杀入决赛,自然我作为曾经的队员和交大的地头蛇,接待工作自然