51单片机红外遥控解码好例程

合集下载

c51、c52单片机红外线遥控接收解码c程序(可直接使用)

c51、c52单片机红外线遥控接收解码c程序(可直接使用)

/ 亲,此程序以经过测试,可直接使用!!!/#include <reg51.h>#define uchar unsigned char#define uint unsigned intvoid delay(uchar x);sbit IRIN = P3^2;uchar IRCOM[4];void main(){ IE = 0x81;TCON = 0x01;IRIN=1;/* 此处可以根据按键码自由编写程序/以下为3*7遥控按键码//(也可以应用与其他类型遥控,本程序只以3*7遥控为例)/ / 0x45 0x46 0x47 // 0x44 0x40 0x43 // 0x07 0x15 0x09 // 0x16 0x19 0x0d // 0x0c 0x18 0x5e // 0x08 0x1c 0x5a // 0x42 0x52 0x4a /例如:while(1){switch(IRCOM[2]){case 0x45: P2=0x7f; break;case 0x44: P2=0xbf; break;case 0x07: P2=0xdf; break;case 0x16: P2=0xef; break;case 0x0c: P2=0xf7; break;case 0x08: P2=0xfb; break;case 0x42: P2=0xfd; break;case 0x52: P2=0xfe; break;case 0x4a: P2=0xff; break;case 0x5a: P2=0x00; break;}} */while(1);} //end main/**********************************************************/ void IR_IN(void) interrupt 0 //外部中断服务程序{unsigned char j,k,N=0;EX0 = 0;delay(15);if (IRIN==1){ EX0 =1;return;}//确认IR信号出现while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。

51单片机红外遥控程序

51单片机红外遥控程序
uchar show[2]={0,0};
unsigned long m,Tc;
unsigned char IrOK;
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display()
{
dula=0;
P0=table[show[0]];
MOV R7,#202
DELAY882_A
NOP
NOP
DJNZ R7,DELAY882_A
RET
;=============================1000
DELAY1000 ;1.085x ((229x4)+5)=999.285
MOV R7,#229
DELAY1000_A
NOP
NOP
DJNZ R7,DELAY1000_A
Qq:735491739
红外遥控发射芯片采用PPM编码方式,当发射器按键按下后,将发射一组108ms的编码脉冲。遥控编码脉冲由前导码、8位用户码、8位用户码的反码、8位操作码以及8位操作码的反码组成。通过对用户码的检验,每个遥控器只能控制一个设备动作,这样可以有效地防止多个设备之间的干扰。编码后面还要有编码的反码,用来检验编码接收的正确性,防止误操作,增强系统的可靠性。前导码是一个遥控码的起始部分,由一个9ms的低电平(起始码)和一个4. 5ms的高电平(结果码)组成,作为接受数据的准备脉冲。以脉宽为0. 56ms、周期为1. 12ms的组合表示二进制的“0”;以脉宽为1. 68ms、周期为2. 24ms的组合表示二进制的“1”。如果按键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2. 5ms)组成。

车载红外遥控之51单片机解码

车载红外遥控之51单片机解码

车载红外遥控之51单片机对单片机的了解学习,是作为简单的遥控器解码学习的基础,因为本次DIY 是通过MCU 作为解码媒介的。

但实验中的DIY 方式又不必需要功能强大的ARM 系列单片机去实现,一般0851单片机就能解决。

本实验的演示功能是通过对红外遥控键值解码后,对设定的目标键值做出响应,实验中的响应是单片机对继电器的开合、通断控制,可以简单理解为单片机检测到遥控器某个指定的按键按下,则控制继电器实现开关的切换功能,实现过程如下:首先是选型,由于物资条件,我们考虑成本,所以选择的都是廉价器件,器件有车载MP3红外遥控,1318红外接收头,51系列的stc15F104w芯片,一个11.0592MHZ 的晶振,两个100pf容,一个继电器,一个二极管1N4148,一个三极管9012/S8550,两个200欧姆电阻。

