单片机 > 单片机程序设计 > 详情

两轮巡线小车源程序 2个红外传感器

发布时间:2023-03-24 发布时间:
|

传感器:2个红外传感器


程序如下:

#include //52头文件

unsigned char pwm_left_val; //左电机占空比值 取值范围0-170,0最快

unsigned char pwm_right_val; //右电机占空比值取值范围0-170 ,0最快

unsigned char pwm_t;//周期

////////////////////////////////////

/*电机驱动IO定义*/

sbit IN1 = P1^0; //为1 左电机反转

sbit IN2 = P1^1; //为1 左电机正转

sbit IN3 = P1^2; //为1 右电机正转

sbit IN4 = P1^3; //为1 右电机反转

sbit EN1 = P1^6; //为1 左电机使能

sbit EN2 = P1^7; //为1 右电机使能

sbit left_led = P2^0;//左寻迹信号,为0没有识别到黑线,为1识别到黑线

sbit right_led = P2^3;//右寻迹信号,为0没有识别到黑线,为1识别到黑线


#define left_motor_en EN1 = 1 //左电机使能

#define right_motor_en EN2 = 1 //右电机使能


#define left_motor_stops IN1 = 0, IN2 = 0//左电机停止

#define right_motor_stops IN3 = 0, IN4 = 0//右电机停止

#define left_motor_go IN1 = 0, IN2 = 1//左电机正传

#define left_motor_back IN1 = 1, IN2 = 0//左电机反转

#define right_motor_go IN3 = 1, IN4 = 0//右电机正传

#define right_motor_back IN3 = 0, IN4 = 1//右电机反转

///////////////////////////////////////////////////////////////////

/*延时*/

void delay(unsigned int z)//毫秒级延时

{

unsigned int x,y;

for(x = z; x > 0; x--)

for(y = 110; y > 0 ; y--);

}

/*小车前进*/

void forward()

{

pwm_left_val= pwm_right_val=100;

left_motor_go; //左电机前进

right_motor_go; //右电机前进

}

/*小车左转*/

void xiaoleft_run()

{

pwm_left_val=170;

pwm_right_val=100;

left_motor_go; //左电机前进

right_motor_go; //右电机前进

}

/*小车右转*/

void xiaoright_run()

{

pwm_left_val=100;

pwm_right_val=170;

left_motor_go; //左电机前进

right_motor_go; //右电机前进

}


void timer0_init()

{

TMOD |= 0x02;//8位自动重装模块

TH0 = 220;

TL0 = 220;//11.0592M晶振下占空比最大比值是256,输出100HZ

TR0 = 1;//启动定时器0

ET0 = 1;//允许定时器0中断

EA = 1;//总中断允许


}

int main()

{

timer0_init();

delay(100);//延时1秒

while(1)

{

//为0 没有识别到黑线 为1识别到黑线

if(left_led==0&&right_led==0)

{

forward();//前进

delay(100);

}

else if( left_led == 1 && right_led== 0 )//左边触线,小左转修正

{

xiaoleft_run();

delay(200);

}

else if(left_led == 0 && right_led== 1 )//右边触线,小右转修正

{

xiaoright_run();

delay(200);

}

}

}

//定时器0中断

void timer0() interrupt 1

{

pwm_t++;//周期计时加

if(pwm_t == 155)

pwm_t = EN1 = EN2 = 0;

if(pwm_left_val == pwm_t)//左电机占空比

EN1 = 1;

if(pwm_right_val == pwm_t)//右电机占空比

EN2 = 1;

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR单片机Atmega16的ADC采集数码管显示仿真程序