以51单片机为基础的自动循迹小车

51单片机自动循迹小车

#include<reg52.h>

sbit IN1=P1^2;   //左电机正转
sbit IN2=P1^3;   //左电机反转
sbit IN3=P1^6;   //右电机正转
sbit IN4=P1^7;   //右电机反转
sbit SE1=P3^4;	 //左边红外传感器接口
sbit SE2=P3^5;	 //右边红外传感器接口
//使用跳线帽将使能端与VCC接到一起,使能端一直处于高电平状态,无需另外设置

#define uint unsigned int
#define uchar unsigned char
uchar pwm_left_val=0;        //设置占空比
uchar pwm_right_val=0;	 
uchar pwm_t=0;		        //周期
uchar flag=1;

void forward();
void stops();
void turn_left();
void turn_right();
void init();
void delay(uchar z);
void XJ();

void main()
{
	init();
	while(1)
	{
		XJ();
		while(flag); //flag保证pwm一个周期完整运行(存疑)
		flag=1;
	}
}

void timer0() interrupt 1 //定时器0中断
{
	pwm_t++;
	if(pwm_t==255)
		{
		pwm_t=0;
		flag=0;
		}
	if(pwm_left_val<=pwm_t)
		IN1=IN2=0;
	if(pwm_right_val<=pwm_t)
		IN3=IN4=0;
}

void init()
{
	TMOD=0x02;//8位自动重装模块	10模式
	TH0=220;
	TL0=220;  //设置输出频率为100hz
	TR0=1;	  //定时器0控制运行位
	ET0=1;	  //定时器0中断
	EA=1;	  //总中断
}

void forward()              //小车前进
{
	pwm_left_val=100;       
	pwm_right_val=100;	    
	IN1=1 ;
	IN2=0 ;
	IN3=1;
	IN4=0 ;
}

void turn_left()              //小车左转
{
	pwm_left_val=0;       
	pwm_right_val=100;	    
	IN1=0 ;
	IN2=0 ;
	IN3=1;
	IN4=0 ;
}

void turn_right()              //小车右转
{
	pwm_left_val=100;       
	pwm_right_val=0;	    
	IN1=1;
	IN2=0;
	IN3=0;
	IN4=0;
}

void stops()              //小车停止
{
	pwm_left_val=0;       
	pwm_right_val=0;	    
	IN1=0 ;
	IN2=0 ;
	IN3=0;
	IN4=0 ;
}

void XJ()
{
	if(SE1==1&&SE2==1)
	{
		stops();
	}
	else if(SE1==0&&SE2==1)
	{
		turn_right();
	}
	else if(SE1==1&&SE2==0)
	{
		turn_left();
	}
	else
	{
		forward();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值