51单片机NEC红外遥控器解码

发布者:MysticDreamer最新更新时间:2022-02-28 来源: eefocus关键字:51单片机  NEC  红外遥控器  解码 手机看文章 扫描二维码
随时随地手机看文章

【前言】

红外遥控器常用的调制制式主要分为两种,这里主要讲解以NEC调制方式的遥控器解码过程。


废话不多说,直接上时序图!( 更多详细资料自行查询)


总时序图:

前导码:

' 0 ' 和 ' 1 ' 编码表示:

【解码思路】

-----1、 使用定时器计算高低电平的时间

-----2、 使用数组存放一组完整的电平时间编码

-----3、 计算电平的时长

-----4、 组合数据,获得编码值,存放于数组

-----5、 LCD1602管显示


【编写程序】

/*--------------------------------------------------------

程序功能: 51红外遥控器解码程序

功能详情: 遥控解码后送数码管依次显示,共4字节 .( 12MHz晶振 )

编写时间: 2017/9/7

编写人: 吴**

--------------------------------------------------------*/

 

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define display_data P0

 

sbit LCD_RS=P1^0;

sbit LCD_RW=P1^1;

sbit LCD_EN=P1^2;    

 

uchar irtime = 0;

uchar startflag = 0; // 起始标志位

uchar ir_rc_ok = 0; // 红外高/低电平时间接收完成标志位 

uchar bitnum = 0;

uchar ir_change_ok = 0; // 转码完成标志位

 

uchar irdata[33]; // 电平时间数组

uchar ircode[4]; // 遥控解码数组

 

// 字符编码

uchar str[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F',' '};

 

/********* 延时函数 **********/

void delayms(uint xms)

{

uint i,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);

}   

 

/********** 系统初始化 ********/

void sysinit()

{

// 初始化定时器

TMOD = 0x02; // 设置定时器0为工作方式2 (0~255)

TH0 = 0x00; // 赋初值

TL0 = 0x00;

TR0 = 1; // 启动定时器0

ET0 = 1; // 使能定时器0

 

// 初始换外部中断1

IT1 = 1; // 下降沿触发

EX1 = 1; // 开外部中断0

EA = 1; // 开总中断

}

 

/************ 转换编码 *************/

void changecode()

{

uchar k = 1;

uchar i,j;

uchar value;

if(ir_rc_ok ==1) // 如果ir接收完成就进行转码

{

for(i=0;i<4;i++) // 获取前导码后的4个字节数据

{

for(j=0;j<8;j++)

{

value = value>>1; // 因低位在前,所以需右移 

if(irdata[k]>6&&irdata[k]<10) // 判断数据是否为" 1 ",从第2位开始接收

{

value |= 0x80;

}

k++;

}

ircode[i] = value; // 存储1个字节数据 

}

ir_change_ok = 1; // 编码转换完成标志位

ir_rc_ok = 0; // ir接收标志复位

}

}

/********** 1602写指令 ***********/

void write_com(uchar com)   

{

LCD_RS=0;    //RS =‘low’为写指令

LCD_RW=0;

display_data=com;

delayms(5);

LCD_EN=1;

delayms(5);

LCD_EN=0;

}

 

/*********** 1602写数据 ***********/

void write_data(uchar wdata)

{

LCD_RS=1; //RS ='high'为写数据

LCD_RW=0;

display_data=wdata;

delayms(3);

LCD_EN=1;

delayms(5);

LCD_EN=0;

}

 

/*********** 1602显示屏初始化 ***********/

void disinit()

{

LCD_EN=0; //初始化使能

write_com(0x38); //设置显示模式

write_com(0x0f); //设置显示开/关及光标

write_com(0x06);   //设置指针位置及移屏

write_com(0x80);   //数据指针初始化( +0x10 指针移至显示区外)

}

 

/************* 1602显示解码结果 *****************/

void display()

{

uchar num,high,low;

if(ir_change_ok == 1) // 判断编码是否转换完毕

{

ir_change_ok = 0;

write_com(0x80); // 重复调用时,显示指针复位

for(num=0;num<4;num++)

{

high = ircode[num]/16;

low = ircode[num]%16;

write_data(str[high]);

write_data(str[low]);

write_data(str[16]); // 显示空格

}

}

}

 

/********** 主函数 *************/

void main()

{

sysinit(); // 初始化

disinit(); // 显示屏初始化

while(1)

{

changecode(); // 获取编码

display(); // 显示解码后的编码

}

}

 

/********* 定时器0中断服务函数 ***********/

void t0()interrupt 1

{

irtime++;

}

 

/********* 外部中断1服务函数 ***********/

void exint1() interrupt 2

{

if(startflag)

{

if(irtime>32) // 检测前导码

{

bitnum=0;

}

irdata[bitnum]=irtime; // 从前导码开始接收数据

irtime=0;

bitnum++;

if(bitnum==33) // 前导码+4字节数据,共 33 比特 

{

bitnum=0;

ir_rc_ok = 1;

}

 

}

else

{

startflag = 1;

irtime = 0;

}

}

关键字:51单片机  NEC  红外遥控器  解码 引用地址:51单片机NEC红外遥控器解码

上一篇:51单片机工作于方式0的定时器模式
下一篇:51单片机定时器工作方式1、2原理详解

推荐阅读最新更新时间:2024-11-12 11:01

