导航:首页 > 操作系统 > 单片机红外编码程序

单片机红外编码程序

发布时间:2024-11-16 05:03:34

Ⅰ 知道了红外遥控的编码(16位1101 0011 1001 0010)请问怎样在单片机里解码

;遥控器读码程序(晶振为11.0592),该程序能读出遥控器的控制码,并通过LED显示出来
;OMEN 2005/1/16于TCL
;***************************************************************
A_BIT EQU 20H ;数码管个位数存放内存位置
B_BIT EQU 21H ;数码管十位数存放内存位置
NO_OUT EQU 24H ;最终控制号码存放单元
A_NO EQU 25H ;数码管个位数对应代码存放内存位置
B_NO EQU 26H ;数码管十位数对应代码存放内存位置
;22H,23H为控制码及其反码的存放单元

;*******************<<主程序>>***********************************
ORG 0000H
AJMP 0030H
ORG 0003H ;外部中断P3.2脚INT0入口地址
AJMP INT ;转入外部中断服务子程序(解码程序)
ORG 0030H
AJMP MAIN ;转入主程序
;***************************************************************
MAIN: MOV NO_OUT,#0H
SETB EA ;打开CPU总中断请求
SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发
SETB EX0 ;打开INT0中断请求
LOOP: MOV A,NO_OUT;将按键的键值通过P1口的8个LED显示出来!
CPL A ;由于P1发光二极管显示的是电平的反状态,所以取反
MOV P1,A ;发光二极管显示输出
LCALL DISPLAY;LED数码管显示输出
AJMP LOOP;循环
;********************<<中断接受遥控程序>>************************
;以下为进入P3.2脚外部中断子程序,也就是解码程序
INT:
PUSH ACC
PUSH PSW ;将PSW和ACC推入堆栈保护
CLR EA ;暂时关闭CPU的所有中断请求
MOV R6,#10
SB: LCALL DL865;调用865微秒延时子程序
JB P3.2,EXIT;延时865微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
DJNZ R6, SB;重复10次,目的是检测在8650微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲
LCALL DL4737 ;延时4.74毫秒避开4.5毫秒的结果码
MOV R7,#16;忽略前26位系统识别码

JJJJA:JNB P3.2,$;等待地址码第一位的高电平信号
LCALL DL865;高电平开始后用865微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2;将P3.2引脚此时的电平状态0或1存入C中
JNC UUUA;如果为0就跳转到UUUA
LCALL DL1000;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUUA: DJNZ R7,JJJJA
MOV R1,#22H ;设定22H为起始RAM区
MOV R2,#2;接收从22H到23H的2个内存,用于存放操作码和操作反码
PP: MOV R3,#8;每组数据为8位
JJJJ: JNB P3.2,$;等待地址码第一位的高电平信号
LCALL DL865;高电平开始后用865微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2;将P3.2引脚此时的电平状态0或1存入C中
JNC UUU;如果为0就跳转到UUU
LCALL DL1000;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUU: MOV A,@R1;将R1中地址的给A
RRC A;将C中的值0或1移入A中的最低位
MOV @R1,A;将A中的数暂时存放在R1数值的内存中
DJNZ R3,JJJJ;接收满8位换一个内存
INC R1;对R1中的值加1,换下一个RAM
DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在22H/23H中
MOV A,22H
CPL A;对22H取反后和23H比较
CJNE A,23H,EXIT;如果不等表示接收数据发生错误,放弃
MOV A,22H
MOV NO_OUT,A
;LCALL EEPROM_C ;清除以前的保存的码
;LCALL DL4737
;LCALL EEPROM_W ;把码存在单片机内部的EEPROM里
;LCALL DL4737
CLR P3.6;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
LCALL DL4737
LCALL DL4737
LCALL DL4737
SETB P3.6;蜂鸣器停止
lcall DL4737
EXIT: SETB EA ;允许中断
POP PSW
POP ACC ;将PSW和ACC推入堆栈保护
RETI ;退出解码子程序

