基于51单片机的红外接收

对于红外接收的通信原理有很多,常用的有通过脉宽调制(PWM)和脉时调制(PPM)两种方法,最近小编就在尝试写基于51单片机的脉时调制的红外接收程序,有一些心得,与大家分享分享。

原理分析
通常的红外遥控器是将二进制脉冲码调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去。
因为二进制脉冲码的形式有很多种,所以要开发红外接收设备,一定要知道红外遥控器的载码方式和载波频率,我们才可以选取一体化红外接收头和制定解码方案。
下面是我使用的红外接收头的实物与原理图

在这里插入图片描述

在这里插入图片描述
由原理图可以看到,我使用的一体红外接收头有三个引脚,分别是VCC、GND和数据引脚(用来传输数据)。

数据形式

现在我们已经知道了它是由一根数据引脚来传输数据,那数据又是怎么传输?传输一次的数据格式又是什么呢?

在这里插入图片描述
在这儿,可以很明显的看到,数据是由五段数据组成。

首先它会给一个9ms的低电平,4.5ms的高电平组成的起始码,告诉我们接下来要传输数据了,然后开始传输32位二进制的数据码。

由于它只有一根数据引脚,所以我们要通过这一根数据引脚来判断它传输的数据是二进制的 ‘ 0 ’ 还是 ‘ 1 ’ 。

在这里插入图片描述
在这儿可以看到,无论数据传输 ‘ 0 ’ 还是 ‘ 1 ’ ,都会先传输0.56ms,也就是560us的低电平,这样用来判断上一个数据结束,下一个数据开始,至于传输的数据就是用接下来的高电平时间来判断。

高电平时间为565um就是数据 ‘ 0 ’ ,1690um就是数据 ‘ 1 ’ 。由于在现实数据传输中受到环境因素的影响,所以我们需要取一个中间值来判断,超过这个中间值就是数据 ‘ 1 ’ ,反之就是数据 ‘ 0 ’ 。

代码

理论讲了这么久了,估计都枯燥了吧,接下来就开始分析代码吧。
重点:代码格式一定要规范!

void main(void)
{
   
//我们使用的是51单片机,所以可以使用定时器来计时。
//对于延时函数,确实很方便,但是小编强烈不推荐使用延时函数,能用定时器解决的尽量不使用延时函数。
//延时函数时间不准确,至于为什么不使用延时函数,小编之后会单独写一篇来解释。
	TMOD = 0x01;//这儿打开定时器1,用来计时。
	TR0 = 0;	//关闭允许定时器1计时,当我们需要定时器1计时的时候再打开。
	IT0 = 1;
	EX0 = 1;	//这两句是51单片机的外部中断1允许,并且下降沿触发,因为红外数据最开始是9ms低电平,所以可以使用外部中断(不使用中断也行)。
	EA = 1;		//打开总中断
	while (1)
	{
   
		//while(1)循环中的代码后面会单独列出。
	}
}

以上就是我们程序需要打开的配置
接下来就是外部中断程序

bit InFrared_Way = 0;			//在程序的开头我定义了一个一字节的变量,至于作用,接下来会讲。

void Int_0(void) interrupt 0	//外部中断程序
{
   
//最开始我是直接在外部中断里面写红外解码程序,但是我发现无论如何都无法进入中断程序(可能是我代码的问题)。
  • 57
    点赞
  • 177
    收藏
    觉得还不错? 一键收藏
  • 40
    评论
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值