51单片机红外遥控小车

出遥控小车是一个比较经典的51单片机项目,适合用来作为新手的毕业项目,考察的比较综合。

先放代码:

这是引脚调用和全局变量定义,代码经过多轮调试确定可行,如果复制后运行得不到预期效果,多半是问题出在这个部分,可以更具原理图和开发手册进行修改。

#include <REGX52.H>
#include <intrins.h>
sbit SIO = P3^4;	 //串行数据输入
sbit IN_CLK = P3^5;	  //串输入时钟
sbit OUT_CLK = P3^6;  //并行输出时钟
sbit beep=P2^3;		//蜂鸣器
int code table[5][8]={{0xE7,0xF3,0xF9,0x00,0x00,0xF9,0xF3,0xE7},//前进
                      {0xE7,0xCF,0x9F,0x00,0x00,0x9F,0xCF,0xE7},//后退
					  {0xE7,0xE7,0xE7,0x66,0x24,0x81,0xC3,0xE7},//左转
					  {0xE7,0xC3,0x81,0x24,0x66,0xE7,0xE7,0xE7},//右转
					  {0x7E,0xBD,0xDB,0xE7,0xE7,0xDB,0xBD,0x7E}//待机
};
unsigned int AllTimer;    // 定时器记录时间
unsigned int timer33[33];// 用来存放每个脉冲的时间
unsigned int timer4[4];	//把32位转换成4个字节
unsigned char isok=0;  //33位接收完则为1
unsigned char Allok=0;//把32位转换成了4字节完成则为1
sbit IN1=P1^2;       //左反
sbit IN2=P1^3;      //左正
sbit EN1=P1^4;	   //左电机
sbit EN2=P1^5;	  //右电机
sbit IN3=P1^6;	 //右正
sbit IN4=P1^7;  // 右反
int pwm_t=0;	  //调速的计数变量
int speed;		 //调速变量
int n=4;		//切换点阵模式,初始显示待机

 初始化定时器,TH和TL分别为高八位和低八位,如果是在8位模式下,两者相同,关键地方已加注释,不多做赘述,定时器中断是51单片机中非常重要的一个模块,必须掌握。调用定时器0来解码计时,定时器1则用来给电机调速。

void init()
{
	//设置定时器中断
	 EA=1;
	 ET1=1;//设置定时器0,用来计算一个脉冲的时间
	 ET0=1;//用来处理pwm脉宽调制用
	//设置外部中断
	 EX0=1;	//设置外部中断0允许
	 IT0=1;//设置下降沿触发
	//启动定时器
	 TR1=1;
	 TR0=1;
	//设置定时器模式
	 TMOD=0X22;
	//设置定时器起始时间
	TH1=238;
	TL1=238;
	TH0=56;
	TL0=56;
	
}

PWM电机调速,定时器1触发中断一次,执行一次pwm,在0~speed区间,小车电机使能,speed~255区间,电机非使能,调整speed数值大小即可调节小车速度的快慢。

void PWM()interrupt 3
{
    pwm_t++;
	if(pwm_t>=255)
	{	
		pwm_t=0;
	}
	if(pwm_t<=speed)
	{
		EN1=EN2=1;
	}else
	{
		EN1=EN2=0;
	}	
			
}

以下是简单的控制方向和加速减速的代码。

void speed_up()  //加速
{
 	 if(speed<=245)
	 speed+=10;
}
void speed_down()	//减速
{
 	if(speed>=10)
	speed-=10;
}
//直行
 void move()
{
  IN1=0;
  IN2=1;
  IN3=1;
  IN4=0;
}
//停止
void stop()
{
  IN1=0;
  IN2=0;
  IN3=0;
  IN4=0;
}
//后退
void back()
{
  IN1=1;
  IN2=0;
  IN3=0;
  IN4=1;
}
//左转
void leftmove()
{
  IN1=0;
  IN2=0;
  IN3=1;
  IN4=0;
}
//右转
void rightmove()
{
  IN1=0;
  IN2=1;
  IN3=0;
  IN4=0;
}

 定时器0初始值设置位56,从56到255,再发射一次脉冲后才把中断标志置为1,计数次数为255-56+1=200,stc51晶振一般都为11.0592MHz,计数一次为1.085us,如晶振不同,还需要进行调整。

out函数将不同的AllTimer值存入timer33数组