;*******************<<LED数码管显示子程序>>**********************
DISPLAY:
MOV A,NO_OUT ;将NO_OUT分成个位和16位
ANL A,#0FH ;取低四位放在a_bit
MOV A_BIT,A ;个位
MOV A,NO_OUT ;
RR A
RR A
RR A
RR A ;四次移动,把高四位移到低四位
ANL A,#0FH;取高四位放在B_bit
MOV B_BIT,A ;个位在b
MOV DPTR,#NUMTAB ;指定查表启始地址
MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV A_NO,A
MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV B_NO,A
DPLOP:MOV A,A_NO
MOV P0,A ;送出个位的7段代码
;SETB P2.1;关闭十位显示,防止鬼影
CLR P2.0 ;开个位显示
LCALL DL40 ;显示4737微秒
SETB P2.0;关闭个位显示,防止鬼影
MOV A,B_NO
MOV P0,A ;送出十位的7段代码
CLR P2.1 ;开十位显示
LCALL DL40 ;显示4737微秒
SETB P2.1;关闭十位显示,防止鬼影
RET
;**********************<<延时程序>>******************************
DL865: MOV R4,#12 ; 1.09*(2R5+4)*R4+2延时子程序1,精确延时865微秒
D1: MOV R5,#31
DJNZ R5,$
DJNZ R4,D1
RET
DL4737: MOV R4,#12 ;延时子程序2,精确延时4737微秒
D2: MOV R5,#179
DJNZ R5,$
DJNZ R4,D2
RET
DL1000: MOV R4,#17;延时程序3,精确延时1000微秒
D3: MOV R5,#25
DJNZ R5,$
DJNZ R4,D3
RET
DL40: MOV R4,#1;延时程序4,精确延时40/17微秒
D4: MOV R5,#1
DJNZ R5,$
DJNZ R4,D4
RET

;****************************************************************
;如果是共阳数码管的显示代码 1-F 16个代码
NUMTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH ;STC新板的
END

Ⅱ 红外遥控器原理 遥控器原理图

遥控器是一种用来远控机械的装置。现代的遥控器,主要是由集成电路电板和用来产生不同讯息的按钮所组成。下面一起来看看红外遥控器原理以及遥控器原理图吧。


红外遥控器原理


红外线遥控系统一般由发射器和接收器两部分组成。发射器由指令键、指令信号产生电路、调制电路、驱动电路及红外线发射器组成。当指令键被按下时,指令信号产生电路便产生所需要的控制信号,控制指令信号经调制电路调制后,最终由驱动电路驱动红外线发射器,发出红外线遥控指令信号。


接收器由红外线接收器件、前置放大电路、解调电路、指令信号检出电路、记忆及驱动电路、执行电路组成。当红外接收器件收到发射器的红外指令信号时,它将红外光信号变成电信号并送到前置放大电路进行放大,再经过解调器后,由信号检出电路将指令信号检出,最后由记忆电路和驱动电路驱动执行电路,实现各种操作。


控制信号一般以某些不同的特征来区分,常用的区分指令信号的特征是频率和码组特征,即用不同的频率或者编码的电信号代表不同的指令信号来实现遥控。所以红外遥控系统通常按照产生和区分控制指令信号的方式和特征分类,常分为频分制红外线遥控和码分制红外线遥控。



1红外遥控系统发射部分


红外遥控发射器由键盘矩阵、遥控专用集成电路、驱动电路和红外发光二极管三部分组成,结构如图1所示。

当有键按下时,系统延时一段时间防止干扰,然后启动振荡器,键编码器取得键码后从ROM中取得相应的指令代码(由0和1组成的代码),遥控器一般采用电池供电,为了节省电量和提高抗干扰能力,指令代码都是经32~56kHz范围内的载波调制后输出到放大电路,驱动红外发射管发射出940nm的红外光。当发送结束时振荡器也关闭,系统处于低功耗休眠状态。载波的频率、调制频率在不同的场合会有不同,不过家用电器多采用的是38kHz的,也就是用455kHz的振荡器经过12分频得到的。


遥控发射器的信号是由一串0和1的二进制代码组成的,不同的芯片对0和1的编码有所不同,现有的红外遥控包括两种方式:脉冲宽度调制(PWW)和脉冲位置调制(PPM或曼彻斯特编码)。两种形式编码的代表分别是NEC和PHILIPS的RC-5。


2红外遥控系统接收部分


接收部分是由放大器、限幅器、带通滤波器、解调器、积分器、比较器等组成的,比如采用较早的红外接收二极管加专用的红外处理电路的方法,如CXA20106,此种方法电路复杂,现在一般不采用。但是在实际应用中,以上所有的电路都集成在一个电路中,也就是我们常说的一体化红外接收头。一体化红外接收头按载波频率的不同,型号也不一样。由于与CPU的接口的问题,大部分接收电路都是反码输出,也就是说当没有红外信号时输出为1,有信号输出时为0,它只有三个引脚,分别是+5V电源、地、信号输出。