收到的遥控编码信息发送至单片机,单片机对红外遥控的键值解码后在P3.5口输出控制信原理图所示。

最后,实现解码功能的51Figure 1原理图化定时器配置,之后是不断地轮询单片机的中断引脚,检测单片机的引脚状态是否改变,如果引脚状态被改变了,说明端口有数据到来,此时单片机的定时器将在中断中被激活。

定时器被激活的作用是用来给给每个二进制数据位进行定时的,将高低电平状态产生的时间存储到一个数组里面,最后将该时间值数组转换成高低电平状态。

左图是红外遥控采集单片机中断引脚的高低电平时间,并将得到的时间放在irdate 数组里,我们使用的红外遥控的编码是32位的编码。

由引导码、用户码、数据码和数据码反码组成32位的编码方式。

实验测试得到,引导码是有9ms 的高电平和4.5ms 的低电平组成。

用户码或数据码中的每一个位可以是位‘1’,也可以是位‘0’。

区分‘0’和‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式。

英文简写PPM 。

其脉冲调制是使用455KHz 晶体产生的载波脉冲实现。

总结:通过本次实验,了解到了红外遥控编码及解码的工作原理。

51F单片机实现红外遥控器HT6221发射的红外编码解码程序

51F单片机实现红外遥控器HT6221发射的红外编码解码程序
void key4_process(void)
{
delay(10000);
LED = 1;
}
//-------------------------------------------------------------------------------
{
uint t;
t = (uint)a;
t <= 8;
t = t | (uint)b;
return t;
}
//---------------------------------------------------------------------------
//-------------------------------------------------------------------------
//IR RX DECODE ROUTINE
//AUTHER : Xu Sen
//CREATE DATE : May 28. 2007
void key1_process(void)
{
LED = 0;
delay(10000);
}
//----------------------------------------------------------------------------
//DEFINE THE BIT "0 " AND BIT "1" FOR DECODE
#define ST_UP 0xBB8
#define ST_DW 0x792
#define RST_UP 0x792

51单片机红外遥控解码程序

51单片机红外遥控解码程序

51单片机红外遥控解码程序类别:单片机/DSP 阅读:2975编者按:以下是网友编写的遥控解码程序!一种用延时等待的解码方法,比较容易理解,但缺点是占用CPU运行时间,第二种方法用定时器和外中断的解码方法,初学不易理解,但优点也很明显,第二种方法如果能解决连发解码就比较完美,更完善的红外遥控解码程序,请参考本站TOPA V-2008,TOP51-2005所配程序。

解码方法一;//单片机接收红外解读程序\\;硬件结构:8951,P0口数码管段码,P2.0-P2.3为位,P1为8个LED;P3.2为红外接收头,P2.7蜂鸣器,晶振12M;适用UPD6121 6122芯片接收;---------------------------------------------------------ORG 0000HAJMP MAIN ;转入主程序ORG 0003H ;外部中断P3.2脚INT0入口地址AJMP INT ;转入外部中断服务子程序(解码程序);以下为主程序进行CPU中断方式设置MAIN: SETB EA ;打开CPU总中断请求SETB IT0 ;设定INT0的触发方式为脉冲下降沿触发SETB EX0 ;打开INT0中断请求AJMP $;以下为进入P3.2脚外部中断子程序,也就是解码程序INT: CLR EA ;暂时关闭CPU的所有中断请求MOV R6,#10SB: ACALL YS1 ;调用882微秒延时子程序JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高; 电平如果有就退出解码程序DJNZ R6, SB ;重复10次,目的是检测在8820微秒内;如果出现高电平就退出解码程序;以上完成对遥控信号的9000微秒的初始低电平信号的识别。

JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码MOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4;PP: MOV R3,#8JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信;号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU ;如果为0就跳转到UUULCALL YS3;UUU: MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1中DJNZ R3,JJJJ ;接收地址码的高8位INC R1 ;对R1中的值加1,换下一个RAMDJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反; 码,存放在1AH/1BH/1CH/1DH的RAM中MOV A,1CH ;比较数据码和数据反码是否正确?CPL AXRL A,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃,核对数据是否准确JNZ EXITMOV DPTR,#TAB ;表头地址送指针MOV A,1DHANL A,#0FH ;相与,得到低四位码MOVC A,@A+DPTRMOV 1EH,A ;查表得表码存入1EHMOV A,1DHSWAP AANL A,#0FHMOVC A,@A+DPTRMOV 1FH,A ;查表得高四位码存入1FMOV R7,#20HDISP:MOV P0,1FH ;送数码管显示CLR P2.1ACALL YS2SETB P2.1MOV P0,1EHCLR P2.2ACALL YS2SETB P2.2MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来!CLR P2.7 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功LCALL YS2SETB P2.7 ;蜂鸣器停止DJNZ R7,DISPEXIT: SETB EA ;允许中断RETI ;退出解码子程序YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1RETYS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2RETYS3: MOV R4,#2 ;延时程序3,精确延时1000微秒D3:MOV R5,#248DJNZ R5,$DJNZ R4,D3RETTAB: DB 0C0H,0DEH,0A2H,8AH,9CH,89H,81H,0DAH,80H,88H,90H,85H,0E1H,86H,0A1H,0B1H;数据表,0-9-A-FEND解码方法二你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。

用单片机解码红外遥控器

用单片机解码红外遥控器

用单片机解码红外遥控器用单片机解码红外遥控器遥控器使用方便,功能多.目前已广泛应用在电视机、VCD、DVD、空调等各种家用电器中,且价格便宜,市场上非常容易买到。

如果能将遥控器上许多的按键解码出来.用作单片机系统的输入.则解决了常规矩阵键盘线路板过大、布线复杂、占用I/O口过多的弊病。

而且通过使用遥控器,操作时可实现人与设备的分离,从而更加方便使用。

下面以TC9012编码芯片的遥控器为例。

谈谈如何用常用的51系统单片机进行遥控的解码。

一、编码格式1、0和1的编码遥控器发射的信号由一串O和1的二进制代码组成.不同的芯片对0和1的编码有所不同。

通常有曼彻斯特编码和脉冲宽度编码。

TC9012的O和1采用PWM方法编码,即脉冲宽度调制,其O码和1码如图1所示(以遥控接收输出的波形为例)。

O码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms.1码由0.56ms低电平和1.69ms高电平组合而成.脉冲宽度为2.25ms。

在编写解码程序时.通过判断脉冲的宽度,即可得到0或1。

2、按键的编码当我们按下遥控器的按键时,遥控器将发出如图2的一串二进制代码,我们称它为一帧数据。

根据各部分的功能。

可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。

遥控器发射代码时.均是低位在前。

高位在后。

由图2分析可以得到.引导码高电平为4.5ms,低电平为4.5ms。

当接收到此码时.表示一帧数据的开始。

单片机可以准备接收下面的数据。

地址码由8位二进制组成,共256种.图中地址码重发了一次。

主要是加强遥控器的可靠性.如果两次地址码不相同.则说明本帧数据有错.应丢弃。

不同的设备可以拥有不同的地址码.因此。

同种编码的遥控器只要设置地址码不同,也不会相互干扰。

图中的地址码为十六进制的0EH(注意低位在前)。

在同一个遥控器中.所有按键发出的地址码都是相同的。

数据码为8位,可编码256种状态,代表实际所按下的键。

51单片机红外遥控解码,很详细(汇编语言,C语言等)

51单片机红外遥控解码,很详细(汇编语言,C语言等)
//k[i]=TH0;
//i++;
if(TH0<3)
b=1;
else b=0;
TH0=0;
TL0=0;
}
uchar hw_key()
{
uchar j,m;
//i=0;
hw_start(); //等待低电平到来
hw_pulse();
for(j=0;j<24;j++) //测试用户码脉冲宽度
{
hw_pulse();
}
for(j=0;j<8;j++) //测试键码脉冲宽度
{
hw_pulse();
if(b==1)
m=(m<<1)|1;
else
m<<=1;
}
return m; //键码
}
while(in==0); //高电平到了,
TR0=0; //关闭定+;
TH0=0;
TL0=0;
TR0=1; //高电平到了,启动定时器1,测试高电平宽度
while(in==1); //低电平到了,
TR0=0; //关闭定时器1,高电平宽度测试完
请注意甄别内容中的联系方式诱导购买等信息谨防诈骗
51单片机红外遥控解码,很详细(汇编语言,C语言等)
单片机源程序如下:
#include
#define hw_hs0038_ENTITY
#include "hw_hs0038.h"
sbit in=P3^2;
//uchar i=0;
//uchar k[2];
bit bdata b=0;
/*
void timer0(void) interrupt 1 using 1

51单片机红外解码、超声波测距程序(详细解释程序)

51单片机红外解码、超声波测距程序(详细解释程序)

// c51红外解码、超声波测距程序#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define count 4uchar data IRcode[4]; //定义一个4字节的数组用来存储代码uchar table[4];uchar enled[4]={0x1f,0x2f,0x4f,0x8f};uchar CodeTemp,temp,tt; //编码字节缓存变量uchari,j,k,temp,timeH,timeL,succeed_flag,flag,h,h1,h2,a,key,key1,key2; //延时用的循环变量uint distance,distance1,time; //距离,timesbit IRsignal=P3^2; //HS0038接收头OUT端直接连P3.2(INT0)sbit come=P3^3;sbit d=P1^1;//发送码sbit BZ=P1^0;sbit s=P3^7;//38ksbit ss=P3^6;//38kuchar m;// 开关控制//sbit n=P2;//电机反转code unsigned charseg7code[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28}; //显示段码/**************************** 定时器0中断************************/void timer0() interrupt 1{TH0=(65536-count)/256;TL0=(65536-count)%256;s=~s;//产生38K信号ss=~ss;//tt++;//发送超声波个数}/**************************** 延时0.9ms子程序************************/void Delay0_9ms(void){uchar j,k;for(j=18;j>0;j--)for(k=20;k>0;k--);}/***************************延时1ms子程序**********************/void Delay1ms(void){uchar i,j;for(i=2;i>0;i--)for(j=230;j>0;j--);}/***************************延时4.5ms子程序**********************/ void Delay4_5ms(void){uchar i,j;for(i=10;i>0;i--)for(j=225;j>0;j--);}/**************************** 解码延时子程序************************/ void Delay(void){uchar i,j,k;for(i=100;i>0;i--)for(j=100;j>0;j--)for(k=3;k>0;k--);}/**************************** 显示延时子程序************************/ void ledDelay(unsigned int tc) //延时程序{unsigned int i,j;for(i=0;i<10;i++)for(j=0;j<tc;j++);}/************************************************ ****************///定时器1中断,用做超声波测距无回波void timer1() interrupt 3{TR1=0;ET1=0;EX1=0;TH1=0;TL1=0;}/***********************显示程序*********************/ void Led(int date) //显示函数{ int i;table[0]=date/1000;table[1]=date/100%10;table[2]=date/10%10;table[3]=date%10;date=0;for(i=0;i<120;i++){P2=enled[i%4]&m;//P2口高四位控制数码管,低位陪分控制继电器P0=seg7code[table[i%4]]; //取出千位数,查表,输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

if(N>=8)
IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1” N=0;
} }
if(IRCOM[2]!=~IRCOM[3]) {
EX0=1; return; } if(IRCOM[0]!=0x00) { EX0=1; return; } IRCOM[4]=IRCOM[2]&0x0F; IRCOM[5]=IRCOM[2]>>4;
0xc6,0xa1,0x86,0x8e,0xbf};
void delay(uchar x) //x*0.14mS {
uchar i; while(x--) {
for(i=0;i<13;i++) {} } }
void delay1(int ms) {
uchar y; while(ms--) {
for(y=0;y<250;y++) {
P2=0x7f; delay1(1);
P0=(table[IRCOM[5]]); P2=0xbf; delay1(1);
P2=0xff; delay1(1); }
main()
{
IE=0x81;
//
EA=1;
//
EX0=1;
TCON=0x01;
//允许总中断中断,使能 INT0 外部中断 //允许总中断中断 //使能 INT0 外部中断 //触发方式为脉冲负边沿触发
if(IRCOM[2]==0x12)
//DOWN 键
{
IRCOM[2]=0x00;
BEEP=1; //继电器关闭
LED2=0;
delay(100); LED2=1; }
}
}
void IR_IN()interrupt 0 {
uchar j,k,N=0; EX0=0;
delay(15); if(IRIN==1)
{ EX0 =1;
return; }
while(!IRIN) delay(1);
//确认 IR 信号出现 //等 IR 变为高电平,跳过 9ms 的前导低电平信号。
{ 号
for(j=0;j<4;j++) //收集四组数据
for(k=0;k<8;k++)
//每组数据有 8 位
{
while(IRIN) //等 IR 变为低电平,跳过 4.5msRELAY=1;
//I/O 口初始化
P0=0xff; P2=0xff;
play();
while(1) {
if(IRCOM[2]==0x1d) {
IRCOM[2]=0x00; BEEP=0; LED1=0; delay(100); LED1=1; }
//UP 键 //继电器吸合
//红外接收器数据线 //蜂鸣器驱动线 //继电器驱动线
uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,
delay(1);
while(!IRIN) //等 IR 变为高电平
delay(1);
while(IRIN) //计算 IR 高电平时长
{
delay(1);
N++;
if(N>=30)
{
EX0=1;
return;
}
//0.14ms 计数过长自动离开。
}
//高电平计数完毕
IRCOM[j]=IRCOM[j]>>1; //数据最高位补“0”
单片机采用外部中断 INTI 管脚和红外接收头的信号线相连,中断方式为边沿触发方式。 计算中断的间隔时间,来区分前导码、二进制的"1"、"0"码。并将 8 位操作码提取出来在数 码管上显示。 */ // 解码值在 Im[2]中,当 IrOK=1 时解码有效。 /* 51 单片机红外遥控解码程序 */ //用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码
//接收时间是否正确
//比较用户码
//取键码的低四位 //右移 4 次,高四位变为低四位
play(); beep(); EX0=1; }
//51 单片机红外遥控解码
/*红外遥控发射芯片采用 PPM 编码方式,当发射器按键按下后,将发射一组 108ms 的编码脉 冲。 遥控编码脉冲由前导码、8 位用户码、8 位用户码的反码、8 位操作码以及 8 位操作码的反 码组成。 通过对用户码的检验,每个遥控器只能控制一个设备动作,这样可以有效地防止多个设备之 间的干扰。 编码后面还要有编码的反码,用来检验编码接收的正确性,防止误操作,增强系统的可靠性。 暗悸胧且桓鲆?芈氲钠鹗疾糠郑 梢桓?ms 的低电平(起始码)和一个 4. 5ms 的高电平(结果 码)组成? 作为接受数据的准备脉冲。以脉宽为 0. 56ms、周期为 1. 12ms 的组合表示二进制的"0"; 以脉宽为 1. 68ms、 周期为 2. 24ms 的组合表示二进制的"1"。如果按键按下超过 108ms 仍未松开,接下来发射的 代码(连发代码) 将仅由起始码(9ms)和结束码(2. 5ms)组成
_nop_(); _nop_(); _nop_(); _nop_(); } } }
void beep()
{
uchar i;
for(i=0;i<180;i++)
{
delay(6);
BEEP=!BEEP; //BEEP 取反
}
BEEP=1;
//关闭蜂鸣器
}
void play() {
P0=(table[IRCOM[4]]);
#include <reg51.h> #include <intrins.h>
#define uchar unsigned char #define uint unsigned int
sbit IRIN = P3^2; sbit BEEP = P2^4; sbit RELAY= P3^6; sbit LED1 = P2^0; sbit LED2 = P2^1;
相关文档
最新文档