//        217us=200*1.085us
void timer() interrupt 1
{
  AllTimer++;//加1实际加了217us	   65535*217us=14.2s
}
//外部0中断函数0
//每一个下降沿会触发一次中断
//每次中断都是一个波形	 13.5ms  1.125ms  2.25ms
void out() interrupt 0
{
  static int flag=0; //设置判断是否第一次进入
  static int i=0;//表示数组下标i=0;
  if(flag) //第二次中断 第一个波形下降沿到了
  {	   //AllTimer 加一次 277.76us
	  if(AllTimer>55 && AllTimer<65) //如果是引导码62.2
	  {
	   	 i=0;//如果是引导码 存在数组的第一个位置
	  }
	  timer33[i]=AllTimer;
	  i++;//存下一个数据
	  AllTimer=0;//下一次脉冲从0开始
	  if(i==33) //防止数组越界,最大下标是32
	  {
	    i = 0;
		isok=1; //用来标识33位已经解析完了
	  	flag=0;// 33位接收完成后,下次按键从else开始
	  }
  }
  else	  //第一次中断
  {
	flag=1;
	AllTimer=0;
  } 
}

 codebyte函数中,根据不同的AllTimer值(AllTimer表示为不同的时间长度),来进行解码,讲脉冲信号转换为数字信号,引导码为13.5ms,逻辑1为2.25ms,逻辑0为1.125ms,此为红外通信相关知识,不多做赘述,实际上也不难。

再将32位,4个8位转换成四个字节存入timer4,(实际解码有33位,第一位引导码,不进行解析)

void codeByte()
{
  //总共33位
  unsigned char i,j,k,value;
  unsigned char OneTime;
  k=1;// 引导码不处理 从下标1开始
  for(i=0;i<4;i++)//4个字节
  {
	for(j=0;j<8;j++)//4个字节中每个字节的8位
	{
	 OneTime=timer33[k];//每一个脉冲时间
	 if(OneTime >7)//0--1.125ms--5.18 1--2.25ms--10.3
	 {
	  //数据是先收到低位,再收到高位 
	  value=value|0x80;
	  //0000 0000 | 1000 0000
	 }
	 if(j<7)
	 {
	  value=value>>1;//0100 0000
	 }
	 k++;
	}//当前for循环结束 则8位处理完
  	timer4[i]=value;//存8位数据
	value=0;
  }//此循环结束 说明32位处理完毕
  Allok=1;//4字节处理完毕标志
}

点阵显示是动态显示,一次只能显示一行(一列),显示间隔较短,造成视觉残留,使得外面可以在点阵上看到多行(多列)的图案。

void display()
{
	 int i;
     char da = 0x80;
	 int j;
	 for(j=10;j>0;j--)
	 {
	 	for(i = 0; i < 8;i++)	  //显示每一行数据,总共8行
			  {
			  	  OUT_CLK =0;
				  SendBit(table[n][i]);
				  SendBit(da);    //0100 0000
				  da = _cror_(da,1);	  //循环右移
				  OUT_CLK =1;
			  }
	 }
}
void SendBit(unsigned char SendData)  //0xfe
{
	 //发送行0100 0000  0x40
	 unsigned char i = 0;
	for(i = 0; i < 8;i++)
	{
		IN_CLK = 0;	
		if(SendData & 0x01)		SIO = 1;
		 else				SIO = 0;
		SendData = SendData >>1;
		IN_CLK = 1;
	}
}

初始时速度为180,8位的数据码(键值) ,解码后存在timer[2],对照遥控器的键值表,不同的按键来实现不同的功能,当加速使得速度超过200后,蜂鸣器开始警报,速度低于200后,蜂鸣器也停止警报。

全局变量n对应多维数组tabler中不同的八位,每一个8位对于一种显示模式,前进显示前进的箭头,转向显示转向的箭头,车辆初始时或者车辆停止时会显示X待机画面。

此处可以优化,我是在主函数体内的while循环内调用display显示函数,一次闪过八位,但是由于51单片机的性能过低,被其他代码拖累运行速度后,diplay的显示间隔较长,肉眼看起来会很闪,可以采用高性能的51芯片,或者使用定时器来显示,进行优化后图像显示会更好。