系统的设计


1单片机编码发射部分


①键盘部分

红外遥控器的发射器电路比较简单,由一个4×4矩形键盘、一个PNP驱动三极管、一个红外线发光二极管和两个限流电阻组成。要遥控哪台接收器由键盘输入,即由键盘输入要红外遥控的地址,地址经过编码、调制后通过红外发光二极管发射出去。

矩阵键盘部分由16个轻触按键按照4行4列排列,将行线所接的单片机的I/O口作为输出端,而列线所接的作为输入。当没有键被按下时,所有输出端都是高电平,代表没有键按下。有键按下时,则输入线就会被拉抵,这样,通过读入输入线的状态就可以知道是否有键被按下。

键盘的列线接到P1口的低4位,行线接到P1口的高4位,列线P1.0~P1.3设置为输入线,行线P1.4~P1.7设置为输出线。

检测当前是否有键被按下。检测的方法是使P1.4~P1.7输出为0,读取P1.0~P1.3的状态,若P1.0~P1.3为全1,则无键闭合,否则有键闭合。

去除键抖动。当检测到有键按下后,延时一段时间再做下一步检测判断。

若有键按下,应该识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P1.4~P1.7按下面4种组合依次输出1110,1101,1011,0111,在每组行输出时读取P1.0~P1.3,若全为1,则表示0这行没有键输入,否则有键闭合。由此得到闭合键的行值和列值,然后采用计算的方法或者查表的方法将闭合键的行值和列值转换成所定义的值。

为了保证每闭合一次CPU仅作一次处理,必须去除键释放时的抖动。产生的键值放在发送数据库区,30H存放的是产生的键值,即要遥控的8位地址共1字节,31H放的是和30H中的相同的8位地址,地址码重发了一次,主要是加强遥控器的可靠性,如果两次地址码不相同,则说明本帧数据有错,应该丢弃。32H放的是00H(为了编程简单),33H放的是0FFH,一共32位数据。要发送数据时,只要到那里读取数据即可,然后调用发射子程序发送。



②载波部分


根据前面介绍的红外遥控的基本原理,红外遥控器编码调制的方法其实很简单,只要生成一定时间长的电平就可以。再通过一个38kHz载波调制便可以发射编码。载波的产生方法有多种,可以由CMOS门电路RC振荡器构成,或者由555时基电路构成等。

在此次设计中采用的是CPU延时,即用定时器中断完成,用单片机的T0定时产生38kHz载波。设定定时器为方式2,即自动恢复初值的8位计数器。TL0作为8位计数器,TH0作为计数初值寄存器,当TL0计数溢出时,一方面置1溢出标志位TF0,向CPU请求中断,同时将TH0内容送入TL0,使TL0从初值开始重新加1计数。因此,T0工作于方式2,定时精度比较高。根据计算,设定38KHz的定时初值,采用12kHz晶振的定时初值为0F3H,用11.0592kHz晶振时的初值为0F4H,设定好定时器中断,在中断程序中只写入取反P2.0(CPLP2.0),当要发送数据1时,前面560μs高电平发送时,先打开定时器中断,再启动定时器,允许定时器工作,延时560μs再关定时器,后面1690μs的低电平因为不发送信号,所以可以直接置P2.0高电平后,延时1690μs即可;数据0前面的560μs高电平和数据1的一样,后面560μs的低电平因为不发送信号,所以可以直接置P2.0高电平后,延时560μs即可。




2红外接收解码电路


红外遥控接收采用一体化红外接收头,它将红外接收二极管、放大器、解调、整形等电路安装在一起,只有三个引脚。红外接收头的信号输出端接单片机的INT0端,单片机中断INT0在红外脉冲下降沿时产生中断。电路如图3.3所示,图中增加一只PNP三极管对输出信号放大,R和C组成去耦电路抑制电源干扰。


3遥控信号的解码算法


平时,遥控器无键按下时,红外发射二极管不发出信号,遥控接收头输出信号1,有键按下时,0和1的编码的高电平经遥控接收头反相后会输出信号0,由于与单片机的中断脚相连,将会引起单片机中断(单片机预先设定为下降沿产生中断)。


