红外发射
通过通过红外二极管发射红外光,三极管的状态来控制。
红外模块一般都是三个引脚,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


779

被折叠的 条评论
为什么被折叠?



