栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c51单片机小车代码解释

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c51单片机小车代码解释

总结流程:
1.对每个引脚位定义,后面好用
2.宏定义了红外传感器的2个引脚对应的名字
3.宏定义小车的速度speed,方便后期修改
4.对左右电机的pwm分别进行了宏定义
5.宏定义小车左右2个电机的转动方向
6.定义左右电机pwm_value用来调控电机的转速,设置drive_value用来接接收小车的speed
7.设置延时函数方便后期调用,设置小车行驶方式函数(以左转为例实际上就是让drive_value=speed,然后调用相应的宏定义,让左边电机向前或者向后转),注意以左边电机:时间上每个电机由3个引脚共同控制,假设px_1对应前转,px_2对应后转, px_3对应pwm,那么速度加实际上是pwm=1,速度会一直加,而px_1和px_2控制的是准备往前还是往后转。
8.设置电机pwm调节函数,这个函数由定时器0中断函数调用,函数内容是设置对应电机判断pwm_value是否大于dirve_value,如果pwm_value>drive_value就把对应电机的pwm置为0,如果pwm_value 9.设置定时器初始化函数。TMOD设置工作模式,TH0,TL0设置定时间隔;TR0置为1开始定时器0计数,ET0置为1开启定时器0中断,EA置为1开启总中断;
10,设置定时器0中断函数,每次中断pwm_value++;然后调用pwm调节函数,控制小车速度;

#include 
//位定义
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_7=P3^7;
//宏定义
#define uchar unsigned char
#define uint  unsigned int
//左右红外传感器引脚
#define Left_IRSenor_Track   P3_4   
#define Right_IRSenor_Track  P3_3
//速度值和左右电机PWM输入引脚  
#define SPEED              10	  //速度值0-20
#define Left_Motor_PWM	   P1_4	
#define Right_Motor_PWM	   P1_5
//左右车轮运动方向	
#define Left_Motor_Go      {P1_2=0,P1_3=1;} 
#define Left_Motor_Back    {P1_2=1,P1_3=0;}
#define Left_Motor_Stop    {P1_2=0,P1_3=0;}                 
#define Right_Motor_Go     {P1_6=1,P1_7=0;}
#define Right_Motor_Back   {P1_6=0,P1_7=1;}
#define Right_Motor_Stop   {P1_6=0,P1_7=0;}
//左右电机PWM值调节变量
unsigned char Left_PWM_Value=0;
unsigned char Left_Drive_Value=0;
unsigned char Right_PWM_Value =0;
unsigned char Right_Drive_Value=0;
bit Left_moto_stop =1;//注意这里是小写,和上面的Left_Motor_Stop 区分;在这篇代码中用处就是实现if(1)判断
bit Right_moto_stop=1;
//毫秒延时
static int len = 0;
bit flag = 1;
void delay_ms(unsigned int n)
{
    unsigned int i,j;
	   for(i=n; i>0; i--)
	      for(j=114; j>0; j--);
}
//机器人向前行驶
void GoForward(void)
{
    Left_Drive_Value=SPEED;	  
	Right_Drive_Value=SPEED;  
	Left_Motor_Go;   
	Right_Motor_Go;  
}
//机器人向左转
void GoLeft(void)
{			 
    Left_Drive_Value=SPEED;   
	Right_Drive_Value=SPEED; 
	Right_Motor_Go; 
    Left_Motor_Back;  
}
//机器人向右转
void GoRight(void)
{ 
    Left_Drive_Value=SPEED;   
	Right_Drive_Value=SPEED;  
    Left_Motor_Go;    
	Right_Motor_Back;	
}
//机器人停止运行
void Stop(void)	    
{	 
    Left_Motor_Stop;    
	Right_Motor_Stop;   
}
//调节左电机转速函数
void Left_Motor_PWM_Adjust(void)
{  
   if(Left_moto_stop)
	{
   		if(Left_PWM_Value<=Left_Drive_Value)
     		{
	    		 Left_Motor_PWM=1;
	   		}
		else 
    		{
        		 Left_Motor_PWM=0;
	   		}	
		if(Left_PWM_Value>=20)
       		Left_PWM_Value=0;
	}
   else    
    {
        Left_Motor_PWM=0;
	}
}
//调节右电机转速函数
void Right_Motor_PWM_Adjust(void)
{ 
  if(Right_moto_stop)
   { 
    	if(Right_PWM_Value<=Right_Drive_Value)
	    	{
	    	  	Right_Motor_PWM=1;
			}
		else 
	    	{
		   		Right_Motor_PWM=0;
		  	}
		if(Right_PWM_Value>=20)
			Right_PWM_Value=0;
   	}
   else    
    {
  		 Right_Motor_PWM=0;
    }	
}
  void cont()
  {
      delay_ms(1);
     if(Left_IRSenor_Track==1&&Right_IRSenor_Track==1)		 
	  flag = !flag;
		   
		 GoForward();
  
  
  }
  void cont_number(void)
  {
  	   len++;
	   
  
  	   while(1)
	   {
	   	 if(!(Left_IRSenor_Track==1&&Right_IRSenor_Track==1))
      {		  
	    flag = !flag;
        break;
	   }
	   
	   
	   
	   	  }
  		
  
  
  }



//机器人采集红外循迹传感器数据控制电机智能循迹运行
void Track(void)
{
    if(Left_IRSenor_Track==0&&Right_IRSenor_Track==0)
    {	  
	   	   GoForward();
    }
	
   	        
    if(Left_IRSenor_Track==0&&Right_IRSenor_Track==1)    
    {				 	 
        GoRight();
    }
    if(Left_IRSenor_Track==1&&Right_IRSenor_Track==0) 
    {	  				    
        GoLeft();
    }
    if(Left_IRSenor_Track==1&&Right_IRSenor_Track==1)
    {
       GoForward(); 
	   delay_ms(9);
	   cont();//
	   	 
	   
	 }
}
//定时器0初始化
void TIMER0_Init(void)
{
	TMOD=0x01; 
	TH0=0xFC;  
    TL0=0x18;     	
    TR0=1;     
    ET0=1;	   
	EA=1;	   
}
//智能循迹沿黑线前进
void main(void)
{
	unsigned char i=0; 
    P1=0xF0;   //关电机
	//机器人按键启动	        
	while(1)   
	{
		if(P3_7!=1)
		{
			delay_ms(50);
			if(P3_7!=1) break;
		}
	}
	delay_ms(50);   
	TIMER0_Init();	  
	while(1)
	{	

	    while(flag == 1)
		Track();
		while(flag == 0)
		cont_number();//计数
   
        if(len == 9)
		{
		 while(1){
		 Stop();
		}		  }
		delay_ms(1);

	}
}
//定时器0中断函数完成PWM对电机速度调节
void TIMER0_IRQHandler(void) interrupt 1 using 2
{
     TH0=0xFC;
	 TL0=0x18;
	 Left_PWM_Value++; 
	 Right_PWM_Value++;
	 Left_Motor_PWM_Adjust();
	 Right_Motor_PWM_Adjust();
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346581.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号