遥控码发射时由9ms的高电平和4.5ms的低电平表示引导码,用560μs的高电平和560μs的低电平表示数据“0”,用560μs的高电平和1690μs的低电平表示数据“1”,引导码后面是4字节的数据。接收码是发射码的反向,所以判断数据中的高电平的长度是读出数据的要点,在这里用882μs(560~1690μs之间)作为标尺,如果882μs之后还是高电平则表示是数据1,将1写入寄存器即可(数据为1时还需要再延时一段时间使电平变低,用来检测下一个低电平的开始)。882μs后电平为低电平则表示是数据0,则将0写入寄存器中,之后再等待下一个低电平的到来。


继续接收下面的数据,当接收到32位数据时,说明一帧数据接收完毕,然后判断本次接收是否有效,如果两次地址码相同并且等于本系统的地址码,数据码和数据反码之和等于0FFH,则接收的本帧数据有效,点亮一只发光二极管,否则丢弃本次接收到的数据。


接收完毕后,初始化本次接收到的数据,准备下次遥控接收。


以上就是小编为大家介绍的遥控器原理,希望能够帮助到您。更多关于遥控器原理的相关资讯,请继续关注土巴兔学装修。

Ⅲ 单片机红外编码

C51程序代码:
#include <AT89X51.h>
static bit OP; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag; //红外发送标志
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
void SendIRdata(char p_irdata);
void delay();
void main(void)
{
count = 0;
flag = 0;
OP = 0;
P3_4 = 0;
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许

TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数
iraddr1=3;
iraddr2=252;

do{
delay();
SendIRdata(12);
}while(1);
}
//定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
P3_4 = OP;
}

