【【超声波避障小车代码】】

超声波避障小车代码

#include  								//通用51头文件
#include 							//使用了_nop()_函数

#define uchar unsigned char				//用 uchar 表示 unsigned char 类型
#define uint	unsigned int				//用 uint  表示 unsigned int  类型

sbit ENA	= P0^6;
sbit IN1	=	P3^2;
sbit IN2	= P3^3;
sbit IN3	=	P3^4;
sbit IN4 	= P3^5;
sbit ENB	= P2^0;				

sbit Echo = P1^1;									//超声波模块 Echo 接单片机P0.6
sbit Trig = P1^2;									//超声波模块 Trig 接单片机P0.7

sbit DJ		= P1^0;

void turnleft();
void turnright();
void straight();
void stop();
void count();
void run();
void hcsr04();
void delayms(uint ms);

uint stime = 0;									  //测距数据,距离所用时间变量
uint timer = 0;								   	//定时器1,计时变量
uint timercar = 0;
uint S = 0;												//距离
uchar flag =0;										//定时器0溢出标志
uchar s_bai,s_shi,s_ge;						//距离数据,百位,十位,个位
uchar PWMA,PWMB;
uint counter;
uchar i,j;
uchar jiaodu;

void  main()
{  
	TMOD|=0x11;		   			//定时器0定时器1,工作方式1
	TH0=0;
	TL0=0;          
	TH1=0xFE;		   				//500us定时
	TL1=0x33;
	ET0=1;            		//定时器0中断使能
	ET1=1;			   				//定时器1中断使能
	TR1=1;			   				//定时器1开始计时
	EA=1;			   					//开启总中断
	jiaodu = 3;
	while(1)
	{
		hcsr04();						
		count();					 //计算距离
		run();
	}
}

void delayms(uint ms)
{
	uint msi,msj;
	for(msi = 0;msi < ms;msi++)
		for(msj = 0;msj < 112;msj++);
}

void run()
{
	if(jiaodu ==3 && S >= 15)
	{
		straight();
		hcsr04();
		count();
	}
	else if(jiaodu ==3 && S < 15)
	{
		stop();
		jiaodu = 2;
		delayms(200);
		hcsr04();
		count();
	}
	if(jiaodu == 2 && S >=15)
	{
		turnright();
		delayms(500);
		jiaodu =3;
		delayms(200);
		hcsr04();
		count();
	}
	else if(jiaodu == 2 && S < 15)
	{
		jiaodu = 4;
		delayms(200);
		hcsr04();
		count();
	}
	if(jiaodu == 4 && S >=15)
	{
		turnleft();
		delayms(500);
		jiaodu =3;
		delayms(200);
		hcsr04();
		count();
	}
	else if(jiaodu == 4 && S <15)
	{
		jiaodu =3;
		delayms(200);
		hcsr04();
		count();
	}
}
void straight()	//PWM 15
{
	IN1 = 1;
	IN2 = 0;
	PWMA = 25;
	IN3 = 1;
	IN4 = 0;
	PWMB = 25;
}
void turnleft() //PWM 60
{
	IN1 = 0;
	IN2 = 1;
	PWMA = 25;
	IN3 = 1;
	IN4 = 0;
	PWMB = 25;
}
void turnright()	//PWM 60
{
	IN1 = 1;
	IN2 = 0;
	PWMA = 25;
	IN3 = 0;
	IN4 = 1;
	PWMB = 25;
}
void stop()	//PWM 0
{
	IN1 = 0;
	IN2 = 0;
	PWMA = 0;
	IN3 = 0;
	IN4 = 0;
	PWMB = 0;
}
void hcsr04()
{
	Trig=1;			              
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_();
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 						//大于10us的触发信号
	Trig=0;
	while(!Echo);				//当Echo为零时等待
	TR0=1;			    			//开启计数
	while(Echo);					//当Echo为1时,计时并等待
	TR0=0;								//关闭计时
}
void count(void)
{
	stime=TH0*256+TL0;			//计数器每加一次,1us
	TH0=0;
	TL0=0;									//清零定时器0计数
	S=(stime*1.8)/100;      //换算距离,单位CM
}
void Tmr0_isr() interrupt 1  //T0中断用来计数器溢出,超过测距范围
{
	flag=1;							 			 //中断溢出标志
}

void Tmr1_isr() interrupt 3 //T1中断用来扫描数码管和计500ms测距
{
	TH1=0xFE;							//500us中断
	TL1=0x33;
	i++;
	j++;
	counter++;//中断次数,即:多少个0.5ms
  if(counter <= jiaodu) DJ = 1;//高电平占空比由变量jiaodu控制,jiaodu=1时高电平0.5ms,jiaodu=5时高电平2.5ms
	if(counter > jiaodu && counter <= 40) DJ = 0;//低电平占空比,jiaodu=1时低电平19.5ms,jiaodu=5时低电平17.5ms
	if(counter > 40) counter = 0;//脉宽20ms
	if(i < PWMA)
	{
		ENA = 1;
	}
	else 
	{
		ENA = 0;
		if(i >= 100)
		{
			i = 0;
		}
	}
	if(j < PWMB)
	{
		ENB = 1;
	}
	else 
	{
		ENB = 0;
		if(j >= 100)
		{
			j = 0;
		}
	}
}          

你可能感兴趣的:(51单片机微型设计,单片机,嵌入式硬件)