⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 final_code.c

📁 机器人应用的全套实例寻机小车
💻 C
字号:
#include <Mega32.h>
#include <stdio.h>

#define stop 0
#define straight 3
#define left_turn 1
#define right_turn 2
#define middle 4
#define left 5
#define right 6
#define move 7
#define begin {
#define end   }

int sensor_timer, go_timer, turn_timer;
int Ain, midRd, leftRd, rightRd; 		//raw A to D number
char car_state, sensor_state;
bit sensor, go, turn;

void main(void);
void initialize(void);
void sensor_check(void);
void move_car(void);

//------------------------------------------------------------------
interrupt [TIM2_OVF] void timer2_ovf(void)
begin
   TCNT2 = 6;
   sensor_timer ++;
   if (turn)
   turn_timer++;

end

//------------------------------------------------------------------
void main(void)
begin
   initialize();
   #asm
   sei
   #endasm

   while(1)
   begin
     sensor_check();
   end
end


//------------------------------------------------------------------
void sensor_check(void)
begin
     switch (sensor_state)
     begin
            case move:
            move_car();
            sensor_timer = 0;
            sensor_state = right;

       break;
       case right:
       if (sensor_timer >= 2)
       begin
            //get the sample
            Ain = ADCH;
	    ADMUX =  0b01100001;   //Read Port A1
            //start another conversion
            ADCSR.6=1;
            rightRd = Ain;
            sensor_state = left;
       end
       else sensor_state = right;
       break;

       case left:
       if (sensor_timer >= 4)
       begin
            //get the sample
            Ain = ADCH;
 	    ADMUX =  0b01100000;   //Read Port A0
            //start another conversion
            ADCSR.6=1;
            leftRd = Ain;  
            sensor_state = middle;
       end
       else sensor_state = left;
       break;

       case middle:
       if (sensor_timer >= 6)
       begin
            // get the sample
            Ain = ADCH;
 	    ADMUX = 0b01100010;   //Read Port A2
            // start another conversion
            ADCSR.6=1;
            midRd = Ain;  
            sensor_state = move;       
       end
       else sensor_state = middle;
       break;
    end
end


//------------------------------------------------------------------
void move_car(void)
begin
     //printf("%d\n\r",midRd);
     switch (car_state)
     begin

          case stop:
          // Car is not over a path
          if (midRd>80 && leftRd>80 && rightRd>80)
          begin
               TCCR0 = 0b00000000;
               PORTB.3 = 0;
               //Stops steering motor
               PORTA.3 = 0;
               PORTA.4 = 0;
               PORTA.5 = 0;
               PORTA.6 = 0;
          end
          
          else
          begin
                TCCR0 = 0b01101100;   //Enable PWM mode PRESCALER 64    
                 OCR0 = 128; 
                 car_state = straight;
 		      end
 		      break;
 		      
          case straight:
          if (midRd>80 && leftRd>80 && rightRd>80)
          begin
               TCCR0 = 0b00000000;
               PORTB.3 = 0;
               //Stops steering motor
               PORTA.3 = 0;
               PORTA.4 = 0;
               PORTA.5 = 0;
               PORTA.6 = 0; 
               car_state = stop;
          end

          else if (leftRd<40 && rightRd>80)
          begin
               //Turn off other transistors
               PORTA.5 = 0;
               PORTA.6 = 0;
               //Power steering motor left
               PORTA.3 = 1;
               PORTA.4 = 1;
               car_state =left_turn; 
                         turn = 1;
               end

          else if (rightRd<40 && leftRd>80)
          begin
               //Turns off other transistors
               PORTA.3 = 0;
               PORTA.4 = 0;
               //Power steering motor right
               PORTA.6 = 1;
               PORTA.5 = 1;
               car_state = right_turn; 
               turn = 1;
	  end
          break;

          case left_turn: 
          if (turn_timer >= 1500)
          begin
              // Car is not over a path
              if (midRd>80 && leftRd>80 && rightRd>80)
              begin   
                   //Turn off all motors
                   TCCR0 = 0b00000000;  
                   PORTB.3 = 0;
                   PORTA.3 = 0;
                   PORTA.4 = 0;
                   PORTA.5 = 0;
                   PORTA.6 = 0;  
                   car_state = stop;
              end    
              turn_timer = 0;
          end

          //If middle sensor is not over the path
          if (midRd>80 && leftRd<40 && rightRd>80)
          begin
               //Power steering motor left
               PORTA.3 = 1;
               PORTA.4 = 1;
               PORTA.5 = 0;
               PORTA.6 = 0;
          end

          //Car has readjusted itself to course - ie it has turned left
          else if (midRd<40 && leftRd>80 && rightRd>80)
          begin
               //Left Brake
               PORTA.5 = 0;
               PORTA.4 = 0;
               PORTA.3 = 1;   
               PORTA.6 = 1;
               car_state = stop;
          end

          //If the car overshoots to the left
          else if (rightRd<40 && leftRd>80)
          begin
              //Left Brake
              PORTA.5 = 0;
              PORTA.4 = 0;
              PORTA.3 = 1;
              PORTA.6 = 1;
              car_state = right_turn;
          end
          break;

          case right_turn:  
     
          if (turn_timer >= 1500)
          begin
    	       if (midRd>80 && leftRd>80 && rightRd>80)
    	       begin
                    //Turn off all motors
                    TCCR0 = 0b00000000; 
    	            PORTB.3 = 0;
                    PORTA.3 = 0;
                    PORTA.4 = 0;
                    PORTA.5 = 0;
                    PORTA.6 = 0;
                    car_state = stop;
    	       end   
    	       turn_timer = 0;
          end

          //If middle sensor is not over the path
          if (midRd>80 && rightRd<40 && leftRd>80)
          begin
               //Power steering motor right
               PORTA.6 = 1;
               PORTA.5 = 1;
               PORTA.4 = 0;
               PORTA.3 = 0;
          end

          //Car has readjusted itself to course - ie it has turned right
          else if (midRd<40 && leftRd>80 && rightRd>80)
          begin
              //Right Brake
              PORTA.5 = 0;
              PORTA.4 = 0;
              PORTA.3 = 1;
              PORTA.6 = 1;
              car_state = stop;
          end

          //If the car overshoots to the right
          else if (leftRd<40 && rightRd>80)
          begin
              //Right Brake
              PORTA.5 = 0;
              PORTA.4 = 0;
              PORTA.3 = 1;
              PORTA.6 = 1;
              car_state = left_turn;
          end
          break;
     end
end


//------------------------------------------------------------------
void initialize(void)
begin
     DDRA = 0b11111000;         //Makes PortA0 - A2 inputs, A3 - A7 outputs 
     DDRB.3 = 1;                //Makes PortB0 output
     TCCR2 = 0b00000011;        //Normal Mode with Prescaler of 64
     TIMSK = 0b01000000;        //Enable Timer 0 interrupt
     sensor_timer = 0;
     car_state = stop;
     sensor_state = right;
     PORTA.4 = 0;               //No power to motor circuitry
     PORTA.5 = 0;
     PORTA.6 = 0;
     PORTA.7 = 0;
     go_timer = 0;
     ADMUX = 0b01100010;
     ADCSR = 0b11000111;        //ADC running with prescaler of 128 so 8 usec per reading
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -