51单片机红外遥控

红外遥控其实很简单,分为发射和接收两部分,也都是关于时序的时间设置来发送或者接收数据的。

1、红外发送:主要利用38Khz的载波+红外发光二极管 来发送红外光,且数据遵循NEC码,遥控指令的数据格式为:引导码、地址码、地址反码、控制码、控制反码

NEC码的位定义:一个脉冲对应560us 的连续载波,一个逻辑1 传输需要2.25ms(560us 脉冲+1680us 低电平),

一个逻辑0 的传输需要1.125ms(560us脉冲+560us 低电平)

 2、红外接收:接收红外发送传来的4个格式数据(引导码、地址码、地址反码、控制码、控制反码)。

但由于接收时没有脉冲时是高电平收到脉冲时为低电平,所以当有脉冲信号传进来时,利用外部中断中的下降沿触发 下降沿中断,然后判断低电平的时间,进而判断数据的0或1

   ENC码定义:接收头接收数据时,逻辑1 应该是560us 低+1680us 高,逻辑0 应该是560us 低+560us 高。

接收时引导码是由一个9ms低电平 + 一个4.5ms高电平组成。

地址反码、控制码、控制反码均是8位数据格式。接收时数据(低位在前,高位在后顺序)按照逻辑1:560us 低+1680us 高,逻辑0:560us 低+560us 高的方式进行数据判断。

**!!!主要在于接收部分是有脉冲时低电平,无脉冲时高电平。所以依照这种特性可以采用外部中断的下降沿触发外部中断进行轮询下降沿的时间来判断数据1或是0**

程序待发:

** 红外c文件:**

#include "ir.h"

unsigned char Read_Ir_value[4];//存储4个字节接收码(地址码+地址反码+控制码+控制反码)

//定义延时函数
//void delay10us(void)   //误差 -0.234375us
//{
//    unsigned char a;
//    for(a=2;a>0;a--);
//}


void delay10us(unsigned int ten_us)
{
	while(ten_us--);	
}

void ired_init(void)
{
	IT0 = 1;	//下降沿触发
	EX0 = 1;	//打开中断0允许
	EA = 1;	//打开总中断
	IRIN = 1;	//初始化端口
}

void ired() interrupt 0	//外部中断0服务函数
{
	unsigned int Ir_time = 0;
	unsigned char i = 0, j = 0;
	unsigned char cnt = 0;
	
	if(IRIN == 0)
	{
		Ir_time = 1000;      		// 10 000 = 10ms 
		while((!IRIN) && (Ir_time))		//引导信号0 9ms ,超过10ms强制退出
		{
			delay10us(1);   			// 延时函数 10us
			Ir_time--;
			if(Ir_time == 0) return;
		}
		if(IRIN == 1)
		{
			Ir_time = 500;
			while(IRIN && Ir_time)	 //引导信号1 4.5ms ,超过5ms强制退出
			{
				delay10us(1);
				Ir_time--;
				if(Ir_time == 0) return;
			}
			for(i=0; i<4; i++)		//引导码结束后就是剩下的4个8bit数据
			{
				for(j=0; j<8; j++)
				{
					Ir_time = 600;
					while( (IRIN == 0) && Ir_time)  //等待数据1或0前面的0.56ms结束,若超过6ms强制退出
					{
						delay10us(1);
						Ir_time--;
						if(Ir_time == 0) return;
					}
					Ir_time = 20;
					while(IRIN && (Ir_time))   				//等待数据1或0后面的高电平结束,若超过2ms强制退出
					{
						delay10us(10);   /* 问题在这里 10us*10 循环20次 */
						Ir_time--;
						cnt++;
						if(Ir_time == 0) return;
						if(cnt > 20) return;
					}
					Read_Ir_value[i] >>= 1;
					if(cnt >= 8)    //如果cnt>0.8ms,数组i就等于1
					{
						Read_Ir_value[i] |= 0x80;
					}
					cnt = 0;
				}
			}
		}
		if(Read_Ir_value[2] != ~Read_Ir_value[3])
		{
			for(i=0; i<4; i++)
			{
				Read_Ir_value[i] = 0;
			}
			return;
		}
	}
}

** 红外H文件:**

#ifndef _ir_H
#define _ir_H

#include <reg51.h>
//管脚定义
sbit IRIN = P3^2;

//声明变量
extern unsigned char Read_Ir_value[4]; 

//函数声明
//void Delay10us(void);
void delay10us(unsigned int ten_us);
void ired_init(void);

#endif

** 数码管C文件:**

#include "smg.h"

//共阴极数码管显示0~F的段码数据
unsigned char dx[10] = {0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0XFe, 0XF6};

void delay_10us(unsigned int ten_us)
{
	while(ten_us--);	
}

/*******************************************************************************
* 函 数 名       : smg_display
* 函数功能		 : 动态数码管显示
* 输    入       : dat:要显示的数据
				   pos:从左开始第几个位置开始显示,范围1-8
* 输    出    	 : 无
*******************************************************************************/
void smg_display(unsigned char dat[], unsigned char pos)
{
	unsigned char i = 0;
	unsigned char pos_temp = pos - 1;

	for(i=pos_temp; i<8; i++)
	{
	   	switch(7 - i)//位选
		{
			case 0: LSC=1;LSB=1;LSA=1;break;
			case 1: LSC=1;LSB=1;LSA=0;break;
			case 2: LSC=1;LSB=0;LSA=1;break;
			case 3: LSC=1;LSB=0;LSA=0;break;
			case 4: LSC=0;LSB=1;LSA=1;break;
			case 5: LSC=0;LSB=1;LSA=0;break;
			case 6: LSC=0;LSB=0;LSA=1;break;
			case 7: LSC=0;LSB=0;LSA=0;break;
		}
		P0 = dat[i - pos_temp];//传送段选数据
		delay_10us(100);//延时一段时间,等待显示稳定
		P0 = 0x00;//消音
	}
}

** 数码管H文件:**

#ifndef _smg_H_
#define _smg_H_

#include <reg51.h>
//#define SMG_A_DP_PORT	P0	//使用宏定义数码管段码口    //现用P0代替

//定义数码管位选信号控制脚
sbit LSA = P2^0;
sbit LSB = P2^1;
sbit LSC = P2^2;

//声明变量
extern unsigned char dx[10];

//声明函数
void delay_10us(unsigned int ten_us);
//函数声明
void smg_display(unsigned char dat[], unsigned char pos);

#endif

** 主函数/主程序文件:**

#include "smg.h"
#include "ir.h"


/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main(void)
{	
	unsigned char ired_buf[3];

	ired_init();//红外初始化

	while(1)
	{				
		ired_buf[0] = dx[Read_Ir_value[2] / 16];		//将控制码高4位转换为数码管段码,
                                                        //可以位移位和位或 得到高四位和低四位
		ired_buf[1] = dx[Read_Ir_value[2] % 16];		//将控制码低4位转换为数码管段码
		ired_buf[2] = 0X6E;			//显示H的段码
		smg_display(ired_buf, 6);
	}		
}

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值