我想要做一辆带有四个红外检测器和两个驱动电机以及型号为STC8H8K64X的芯片的智能红外循迹小车电池为两节74V2200mAh的锂电池编程软件为Keil我想得到这个小车实现的代码要求利用PWM可以控制小车的转弯和转速整体小车运行能够快速代码需标明文件区块
/*
- File: main.c
- Author: Your Name
- Date: Date
- Description: Smart IR Tracing Car
*/
#include <STC8.H>
#define LED P3_4 #define IR1 P1_0 #define IR2 P1_1 #define IR3 P1_2 #define IR4 P1_3 #define ENA P2_0 #define IN1 P2_1 #define IN2 P2_2 #define ENB P2_3 #define IN3 P2_4 #define IN4 P2_5
#define MAX_SPEED 200 #define MIN_SPEED 50 #define SPEED_STEP 10 #define TURN_DELAY 100 #define MOVE_DELAY 50
unsigned char speed = MIN_SPEED; unsigned char turn_speed = MIN_SPEED; unsigned char turn_direction = 0; // 0 = left, 1 = right
void init(); void move_forward(); void move_backward(); void turn_left(); void turn_right(); void stop();
void main(void) { init();
while(1) { if(IR1 && IR2 && IR3 && IR4) { // All sensors off track stop(); } else if(IR1 && !IR2 && !IR3 && IR4) { // Go straight move_forward(); } else if(!IR1 && !IR2 && IR3 && !IR4) { // Go straight move_forward(); } else if(IR1 && IR2 && !IR3 && !IR4) { // Turn left turn_left(); } else if(!IR1 && !IR2 && !IR3 && IR4) { // Turn right turn_right(); } else if(!IR1 && IR2 && !IR3 && !IR4) { // Turn left turn_left(); } else if(!IR1 && !IR2 && IR3 && IR4) { // Turn right turn_right(); } else if(IR1 && IR2 && IR3 && IR4) { // All sensors on track move_forward(); } } }
void init() { P1M0 = 0x0F; // Set P1.0 - P1.3 to input mode P1M1 = 0x00; P2M0 = 0x3F; // Set P2.0 - P2.5 to output mode P2M1 = 0x00; P3M0 = 0xFF; // Set P3.4 to output mode P3M1 = 0x00;
ENA = 1; // Enable motor A ENB = 1; // Enable motor B }
void move_forward() { IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0; }
void move_backward() { IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1; }
void turn_left() { if(turn_direction == 1) { // Already turning right, stop and change direction stop(); delay(TURN_DELAY); } turn_direction = 0; turn_speed = MIN_SPEED; IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0; ENA = turn_speed; ENB = turn_speed; }
void turn_right() { if(turn_direction == 0) { // Already turning left, stop and change direction stop(); delay(TURN_DELAY); } turn_direction = 1; turn_speed = MIN_SPEED; IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0; ENA = turn_speed; ENB = turn_speed; }
void stop() { IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0; ENA = 0; ENB = 0; }
void delay(unsigned int d) { unsigned int i,j; for(i=0;i<d;i++) { for(j=0;j<200;j++) { nop(); } } }
void PWM_ISR() interrupt 1 { static unsigned char step = 0; static unsigned char dir = 0; // 0 = increase, 1 = decrease static unsigned char turn_step = 0;
TF0 = 0;
// Increase or decrease speed if(dir == 0) { step++; if(step >= SPEED_STEP) { step = 0; speed++; if(speed > MAX_SPEED) { speed = MAX_SPEED; dir = 1; } } } else { step++; if(step >= SPEED_STEP) { step = 0; speed--; if(speed < MIN_SPEED) { speed = MIN_SPEED; dir = 0; } } }
// Increase or decrease turn speed if(turn_direction == 0) { // Turning left turn_step++; if(turn_step >= SPEED_STEP) { turn_step = 0; turn_speed++; if(turn_speed > speed) { turn_speed = speed; } } } else { // Turning right turn_step++; if(turn_step >= SPEED_STEP) { turn_step = 0; turn_speed++; if(turn_speed > speed) { turn_speed = speed; } } }
// Set motor speeds ENA = speed; ENB = speed; if(turn_direction == 0) { // Turning left ENA = turn_speed; } else { // Turning right ENB = turn_speed; }
原文地址: https://www.cveoy.top/t/topic/dwZ6 著作权归作者所有。请勿转载和采集!