|
0.png (58.03 KB, 下載次數(shù): 146)
下載附件
2016-10-18 16:21 上傳
這個(gè)是一個(gè)2等獎(jiǎng)的作品,毫無(wú)保留飛思卡爾智能車全部源碼下載:
飛思卡爾智能車最終完整程序 具有很高的參考價(jià)值.rar
(14.08 KB, 下載次數(shù): 224)
2016-10-18 16:21 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
主程序:
- #include <hidef.h> /* common defines and
- macros */
- #include <mc9s12dg128.h> /* derivative
- information */
- //#include "PWM.h"
- //#include "AD.h"
- #include "control.h"
- #pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
- word AD_wData[9]; //全局變量存放 AD0,AD1,AD2的結(jié)果
- word sum[9]; //初始化時(shí)為求平均值,全白中,各個(gè)燈的FF次的電壓和
- word avrg0[9]; //全白時(shí)各個(gè)燈的平均電壓
- word summ[9];//初始化時(shí)為求平均值,全黑中,各個(gè)燈的FF次的電壓和
- word avrg1[9]; //全黑時(shí)各個(gè)燈的平均電壓
- word ss[9]; //實(shí)際采集來(lái)的各個(gè)燈的電壓
- word s[9]; // 實(shí)際采集來(lái)的各個(gè)燈的電壓
- word sum2[8];//用于存放兩兩燈電壓之和
- word k; //用于存放比較出的最大值
- uint h=1500;//轉(zhuǎn)角大小
- int flag = 0;//標(biāo)志中間燈是否第一次在黑道附近
- int flagg=0;//標(biāo)志0燈從哪邊感應(yīng)到黑道
- int flagg1=0;//標(biāo)志8燈從哪邊感應(yīng)到黑道
- int flagg0=0;//標(biāo)志是左邊還是右邊出道
- int j=0;
- dword i;
- dword m;
- dword s0;
- dword s1;
- dword p11=0;//以下四個(gè)變量用于記錄黑道處于同一側(cè)的時(shí)間
- dword p12=0;
- dword p21=0;
- dword p22=0;
- word max0[9]=0;//初始化時(shí)采集來(lái)的黑道的值
- int g=0;//為過濾算法使用
- word cha[9];//用來(lái)存放黑白電壓差
- int ffgg0=0;//標(biāo)志是否用中間板采的數(shù)據(jù)
- int ffgg1=0;//標(biāo)志是否用中間板采的數(shù)據(jù)
- word sum0=0; //初始化時(shí)采集來(lái)9個(gè)燈的全白電壓和
- //word sum1=0; //實(shí)際采集來(lái)的左4個(gè)燈的電壓和
- //word sum22=0; //實(shí)際采集來(lái)的右4個(gè)燈的電壓和
- int fla=0;//標(biāo)志是出道還是入道
- void AD_Init();
- void PWM_Init();
- void PWM_Init1();
- //void PID();
- void AD_Init(void) //AD初始化
- {
- //控制寄存器2: 上電,標(biāo)志位快速清零,開中斷
- ATD0CTL2 = (ATD0CTL2_ADPU_MASK|ATD0CTL2_AFFC_MASK|ATD0CTL2_ASCIE_MASK);
- ATD1CTL2 = (ATD1CTL2_ADPU_MASK|ATD1CTL2_AFFC_MASK|ATD1CTL2_ASCIE_MASK);
- //控制寄存器3:轉(zhuǎn)換序列長(zhǎng)度為3
-
- ATD0CTL3 =0x78;// (ATD0CTL3_S2C_MASK|ATD0CTL3_S1C_MASK);
- ATD1CTL3 =0x78;// (ATD1CTL3_S2C_MASK|ATD1CTL3_S1C_MASK);
- //控制寄存器4:
- ATD0CTL4 = (ATD0CTL4_SRES8_MASK|ATD0CTL4_PRS1_MASK|ATD0CTL4_PRS0_MASK);
- ATD1CTL4 = (ATD1CTL4_SRES8_MASK|ATD1CTL4_PRS1_MASK|ATD1CTL4_PRS0_MASK);
- //控制寄存器5:
- ATD0CTL5 = (ATD0CTL5_DJM_MASK|ATD0CTL5_SCAN_MASK|ATD0CTL5_MULT_MASK);
- ATD1CTL5 = (ATD1CTL5_DJM_MASK|ATD1CTL5_SCAN_MASK|ATD1CTL5_MULT_MASK);
- ATD0DIEN=0x00; // 禁止數(shù)字輸入緩沖
- ATD1DIEN=0x00; // 禁止數(shù)字輸入緩沖
- }
- #pragma CODE_SEG NON_BANKED //中斷服務(wù)程序
- #pragma TRAP_PROC
- void interrupt 22 Int_AD0(void)
- {
- AD_wData[0] = ATD0DR0; //將結(jié)果寄存器中的值存放到數(shù)組中
- AD_wData[1] = ATD0DR1; //將結(jié)果寄存器中的值存放到數(shù)組中
- AD_wData[2] = ATD0DR2; //將結(jié)果寄存器中的值存放到數(shù)組中
- AD_wData[3] = ATD0DR3;
- AD_wData[4] = ATD0DR4;
- AD_wData[5] = ATD0DR5;
- AD_wData[6] = ATD0DR6;
- AD_wData[7] = ATD0DR7;
- AD_wData[8] = ATD1DR0;
-
-
- }
- #pragma CODE_SEG DEFAULT
- word max(word a,word b,word c,word d,word e,word
- f,word r,word w) {
- word maxx=0;
- if(a>maxx)maxx=a;
- if(b>maxx)maxx=b;
- if(c>maxx)maxx=c;
- if(d>maxx)maxx=d;
- if(e>maxx)maxx=e;
- if(f>maxx)maxx=f;
- if(r>maxx)maxx=r;
- if(w>maxx)maxx=w;
- return maxx;
- }
- void delay0(){
- for(i=0;i<0xFFFF;i++)
- for(m=0;m<0x05;m++);
- }
- void delay1(){
- for(i=0;i<0xFFFF;i++);
- // for(i=0;i<0xFFFF;i++);
- }
- void main(void)
- {
-
- AD_Init(); //AD 初始化
- DDRB = 0xFF;
- DDRA_BIT6=0; //A_BIT6口作為第二塊板左邊傳感器的輸入口
- DDRA_BIT7=0; //A_BIT7口作為第二塊板右邊傳感器的輸入口
- PORTB = 0xFF;
- p=0;
- for(j=0;j<9;j++)
- {
- AD_wData[j] = 0; //全局變量初始化
- sum[j]=0;
-
- avrg0[j]=0;
- avrg1[j]=0;
- summ[j]=0;
- }
- for(j=0;j<9;j++) {
- max0[j]=0;ss[j]=0;
- }
- for(j=0;j<8;j++)
- sum2[j]=0;
- EnableInterrupts; //開AD中斷
- for(i=0;i<0xFFFF;i++);
- for(i=0;i<0xFF;i++) //只能是FF,防止下面sum溢出
- {
- for(j=0;j<9;j++)
- //采集白道路信息
- {
- sum[j]=sum[j]+AD_wData[j];
- }
- }
- for(i=0;i<9;i++) {
- sum0=sum0+sum[i]/0xFF;
- avrg0[i]=sum[i]/0xFF;
- }
-
- PORTB=sum[0]/0xFF; //顯示0通道采集到的值
- delay0();
-
- PORTB=0x00;//顯示馬上得進(jìn)行黑道信息采集了
- delay1();
-
- for(j=0;j<9;j++){
- for(m=0;m<0xFF;m++){
- summ[j]=summ[j]+AD_wData[j];
- }
- avrg1[j]=summ[j]/0xFF;
- PORTB=avrg1[j]; //顯示采來(lái)的黑道信息
- cha[j]=avrg1[j]-avrg0[j];
- delay0();
- PORTB=0x00; //顯示馬上得進(jìn)行下一次黑道信息采集了
- delay1();
- }
- PORTB=0x00;
- //燈全亮,提示車馬上就可以跑了
- delay1();
-
- PWM_Init() ;
- PWM_Init1(1500,1,200);
- for(i=0;i<0xFFF;i++);
- // delay1();
- for(;;)
- {
-
- int f=0;
- u3=100;
- if(flagk1==1){
- p21=0;
- flagk2=0;
- p11++;
- if(p11==0xFFF)flagkk1=1;
- }else if(flagk2==1){
- p11=0;
- flagk1=0;
- p21++;
- if(p21==0xFFF)flagkk2=1;
- }
- for(f=0;f<9;f++){
- s[f]=AD_wData[f];
- ss[f]=s[f]-(avrg0[f]-0x50); //當(dāng)前值減去初始白道值,以便比較
- }
- for(f=0;f<8;f++)sum2[f]=ss[f]+ss[f+1]; //兩兩燈電壓之和
- //減去1.6V防止溢出*******************
- if(AD_wData[0]<0xC0&& AD_wData[1]<0xC0&& AD_wData[2]<0xC0&&AD_wData[3]<0xC0&&
- AD_wData[4]<0xC0&&AD_wData[5]<0xC0&&AD_wData[6]<0xC0&&AD_wData[7]<0xC0&&
- AD_wData[8]<0xC0){
- if(sum2[0]<0xC0&&sum2[1]<0xC0&&sum2[2]<0xC0&&sum2[3]<0xC0&&
- sum2[4]<0xC0&&sum2[5]<0xC0&&sum2[6]<0xC0&&sum2[7]<0xD0){
- fla=1;
- if(flagg0==1)
- {
- for(i=0;i<0xFF;i++);
- PWM_Init1(1140,u1,200);
- flagk1=1;
- flagkk2=0;
- for(;;){
- if(AD_wData[4]>0xB0||AD_wData[5]>0xB0||AD_wData[6]>0xB0||
- AD_wData[7]>0xB0||AD_wData[8]>0xB0){
- flagg0=0;
- break;
- }
- }
- }
- else if(flagg0==2){
- for(i=0;i<0xFF;i++);
- PWM_Init1(1860,u1,200);
- flagk1=0;
- flagkk2=1;
- for(;;)if(AD_wData[0]>0xB0||AD_wData[1]>0xB0||
- AD_wData[2]>0xB0||AD_wData[3]>0xB0||AD_wData[4]>0xB0){
- flagg0=0;
- break;
- }
- }
- }else{
- }
- }else{
-
- if(s[0]-(avrg0[0]-0x13)<0x40 && s[1]-(avrg0[1]-0x13)<0x40 &&
- s[2]-(avrg0[2]-0x13)<0x40 && s[3]-(avrg0[3]-0x13)<0x40 &&
- s[4]-(avrg0[4]-0x13)<0x40 && s[5]-(avrg0[5]-0x13)<0x40 &&
- s[6]-(avrg0[6]-0x13)<0x40 && s[7]-(avrg0[7]-0x13)<0x40 &&
- s[8]-(avrg0[8]-0x13)<0x40)
- ///////////注意調(diào)整該值36***************
- {
-
- /* if(PORTA_BIT6!=0||PORTA_BIT7!=0){
-
- if(PORTA_BIT6!
- =0&&PORTA_BIT7==0)PWM_Init1(1900,200,1);
- else if(PORTA_BIT7!=0&&PORTA_BIT6==0)
- PWM_Init1(1100,200,1);
- }
- */
-
-
- }else{
-
-
- k=max(sum2[0],sum2[1],sum2[2],sum2[3],sum2[4],sum2[5],sum2[6],sum2[7]);
- //誰(shuí)兩和最大,黑道就在誰(shuí)兩之間
- if(k==sum2[0]){
- p=0;
- flagg0=2;
- if(fla==1)
- control_11();
- else if(fla==0) control_1();
- }
- else{
- if(k==sum2[1]){
- p=0;
- p1=0;
- fla=0;
- control_2(s[1],s[2],ss[1],ss[2],cha[1],cha[2],avrg0[1],avrg0[2]);
- }
- else{if(k==sum2[2]){
- p=0;
- p1=0;
- fla=0;
- control_3(s[2],s[3],ss[2],ss[3],cha[2],cha[3],avrg0[2],avrg0[3]);
- }
- else{if(k==sum2[3]){
- p=0;
- p1=0;
- fla=0;
- control_4(s[3],s[4],ss[3],ss[4],cha[3],cha[4],avrg0[3],avrg0[4]);
- }
- else{if(k==sum2[4]){
- fla=0;
- p1=0;
- control_5(s[4],s[5],ss[4],ss[5],cha[4],cha[5],avrg0[4],avrg0[5]);
- }
- else{if(k==sum2[5]){
- fla=0;
- p1=0;
- control_6(s[5],s[6],ss[5],ss[6],cha[5],cha[6],avrg0[5],avrg0[6]);
- }
- else{if(k==sum2[6]){
- p=0;
- p1=0;
- fla=0;
- control_7(s[6],s[7],ss[6],ss[7],cha[6],cha[7],avrg0[6],avrg0[7]);
- }
- else{if(k==sum2[7]){
- p=0;
- flagg0=1;
- if(fla==0)
- control_8();
- else if(fla==1)
- control_88();
- } else{
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|