C51红外接收与发射控制及原理编码与解码

红外发射

通过通过红外二极管发射红外光,三极管的状态来控制。
红外模块一般都是三个引脚,vcc,gnd,dat,通过控制dat口的来控制发射红外光。

简易电路图

在这里插入图片描述
将数据口连接到单片机的引脚为上,控制io口的电平状态,来控制三极管的导通状态,从而发射红外光。

NEC协议

NEC协议特点:8位地址和8位命令为提高可靠性,地址和命令都传输2次,脉冲间隔调制38kHz载波频率。
在这里插入图片描述
包含引导码,地址码,地址码反码,命令码,命令码反码,结束码。

产生红外光

1.38khz频率,就是1s/38khz = 26.3us/(周期) pwm波的占空比是1/3,即8.77us发射红外光,17.53us不发射红外光。

2.一个时钟周期时产生高电平的时间为8.77us(导通,发射红外光),低电平的时间为17.53us(不导通,不发射红外光)。
在这里插入图片描述

数据编码 0 1

对数据的编码就是通过多个周期发送指定格式的高低电平,控制红外二极管亮灭。
在这里插入图片描述
发送一个二进制 0
一.0.56ms内发送载波信号,一个周期26.3us 就需要 560us/26.3us = 21.29 个周期。 也就是需要发送8.77us高电平,17.53低电平,需要21个周期 。

二.0.56ms不发送载波信号,也是21个周期 就是26.53us的低电平需要21个周期。

在这里插入图片描述

结合程序

从最下面往上面看,下面是底层函数

#include <reg51.h>
#include <intrins.h>

void Delay9us();
void Delay18us();
void Delay26us();
void Send_IR(unsigned int i);
void NoSend_IR(unsigned int i);
void Send_NEC_0();
void Send_NEC_1(); 
void Send_ENC_Message(unsigned int user_code,unsigned char Cmd);
void GetByte_And_SendByte(unsigned int user_code,unsigned char Cmd);
//红外控制引脚
sbit IR_EN =  P2^0;
void main()
{
   
   
	Send_ENC_Message(100,20);  //地址码和命令码
		
}

/*
 *发送一帧数据
*/
void Send_ENC_Message(unsigned int user_code,unsigned char Cmd)
{
   
   
	//先发送引导码
	Send_IR(342);   //9ms发送载波信号 周期 = 9000us/26.3us = 342
	NoSend_IR(171); //4.5ms不发送载波信号,周期 = 4500us/26.3us = 171
	GetByte_And_SendByte(user_code,Cmd);   //取出每一位并发送
}

//取出数据中的每一位并发送
void GetByte_And_SendByte(unsigned int user_code,unsigned char Cmd)
{
   
   
	unsigned int temp,i; //定义中间变量
	//发送数据码(地址码和地址码的反码)
	temp = user_code&0x0001; //通过与运算取出数据最低位
	for(i = 0
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值