void main()
{
	init();
	speed=180;
	while(1)
	{
		display();
		if(speed>200)
			beep=0;
		else 
			beep=1;
		if(isok==1)
		{
			codeByte();//解析32位	
			isok=0;
			if(Allok==1)
			{
				switch(timer4[2])
				{
					case 0x18:{move();n=0;}break;
					case 0x1c: {stop();n=4;}break;
					case 0x08: {leftmove();n=2;} break;
					case 0x5a:{ rightmove();n=3;} break;
					case 0x52: {back();n=1;} break;
					case 0x15: speed_up();break;
					case 0x07: speed_down();break;
					default: break;
				}
			}
		}				
	 }
}

  • 18
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: C51单片机红外遥控小车是一种使用C51单片机控制的具备红外遥控功能的小型车辆。该小车通过接收红外信号来实现远程控制功能,并利用C51单片机进行信号的解码和控制电机的转动。 C51单片机是一种经典的8位单片机,具有丰富的外设资源和强大的运算能力。通过编程,我们可以将红外接收头连接至单片机的外部中断口,使其能够实时接收外界通过红外遥控发送的信号。 当红外接收头接收到红外信号时,C51单片机会利用软件对信号进行解码,提取出对应的指令信息。通过编写相应的控制程序,我们可以实现小车的各项功能,如前进、后退、左转、右转等。经过编码和解码处理,我们可以将指令信息转换为控制信号,通过控制电机及相关驱动电路实现小车的动作。 此外,为了使红外遥控小车能够实现更加复杂的功能,我们可以通过编写更加复杂的控制程序,赋予其避障、跟踪等功能。通过利用C51单片机的强大运算能力,我们可以根据小车周围的传感数据,实现对小车运动的智能控制。 总之,C51单片机红外遥控小车是一种灵活、易于控制的小型车辆,通过C51单片机红外接收头的配合,实现了对小车的远程控制功能。 ### 回答2: C51单片机红外遥控小车是一种由C51单片机控制的红外遥控车辆。该小车通过接收红外信号进行控制,可以实现远程控制和操控。 C51单片机是一种经典的单片机,具有高性能,强大的处理能力和丰富的外设接口,非常适合用于控制小车等智能设备的开发。 红外遥控技术是一种基于红外光信号的无线通信技术,通过发送和接收红外光信号来实现设备之间的数据交互。在红外遥控小车中,我们可以通过使用红外发射红外接收,发送和接收红外信号来实现对小车的控制。 当我们按下红外遥控上的按键时,红外发射会向小车发送特定的红外信号。然后,红外接收会接收到信号,并将其发送给C51单片机进行解码。C51单片机会根据接收到的信号进行相应的处理,然后控制小车的电机启动、停止、转向等动作。 在小车的开发过程中,我们需要对C51单片机进行编程,并设计电路板连接红外接收红外发射、电机等元件。通过合理的代码设计和电路连接,我们可以实现红外遥控小车的功能。 总结来说,C51单片机红外遥控小车是一种通过C51单片机控制的小车,通过发送和接收红外信号来实现远程控制。它利用C51单片机的高性能和丰富的接口,实现了对小车的精确控制,是一种非常有趣和有用的智能设备。 ### 回答3: C51单片机红外遥控小车是一种使用C51单片机作为控制核心的小车,它能够通过红外遥控方式实现控制操作。 红外遥控技术是一种将电子信号转化为红外线信号进行无线传输的技术。通过红外遥控向C51单片机发送指令,C51单片机接收到指令后进行解析,并执行相应的操作。因此,C51单片机红外遥控小车能够实现根据不同的遥控指令进行前进、后退、左转、右转等运动。 该小车的设计原理是利用C51单片机的输入输出口与一些电动元件进行连接。红外遥控通过发送特定的红外信号,C51单片机接收到信号后进行解码,得到相应的指令。然后,控制电机、车轮等电动元件进行相应的运动。 在设计过程中,需要首先明确红外遥控的编码方式,即确定不同按键对应的红外信号。然后,利用C51单片机提供的相应的编码/解码功能,对接收到的红外信号进行解码处理。根据解码结果,控制电机实现小车的运动。 此外,为了实现更复杂的功能,可以在C51单片机中添加其他传感,例如距离传感红外避障传感等。通过这些传感的反馈信号,可以实现自动避障、自动停止等功能。 总的来说,C51单片机红外遥控小车是一种将C51单片机红外遥控技术相结合的智能小车。通过遥控发送指令,实现小车运动的控制。此外,也可以通过添加其他传感,为小车增加更多的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值