基于38khz的NEC协议

  • 红外发射
    • 简易电路图
    • NEC协议
      • 产生红外光
    • 数据编码 0 1
    • 结合程序
    • 红外接收
    • 接收电路
    • 解码过程
    • 解码代码

红外发射

通过通过红外二极管发射红外光,三极管的状态来控制。
红外模块一般都是三个引脚,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 = 342NoSend_IR(171); //4.5ms不发送载波信号,周期 = 4500us/26.3us = 171GetByte_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;i<16;i++){  //循环16位数据中的每一位if(temp){  //如果是1执行Send_NEC_1();}else{     //是0执行Send_NEC_0();}temp = temp>>1;   //左移一位,取出下一位数据}//数据赋值给中间变量,取出最低位//发送命令码temp = Cmd & 0x01;for(i = 0;i<8;i++){  //循环8位命令中的每一位if(temp){  //如果是1执行Send_NEC_1();}else{     //是0执行Send_NEC_0();}temp = temp>>1;   //左移一位,取出下一位命令}//发送命令码的反码temp = (~Cmd) & 0x01;for(i = 0;i<8;i++){  //循环8位命令中的每一位if(temp){  //如果是1执行Send_NEC_1();}else{     //是0执行Send_NEC_0();}temp = temp>>1;   //左移一位,取出下一位命令}//发送结束码Send_NEC_0();
}/*
发送二进制数据 0
*/
void Send_NEC_0()
{Send_IR(21);  //发送载波信号0.56ms, 也就是发送红外光21个周期NoSend_IR(21);   //不发送载波信号0.56ms,也是个周期
}/*
发送二进制数据 1
*/
void Send_NEC_1()
{Send_IR(21);    //发送载波信号也是21个周期NoSend_IR(64);     //不发送载波信号为1.68ms 发送周期 = 1680us/26.3us = 63.87
}//发送红外光, 26.3us这个周期内8.77us发送红外光,17.53us不发送红外光
void Send_IR(unsigned int i)
{while(i--)      //产生i个周期的信号 ,一个周期是26.3us{IR_EN = 1;Delay9us();IR_EN = 0;Delay18us();}}//不发送红外 26.3us这个周期内都不不发送红外光
void NoSend_IR(unsigned int i)
{while(i--){IR_EN = 0;Delay26us(); }
}//延时9us函数,用于控制输出高电平的时间 标准为8.77us,允许有误差
void Delay9us()     //@11.0592MHz
{unsigned char i;_nop_();i = 1;while (--i);
}
//延时18us函数,控制输出低电平时间,标准为17.53us
void Delay18us()        //@11.0592MHz
{unsigned char i;_nop_();i = 5;while (--i);
}//26.3us,用于控制周期内不发射红外光
void Delay26us()        //@11.0592MHz
{unsigned char i;_nop_();i = 9;while (--i);
}

红外接收

与发送相反,当有载波信号是,io口为低电平。

接收电路

解码过程

最前面接收的9ms的引导码:
就是9ms的低电平, 也就是IR端口会输出9ms的低电平,然后是4.5ms的高电平。
数据位;

解码代码

#include "ir.h"
//数据接收缓冲区
unsigned char ircode[4];//标志位,用于判断是否成功接收数据
char ir_flag =0;//等待10us
void Delay10us()        //@11.0592MHz
{unsigned char i;i = 2;while (--i);
}void Delay600us()      //@11.0592MHz
{unsigned char i, j;_nop_();i = 2;j = 15;do{while (--j);} while (--i);
}//接收初始化
void IR_Init()
{IR_INPUT = 1;  //初始化引脚转态IT0 = 1;       //外部中断0 设置为下降沿触发EA = 1;        //开中断EX0 = 1;        //中断总允许
}//中断服务函数
//处理接收的红外信息,进行解码
void EX0_ISR() interrupt 0
{ir_flag = ir_read(ircode);   //对接收标志位进行判断,将接受到的数据保存到数组中if(!ir_flag){return;  //返回值为零直接退出}
}//接收红外数据解码
char ir_read(unsigned char * readBuff)
{unsigned char count ,i,j,temp = 0;//判断是不是低电平,即接收引导码为低电平if(!IR_INPUT){//检测低电平的有效性,是否为引导码 低电平的时间只有9mscount = 0;//等待低电平(引导码)结束,接收为低电平时一直等待while(!IR_INPUT){count++;   //为低电平是加加技术//实时检测是否为低电平Delay10us(); if(count>1000){   //9ms/10us = 900次 如果超过9ms还是低电平,低电平不合法(允许误差,稍微大一点,1000)return 0;    //不是有效引导码,退出}}//IR_INPUT = 1,引导码低电平结束,进入4.5ms的高电平count = 0; //清零//检测高电平的有效性while(IR_INPUT){count++;Delay10us();    //高电平超过4.5ms,超时判断if(count>500){  //4500us/10us = 450 ,允许误差,设置为 500return 0;  }}//高电平结束,引导码结束,接收数据//接收四个字节的数据 用号码,用户码反码 ,命令码,命令码反码for(i = 0;i<4;i++){//接收每个字节的比特位Bytefor(j=0;j<8;j++){count = 0;while(!IR_INPUT){ //等待第一个位的低电平结束0.56ms,也就是载波有红外时。count++;Delay10us();if(count>60){  //0.54ms/10us = 56 ,允许误差return 0; //超时退出,正常自动在while循环判断就退出了}}//判断是0还是1,高电平时间为560us,是0,如果高电平时间为1.685ms,是1//延时600us,超过0的时间,判断IR_INPUT是0还是1,如果是1,则表示前面状态还未结束,说明是1Delay600us();if(IR_INPUT){  //高电平,表示数据为比特位 1temp |= 1<<j; //当前位置1count = 0;while(IR_INPUT){  //等待高电平结束count++;Delay10us();if(count>100){return 0;}}} //不是 1,为0时开始已经赋值为0了}readBuff[i] = temp;  //保存数据temp = 0;}Delay600us();//通过反码判断数据是否正确 >>互为反码相加等于255if((readBuff[0]+readBuff[1]) == 255 ){if((readBuff[2]+readBuff[3]) == 255 ){return 1;  //数据正确,返回1}}}return 0;
}   

调用

//采用判断标志位标志位,为1表示接收到数据if(ir_flag){switch(ircode[2]){  //取出命令码case 0xff :method1();break; //相应的命令执行函数case 0x0f :method2();break;case 0x7f :method3();break;}}

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

  1. 图解红外遥控的发射和接收原理

    在智能机器论坛上看一篇关于红外遥控的原理文章,感觉不错,特转一下以备查阅 为了更直观地让大家理解红外遥控的原理,这篇文章用图片来帮你理解红外遥控的发射管原理和接收原理. 红外遥控的概述: 红外线的光谱 ...

  2. 音视频同步原理解析;音频编码和解码原理

    视频流中的DTS/PTS到底是什么? DTS(解码时间戳)和PTS(显示时间戳)分别是解码器进行解码和显示帧时相对于SCR(系统参考)的时间戳.SCR可以理解为解码器应该开始从磁盘读取数据时的时间. ...

  3. 按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速-萌新入门

    ** 按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速 ** 分享一个萌新入门小工程 一.原件连接: 第一种直接用51开发板 第二种用最小单元加unl2003驱动 二.开发板电路 ...

  4. 彻底弄懂base64的编码与解码原理

    作者介绍 背景 base64的编码原理网上讲解较多,但解码原理讲解较少,并且没有对其中的内部实现原理进行剖析.想要彻底了解base64的编码与解码原理,请耐心看完此文,你一定会有所收获. 涉及算法与逻 ...

  5. java 流 改变编码_Java-IO流之转换流的使用和编码与解码原理

    一.理论: 1.字符流和字节流区别是什么? 字符流=字节流+编码集,在实际读取的时候其实字符流还是按照字节来读取,但是会更具编码集进行查找编码集字典解析相应的字节,使得一次读取出一个字符: 2.什么是 ...

  6. 计算机 发声原理,模拟电子琴演奏程序设计。微机中扬声器控制发声原理如练习图10.1所示,其中用到8255与8253两个芯片。...

    模拟电子琴演奏程序设计.微机中扬声器控制发声原理如练习图10.1所示,其中用到8255与8253两个芯片. 程序设计流程该程序设计可以分解成两个部分:如何控制计算机的扬声器发音.如何使不同按键对应约定 ...

  7. php url编码原理,urlencode编码/urldecode解码作用及使用方法

    urlencode和urldecode释义 urlencode是一个函数,可将字符串以URL编码,用于编码处理. URL编码(URL encoding),也称作百分号编码(Percent-encodi ...

  8. 【算法思想】Reed-Solomon 纠错编码基础概念,编码、解码算法原理、数学公式 Python代码实现

    [算法思想]Reed-Solomon 纠错编码基础概念,编码.解码算法原理.数学公式 & Python代码实现 文章目录 [算法思想]Reed-Solomon 纠错编码基础概念,编码.解码算法 ...

  9. Java笔记-字符串编码与解码以及编码表原理

    编码表 编码表:是一张由字符及其对应编码的表 计算机只能识别二进制数据,早期由电信号演化而来. 为了方便使用计算机,让它可以识别各个国家的文字,就将各个国家的文字用数字来表示,并一一对应,形成一张编码 ...

  10. FPGA实现IRIG-B(DC)码编码和解码的设计

    [导读]为达到IRIG-B码与时间信号输入.输出的精确同步,采用现代化靶场的IRIG-B码编码和解码的原理,从工程的角度出发,提出了使用现场可编程门阵列(FPGA)来实现IRIG-B码编码和解码的设计 ...

最新文章

  1. SQL Server查询某字段在哪些表中
  2. Java课程作业02
  3. 2020癌症大数据分析,哪些癌症最要命?
  4. wxWidgets:wxJoystickEvent类用法
  5. 学习总结 for循环语句的应用
  6. C#保存CookieContainer到文件
  7. 【西门子PLC标识的字母代表什么?】
  8. 注意!某知名国产软件被曝携带木马病毒
  9. 解决各个浏览器文件下载中文乱码问题
  10. brew安装nvm报nvm command not found解决方案
  11. ipad浏览器安装java_在桌面浏览器中调试iphone、ipad等设备上的网页
  12. 利用cocoapods创建基于git的私有库Spec Repo
  13. 月赚千刀的国外联盟Lead项目,实操拆解
  14. FloorPlan相关
  15. Skype for Business Server 2015-13-IISARR-2-发布-3-OWAS
  16. Web 组态运用之用户数据 ARPU 分析图
  17. element-ui iconfont乱码问题处理
  18. 微信开发者工具如何模拟调试扫描小程序二维码功能
  19. pso算法matlab程序,基本PSO算法的matlab源程序
  20. python读取mat数据_Python几种读取mat格式数据的方法,python几种读取mat

热门文章

  1. WORD之文字处理之插入复合条饼图
  2. Django 4.x Caches 缓存使用示例和配置方法
  3. PAT --- 1055.集体照 (25 分)
  4. 一般描绘性形容词_描绘性形容词和限制性形容词
  5. 八皇后问题 (25分)
  6. linux下关闭acpi电源管理模块
  7. 新手如果写一个软件,应该是怎么一个流程?
  8. VLAN Tag,PVID
  9. matlab空间计量AIC准则,关于AIC准则
  10. 收藏 | 基于深度学习的图像匹配技术一览