void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//发送9ms的起始码
endcount=223;
flag=1;
count=0;
do{}while(count<endcount);
//发送4.5ms的结果码
endcount=117
flag=0;
count=0;
do{}while(count<endcount);
//发送十六位地址的前八位
irdata=iraddr1;
for(i=0;i<8;i++)
{
//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
//停止发送红外信号(即编码中的高电平)
if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
{
endcount=41; //1为宽的高电平
}
else
{
endcount=15; //0为窄的高电平
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送十六位地址的后八位
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送八位数据
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送八位数据的反码
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void delay()
{
int i,j;
for(i=0;i<400;i++)
{
for(j=0;j<100;j++)
{
}
}
}

Ⅳ 单片机控制红外遥控编码解码中定时器和外部中断的作用是什么红外遥控编码解码的大致步骤是什么

同时使用上定时器 跟 外中断 的红外程序,只有解码程序。而且该方式,只能解析 使用不同时间长度代表数据“0”、“1” 的波形(如数据‘1’的时间长度 2倍于数据‘0’的时间)。
解析原理:外部中断接 红外输入,当有 红外信号的时候,该引脚会有波形输入(N多下降沿),触发外部中断,通过记录 每2次中断的时间间隔,可以判断此段时间对应的数据(0/1)。一般“数据”长度为32位数据

注意点:
①初次产生外中断的时候,并无 时间记录,不需要进行时间判断;
②第二次中断与第一次中断 之间 的时间,是 红外的引导码,该时间一般多倍于数据时间(一般为ms级时间);
③第三次中断与第二次中断的时间,即为 第一个数据 的时间;
④第34次中断与第33次中断的时间间隔,即为 第32个数据的时间;
⑤后面 可能存在 停止位,是否存在,由遥控器决定;不过,一般都直接忽略该位,除非该位是由自己制作的遥控器 发出 的校验位;
⑥后面 可能存在 连发码,是否存在,由遥控器决定;
另外:一般红外数据的每个字节都是LSB在前,MSB在后的( 低位先发,高位后发)

软件要处理以下情况:
①干扰的处理,有些红外接收头不仅仅对38KHz频率光有反应,可能对人体红外、日光灯红外一样有反应,那就存在干扰。如果它只产生一次干扰,就会使系统卡在引导码接收阶段;
②引导码时间过短、过长 的处理;
③接收数据位数不足的处理;
④完成32位数据接收后,处理接收烂尾:后面不会有中断(如果需接收停止位、连发码,就增加对应数据长度),需要停止计时。
⑤进行数据校对,一般第一字节跟第二字节互为反码,第三字节跟第四字节互为反码,而且第一字节 代表 一个地址、一个密码,只有地址、密码正确,才能算合法的操作。

Ⅳ c51单片机红外NEC编码解码!

这个程序太简单了,我之前写过红外发射程序的,接收程序也很简单,你这个项目我2个小时都能帮你解决,但是89C52单片机发射38K不准需要把晶振加大,提高单片机的运行速度。
你的项目只要主机A发射红外协议后面加一个地址,单片机B接收的时候全部进入接收状态,判接收的地址是否符合对于单片机B的地址,如果地址符合,那就先回应一个数据例如:55FF55,主机接收到55FF55后后面开始接收数据,把接收到的数据直接写入单片机内EEPRM里面!

Ⅵ 基于51单片机NEC协议红外遥控发送接收仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

基于51单片机NEC协议红外遥控发送接收仿真设计,涉及从硬件到软件的全面实现,包括仿真、程序、原理图、设计报告以及讲解视频。设计旨在模拟红外遥控器的发射和接收功能,并通过Proteus软件进行仿真验证,确保设计符合NEC红外编码协议。此设计采用兼容的51系列单片机,如AT89C51或AT89C52,原理图适用于各种型号的单片机,程序在Keil编译器下编写,采用C语言实现。设计包括以下关键部分:

### 1. 功能概述

设计的核心功能包括模拟红外遥控器发射红外编码和接收机接收并显示编码。发射机发送的编码遵循NEC协议,包括同步码、地址码、命令码等,接收机接收到编码后,使用16进制形式在数码管上显示命令码内容。

### 2. 仿真过程

通过Proteus软件启动仿真工程,设置单片机型号、加载hex文件,开始仿真。仿真过程中,使用示波器观察红外编码信号,显示的顺序与NEC协议相符,如同步码、地址码、命令码等,通过观察示波器数据,验证了设计的编码遵循了协议标准。

### 3. 程序代码

设计提供了使用Keil 4或Keil 5编译器的源代码,代码注释清晰,便于理解发射和接收两部分的功能实现,结合设计报告深入理解代码逻辑。

### 4. 原理图

原理图使用AD软件绘制,为实物设计提供参考。设计中强调了Proteus仿真与实物的区别,包括运行环境、调试方式、电路连接方式以及运行速度等,帮助理解仿真与实际应用的差异。

### 5. 设计报告

报告详细描述了设计的引言、硬件设计、软件设计、软硬件框图、调试过程、总结与展望等内容,是设计实施的全面总结。

### 6. 资源清单与下载链接

设计资料包含仿真文件、程序代码、讲解视频、设计报告、原理图、功能要求、元器件清单、软硬件流程框图等。提供了解决常见使用问题的方法,并提供了一个网盘链接,供用户下载所需资源。

此设计通过Proteus仿真验证了基于51单片机的NEC协议红外遥控发送接收系统的正确性,为学习单片机应用、红外通信技术提供了实践案例。通过详细的文档和资源,旨在帮助学习者深入理解红外遥控技术,掌握单片机编程和电路设计的基本技能。

Ⅶ 单片机红外程序遥控器按一个键之后其他键摁下去没反应是怎么回事

按下时发送正常的编码,发送完毕,若按键依然按下,则发送重复码,重复码和引导码有共同的特点,就是周期短了一些(引导:13.5ms;重复:11.25ms),这个不就可以区分了吗?
只要接收的码周期是13.5,即一组新发送的编码,若是11.25则是重复码,重复码时,则将之前接收到的编码作为本次接收到的编码处理即可

阅读全文

与单片机红外编码程序相关的资料

热点内容
精品php源码 浏览:958
自己编写云服务器抢红包 浏览:201
java解压缩文件加密 浏览:886
dlink打印服务器默认地址 浏览:351
php休眠函数 浏览:371
金蝶如何打开服务器 浏览:764
e4a手游辅助源码 浏览:776
什么app可以实时直播 浏览:105
苹果13的app闪退什么原因 浏览:774
尾盘选股源码公式 浏览:449
php日期运算 浏览:930
天龙八部长歌服务器什么时候开的 浏览:198
鬼泣4模型在那个文件夹 浏览:228
单片机的串行口 浏览:57
phpjson转化为数组 浏览:267
pdf导入excel 浏览:427
苹果xsmax信任app在哪里设置 浏览:52
自动外链php源码 浏览:244
我的世界新手奖励箱命令 浏览:145
linux更新vim 浏览:997