2

我正在为线路跟随器编写代码,我必须从不同的通道读取 7 个模拟值并让机器人做出相应的动作,我阅读了关于这个问题的不同类型的教程并尝试应用我在那里读到的东西,但是没有成功,这是我的代码:

    //all these # below set up the PIC
#include <16F877A.h>
#device adc=10
#FUSES NOWDT      //No Watch Dog Timer
#FUSES HS         //Highspeed Osc > 4mhz
#FUSES PUT        //Power Up Timer
#FUSES NOPROTECT  //Code not protected from reading
#FUSES NODEBUG    //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP      //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD      //No EE protection
#use delay(clock=20000000) //crystal oscillator at 20000000 hertz

void fwrd(int16,int16);
void left(int16,int16,int16);
void right(int16,int16,int16);

unsigned long threshold = /*0b0011101100;*/ 0b1011001100;
unsigned long a0,a1,a2,a3,a4,a5,a6,S_dec,S_dec_last;
unsigned short d0,d1,d2,d3,d4,d5,d6;
unsigned short big=40;
unsigned short middle=30;
unsigned short small=20;
unsigned short current_duty=59;
unsigned short current_duty1=41,gtime=80;


//main program starts here
void main() {
   setup_adc(ADC_CLOCK_DIV_32); //configure analog to digiral converter
   setup_adc_ports(ALL_ANALOG);   //set pins AN0-AN7 to analog 

   while(true){      
      set_adc_channel(0);//set the pic to read from AN0
      delay_us(20);//delay 20 microseconds to allow PIC to switch to analog channel 0
      a0=read_adc(); //read input from pin AN0: 0<=photo<=255

      set_adc_channel(1);//set the pic to read from AN1
      delay_us(20);
      a1=read_adc();

      set_adc_channel(2);  //set the pic to read from AN2
      delay_us(20);
      a2 = read_adc();
      set_adc_channel(0);//set the pic to read from AN0
      delay_us(20);//delay 20 microseconds to allow PIC to switch to analog channel 0
      a0=read_adc(); //read input from pin AN0: 0<=photo<=255

      set_adc_channel(1);//set the pic to read from AN1
      delay_us(20);
      a1=read_adc();

      set_adc_channel(2);  //set the pic to read from AN2
      delay_us(20);
      a2 = read_adc();

      set_adc_channel(3);//set the pic to read from AN4
      delay_us(20);//delay 20 microseconds to allow PIC to switch to analog channel 4
      a3=read_adc(); 

      set_adc_channel(4);//set the pic to read from AN1
      delay_us(20);
      a4=read_adc();

      set_adc_channel(5);  //set the pic to read from AN5
      delay_us(20);
      a5 = read_adc();

      set_adc_channel(6);//set the pic to read from AN6
      delay_us(20);//delay 20 microseconds to allow PIC to switch to analog channel 4
      a6=read_adc(); 


if (a0<threshold)
d0=0;
else d0=1;


if (a1<threshold)
d1=0;
else d1=1;

if (a2<threshold)
d2=0 ;
else d2=1;

if (a3<threshold)
d3=0 ;
else d3=1;

if (a4<threshold)
d4=0 ;
else d4=1;

if (a5<threshold)
d5=0 ;
else d5=1;

if (a6<threshold)
d6=0 ;
else d6=1;

S_dec=d6*64+d5*32+d4*16+d3*8+d2*4+d1*2+d0;
if (S_dec!=0b0000000)
{S_dec_last=S_dec;
switch (S_dec)
       { 
          case 0b1101000:
          case 0b1111000:
          case 0b1111100:
          case 0b1111110:
          case 0b1101100:
          case 0b1001100:
          case 0b1011000:
                left(4.4*gtime,current_duty1-big,current_duty+big);
          break;

          case 0b1000000:
          case 0b1100000:
          case 0b1110000:
                left(3.6*gtime,current_duty1-big,current_duty+big);
          break;

          case   0b0100000:
          case   0b0110000:
          case   0b0111000:
                 left(3*gtime,current_duty-big,current_duty+big);
          break;

          case   0b0010000:
          case   0b0011000:

                 left(1.2*gtime,current_duty-middle,current_duty+small);
          break;

          case   0b0001000:
          case   0b0011100:
                 fwrd(gtime,current_duty+middle);
          break;

          case   0b0001100:
          case   0b0000100:
                right(1.2*gtime,current_duty-middle,current_duty+small);
          break;

          case   0b0000110:
          case   0b0000010:
          case   0b0001110:
                 right(3*gtime,current_duty-middle,current_duty+big);
          break;

          case   0b0000111:
          case   0b0000011:
          case   0b0000001:
                 right(3.6*gtime,current_duty1-big,current_duty+big);
          break;
          case   0b0001011:
          case   0b0001111:
          case   0b0011111:
          case   0b0111111:
          case   0b0011011:
          case   0b0011001:
          case   0b0001101:
              right(4.4*gtime,current_duty1-big,current_duty+big);
          break;

         }

}   else
    S_dec=S_dec_last;
switch (S_dec)
       { 
          case 0b1101000:
          case 0b1111000:
          case 0b1111100:
          case 0b1111110:
          case 0b1101100:
          case 0b1001100:
          case 0b1011000:
                left(4.4*gtime,current_duty1-big,current_duty+big);
          break;

          case 0b1000000:
          case 0b1100000:
          case 0b1110000:
                left(3.6*gtime,current_duty1-big,current_duty+big);
          break;

          case   0b0100000:
          case   0b0110000:
          case   0b0111000:
                 left(3*gtime,current_duty-big,current_duty+big);
          break;

          case   0b0010000:
          case   0b0011000:

                 left(1.2*gtime,current_duty-middle,current_duty+small);
          break;

          case   0b0001000:
          case   0b0011100:
                 fwrd(gtime,current_duty+middle);
          break;

          case   0b0001100:
          case   0b0000100:
                right(1.2*gtime,current_duty-middle,current_duty+small);
          break;

          case   0b0000110:
          case   0b0000010:
          case   0b0001110:
                 right(3*gtime,current_duty-middle,current_duty+big);
          break;

          case   0b0000111:
          case   0b0000011:
          case   0b0000001:
                 right(3.6*gtime,current_duty1-big,current_duty+big);
          break;
          case   0b0001011:
          case   0b0001111:
          case   0b0011111:
          case   0b0111111:
          case   0b0011011:
          case   0b0011001:
          case   0b0001101:
              right(4.4*gtime,current_duty1-big,current_duty+big);
          break;

         }

   }
}

如果您能帮助我,我将不胜感激。

4

0 回答 0