通用型51单片机lcd1602驱动
文件:lcd_1602.h #ifndef _LCD1602_TRAVELER_H_ #define _LCD1602_TRAVELER_H_ /*************************待配置项*******************************/ #define DATA_LCD P0 //液晶与MCU 数据口 sbit RS_LCD = P2^5; // 液晶的RS、RW、E 端在 MCU端的连线 sbit RW_LCD = P2^6; sbit E_LCD = P2^7; /**************************************************
[单片机]
51单片机向PC电脑发送汉字的方法
简介:最近看到有朋友在网上问单片机怎么向电脑发送一串汉字这个问题,其实这个问题也不难.呵呵.只要把相关的参数设置好一些,然后把汉字定义成一组字符向电脑发送就可以. 为了让大家更明确的了解,我就写了下面的一个程序来演示一下. 操作条件: 1.XP操作系统. 2.XP的超级终端显示. 3.WJ-V4.0开发板. 4.单片机STC89C52. 5.晶振11.0592M 操作步骤: 1.设置TMOD设置波特率和定时器1的工作方式. 2.设置定时器的初始值. 3.设置串行口工作方式. 4.设置波特率不加倍. 5.打开TR1允许发送. 6.启动定时器. 7.串行中断打开. 8.打开E
[单片机]
<font color='red'>51单片机</font>向PC电脑发送汉字的方法
AT89S51单片机扩充外部中断源系统的设计
AT89S51为用户提供两个外部中断请求输入端INT0(的反)和INT1(的反),实际的应用系统中,两个外部中断请求源往往不够用,需对外部中断源进行扩充。下面介绍一种扩充外部中断源的方法。 如下图所示,若系统中有5个外部中断请求源IR0~IR4,它们均为高电平请求有效,这时可按中断请求的轻重缓急进行排队,把其中最高级别的中断请求源IR0直接接到AT89S51的一个外部中断请求源IR0输入端INT0,其余的4个中断请求源IR1~IR4按下图所示的方法通过各自的OC门(集电极开路门)连到AT89S51的另一个外中断源输入端INT1,同时还连到P1口的P1.0~P1.3脚,供AT89S51查询。各外部中断请求源的中断请求由外部设备的
[单片机]
AT89S<font color='red'>51单片机</font>扩充外部中断源系统的设计
51单片机完全不工作,该怎么入手去检查
首先应该确认电源电压是否正常。用电压表测量接地引脚跟电源引脚之间的电压,看是否是电源电压,例如常用的5V。接下来就是检查复位引脚电压是否正常。分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。然后再检查晶振是否起振了,一般用示波器来看晶振引脚的波形,注意应该使用示波器探头的“X10”档。另一个办法是测量复位状态下的IO口电平,按住复位键不放,然后测量IO口(没接外部上拉的P0口除外)的电压,看是否是高电平,如果不是高电平,则多半是因为晶振没有起振。另外还要注意的地方是,如果使用片内ROM的话(大部分情况下如此,现在已经很少有用外部扩ROM的了),一定要将EA引脚拉高,否则会出现程序乱跑的情况。有时用仿真器可以,而烧入片子不行
[单片机]
51单片机风扇和测温程序
使用的模块有:直流电机,舵机,蜂鸣器,红外,温度传感器,lcd1602, , 舵机,这种舵机它的频率是50HZ,一个周期为20ms,是通过一个周期中高低电平的占比来控制角度的角度的,本程序舵机是来回摆动,不是停在五个角度(0,45,90,135,180)的某个角度,可通过红外遥控来实现停在某个角度,电扇的开关,也由红外来控制。 为了方便起见,将过温自动报警,和使用舵机的功能,分成两种模式,可通过红外遥控来切换,因为我之前遇到过,使用了舵机后(需要用到定时器),温度就不能正常显示, 通过DS18b20来测温度,在lcd1602上显示温度和时间,当温度超过26度时(可在代码中修改),直流电机打开,蜂鸣器报警,低于26关闭。也可
[单片机]
51单片机KEIL如何建立多个C文件及注意事项
1如何建立多个C文件 首先,我们需要一个新文档,这个文档的建立有两种方法(以delay1s函数为例)。第一种,在工程目录下建立一个delay1s.txt然后将其改名为delay1s.h。因为都是同编码的所以不会出现乱 码,然后在工程中将其打开。第二种方法是直接在工程中新建一个文档,然后保存的时候将名字保存为delay1s.h即可。如果是需要添加很多文件的话建议使用第一种方法,这是个人建议。其 次,我们需要编写delay1s.h这个文件的内容,其内容如下: #ifndef _DELAY1S_H_ #define _DELAY1S_H_ void delay1s();//延时函数 #endif 这个是头文件的定义,作用是声明了de
[单片机]
实验六 定时器、计数器(80C51单片机汇编语言编程
P3.2口输出周期为2秒的方波;T1口为脉冲输入端,记录输入脉冲的个数,脉冲数由P1口所接的8个发光管显示出来(以二进制形式)。 实验箱晶振:6M ORG 00000H AJMP MAIN ORG 000BH AJMP T0 ORG 0030H MAIN:MOV TMOD,#51H MOV TH0,#3CH MOV TL0,#0B0H MOV TH1,#00H MOV TL1,#00H MOV P1,TL1 SETB EA SETB ET0 SETB ET1 setb tr0 setb tr1 MOV R7,#0AH
[单片机]
51单片机寄存器详解
51单片机的特殊功能寄存器 定时器: 定时方式寄存器TMOD(地址89H); TMOD被分成两部份,每部份4位。分别用于控制T1和T0。 GATE C/T M1 M0 GATE C/T M1 M0 1. M1、M0:定时/计数器的工作方式 1. 工作方式0:13位定时/计数方式(8192)。 2. 工作方式1:16位定时/计数方式(65536)。 3. 工作方式2和工作方式3, 8位的定时/计数方式(256)。 2. 如果C/T为0就是用作定时器,如果C/T为1就是用作计数器。 3. 门控位GATE(GATE=0与INT0无关,GATE=1与INT0有关):
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved