红外摇控HS解码程序合泰C

合集下载

红外遥控原理及解码程序

红外遥控原理及解码程序

红外遥控系统原理及单片机红外线遥控是目前使用最广泛的一种通信和遥控手段。

由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。

工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。

1红外遥控系统通用红外遥控系统由发射和接收两大部分组成。

应用编/解码专用集成电路芯片来进行控制操作,如图1所示。

发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。

图1红外线遥控系统框图2遥控发射器及其编码遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC 的UPD6121G组成发射电路为例说明编码原理(一般家庭用的DVD VCD 音响都使用这种编码方式)。

当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。

这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的0” 以脉宽为0.565ms 、间隔1.685ms 、周期为2.25ms 的组合表示二进制的1 ”,其波形如图2所示。

图2遥控码的0”和1 ” (注:所有波形为接收端的与发射相反)上述0”和1 ”组成的32位二进制码经38kHz 的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。

然后再通过红外发射二极 管产生红外线向空间发射,如图3示。

图3遥控信号编码波形图UPD6121G 产生的遥控编 码是连续 的32位二进制 码组,其中前16 位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干 扰。

该芯片的用户识别码固定为十六进制01H ;后16位为8位操作码(功 能码)及 其反 码。

UPD6121G 最多额128种不同组 合的编码。

红外遥控编码原理及C程序,51单片机红外遥控

红外遥控编码原理及C程序,51单片机红外遥控
break;
case 0x19:j=1;//100+
break;
case 0x0d:k=1;//200+
break;
case 0x16:l=1;//0
break;
case 0x0c:m=1;//1
{
temp=temp>>1; //最先读出的是高位数据
dingshiqi();//定时器记高低电平时间,数据码
if((HighTime>300)&&(HighTime<900)) //说明该位是0
temp=temp&0x7f;
if((HighTime>1200)&&(HighTime<2200)) //说明该位是1
uchar code table1[]={"User Code:"};
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)//i=xms即延时约xms毫秒
for(j=100;j>0;j--);
}
void write_com(uchar com)
{//写液晶命令函数
{
a=0;b=0;c=0;d=0;
e=0;f=0;g=0;h=0;
i=0;j=0;k=0;l=0;
m=0;n=0;o=0;p=0;
q=0;r=0;s=0;t=0;
u=0;
}
void init_1602()
{//初始化函数
uchar num;
lcden=0;
rs=0;
write_com(0x38);//1602液晶初始化
while(1)

红外摇控HS5104解码程序(合泰C)

红外摇控HS5104解码程序(合泰C)
#define ulint unsigned long int
#pragma rambank0
unsigned char rf_addr1;
unsigned char rf_addr2;//12位地址码
unsigned char rf_addr1_old;//
unsigned char rf_addr2_old;
}//2
}//1
else //如果已满足6毫秒电平,则等待起始位
{//003
if(!rf_in)//一收到有低电平,则判为有开始
{
rf_addr1=0;
rf_6ms=0;
rf_b
data=0;
**************************************
void safeguard_init()
{//初始化
_tmr = 0x64;//150毫秒中断一次
_tmrc = 0x91;//内部定时,打开计数 分频比为1:4
................
}
//********************************************************************************************************
//*******************************************************************************************************
_rlc(&amp;rf_addr1);_rlc(&amp;rf_addr2);//修正ADDR2存5位数据 addr1存7位按键码

红外遥控器软件解码及其应用

红外遥控器软件解码及其应用

红外遥控器软件解码及其应用随着现代科技的不断发展,红外遥控器已经成为人们日常生活中的必备工具之一。

不过,很多人并不了解红外遥控器的工作原理以及它是如何通过软件解码来实现遥控效果的。

本文将详细介绍红外遥控器软件解码的相关知识,以及其在实际应用中的作用。

一、红外遥控器的工作原理首先,我们需要了解红外遥控器的工作原理。

简单来说,红外遥控器是一种利用红外线光谱来传输指令的设备,通过在发射端发送编码的红外信号,再在接收端解码后执行相应的指令。

通常,红外遥控器由发射部分与接收部分两个部分组成。

发射部分由红外LED发射器构成,它会通过红外发射现象来发送编码的红外信号。

在接收端,红外接收器则会接收到这些信号,并将其转换成电信号进行解码。

之后,解码器会解析出信号的编码含义,然后执行相应的指令。

这就是红外遥控器的基本工作原理。

二、红外遥控器软件解码的实现在红外遥控器的工作中,软件解码起到了重要的作用。

所谓软件解码,就是在终端设备中运行的一种程序,能够将遥控器发射的红外编码转换成可读的指令。

而这些指令就可以用于控制各种家电、设备等。

软件解码的实现主要有两种方式。

第一种是使用硬件解码器,这需要在终端设备上安装一个专门的硬件解码器,用于解析红外信号,并输出相应的指令。

第二种方法则是使用软件解码器,这需要在终端设备上安装一个软件程序,用于解析红外信号并输出指令。

在软件解码的实现中,最常见的是使用赛贝尔红外编解码库。

这个库已经成为了广泛使用的一种红外编解码方案。

它可以用于各种嵌入式设备、物联网设备、手机、电视机顶盒等多种应用场景中。

三、红外遥控器软件解码的应用目前,红外遥控器软件解码已广泛应用于各种智能家居、物联网设备、工控设备等领域。

下面列举一些具体的应用案例:1、智能家居:通过使用红外遥控器软件解码,可以实现对家中的各种电器、设备的遥控控制。

如电视、空调、照明设备等。

2、物联网设备:红外遥控器软件解码还可以用于物联网设备中,如智能家居中的智能门锁、智能家电等。

红外遥控解码程序

红外遥控解码程序

红外遥控解码程序红外接收头的型号有很多HS0038 VS838等功能⼤致相同,只是引脚封装不同。

红外接收有⼏种统⼀的编码⽅式,采样哪种编码⽅式取决于遥控器使⽤的芯⽚,接收头收到的都是⼀样的。

电视遥控器使⽤的是专⽤集成发射芯⽚来实现遥控码的发射,如东芝TC9012,飞利浦AA3010T等,通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由0和1组成的序列),调制在38KHz的载波上,然后经放⼤、驱动红外发射管将信号发射出去。

不同公司的遥控芯⽚,采样的遥控码格式也不⼀样,较普遍的有两种,⼀种NEC标准,⼀种是PHILIPS标准。

NEC标准:遥控载波的频率为38KHz(占空⽐1:3)当某个键按下时,系统⾸先发射⼀个完整的全码,如果按键超过108ms仍未松开,接下来发射的代码(连发代码)将由起始码(9ms)和结束码(2.5ms)组成。

⼀个完整的全码 = 引导码 +⽤户码 +⽤户码 + 数据码 + 数据码 + 数据反码。

其中,引导码⾼电平9ms,低电平4.5ms;系统码8位,数据码8位,共32位;其中前16位为⽤户识别码,能区别不同的红外遥控设备,以防⽌不同的机种遥控码互相⼲扰。

后16位为8位的操作码和8位的操作反码,⽤于核对数据是否接收准确。

收端根据数据码做出应该执⾏上⾯动作的判断。

连发代码是在持续按键时发送的码。

它告知接收端。

某键是在被连续的按着。

NEC标准下的发射码表⽰发射数据0时⽤”0.56ms⾼电平 + 0.565ms低电平 = 1.125ms”表⽰;数据1⽤”⾼电平0.56ms + 1.69ms = 2.25ms”表⽰。

遥控器发射信号:需要注意的是:当⼀体化接收头收到38kHz红外信号时,输出端输出低电平,否则为⾼电平。

所以⼀体化接收头输出的波形和发射波形是反向的PHILIPS标准:载波频率38KHz:没有筒,点按键时,控制码1和0之间切换,若持续按键,则控制码不变。

⼀个全码 = 起始码’11’ +控制码 + ⽤户码 + ⽤户码数据0⽤“低电平1.778ms + ⾼电平1.778ms”表⽰;数据1⽤“⾼电平1.778ms + 低电平1.778ms”表⽰。

红外解码程序

红外解码程序

红外解码程序本篇介绍红外解码的原理和程序的写法。

下面来看一下,红外线是如何编码的。

下面来具体说一下,解码的原理,每按一下遥控器的一个按键,遥控器就会发出32个“0”“1”代码(当然是通过高低电平的占空比来判断是0还是1的),具体是0,1是如何编码的上面图片中有介绍,和一个引导码,引导码的作用是告诉处理器,接下来将要开始发送代码,我们在编写程序时,当检测到引导码时,就应该准备接受数据了。

32位代码中的前16位是用户识别码,不同的遥控器不相同,防止互相干扰的,后16是8为数据码,和8位数据反码。

接下来开始介绍如何解码程序的编写。

程序中用到了两个中断,一个是定时器中断,一个是外部中断。

定时器中断用来准确计时,判断接受的代码是0还是1,外部中断用来准确确定定电平到来的时刻,然后开始计时。

/*********************************************************函数功能:红外解码,用八位数码管显示红外线的按键码,便于红外控制测试环境:hot 51学习板编译环境:keil4整理人:张家越QQ:435835181整理时间:2011-04-03************************************************************/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code seg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0 x6f,0x77,0x7c,0x39,0x5E,0x79,0x71 };//0-f的段选码unsigned char code seg_we[]={0,1,2,3,4,5,6,7};uchar irtime,startflag,bitnum,irreceok;uchar irdata[33];uchar irprosok;uchar display[8];uchar ircode[8] ;sbit led1=P0^1;sbit led2=P0^2;/******************************************************************** ****函数功能:延时函数,在数码管显示时使用,不需要很精确********************************************************************* ****/void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}/******************************************************************** ******函数的功能:定时器0的初始化********************************************************************* *****/void timer0init(){TMOD=0x02; //设置定时器工作在方式2TH0=0x00; //TL0=0x00; //设置定时器的初值ET0=1; //开定时器中断TR0=1; // 打开定时器EA=1; //开总中断}/******************************************************************** ****外部中断1的初始化********************************************************************* **/void int1init(){IT1=1; //设置触发方式为上升沿EX1=1; //开外部中断1EA=1; //开总中断}/******************************************************************** **定时器0的功能函数,每中断一次irtime++,用于计时********************************************************************* **/void timer0() interrupt 1{irtime++; //定时器中断一次irtime++,用于计时}/******************************************************************** ***外部中断0的处理函数,每当有低电平数据过来时,中断一次,(使用次中断的前提是,信号线必需接在外部中断0上面,也就是P3^2口),函数功能是,把信号从高低电平变成时间的代码放入irdata【】中********************************************************************* ***/void int1() interrupt 2{if(startflag){if(irtime>32) //一组代码检测完毕{bitnum=0;}irdata[bitnum]=irtime; //把检测到的时间送到数组irdata【】中去irtime=0;bitnum++;if(bitnum==33) //如果检测到bitnum=33,说明32位用户码已经检测完毕{bitnum=0; //将bitnum清零以便重新计数irreceok=1; //接收完毕标志位置一}}else //(此函数先进入else语句,跳过引导码的检测){startflag=1; //将开始标志位置一irtime=0; //设置时间初值为零irreceok=1; //接收完毕标志位置一}}/******************************************************************** *****函数功能:把irdata【】中的时间代码转换成二进制代码存放在ircode【】中********************************************************************* *****/void irpros(){uchar k=1,value,j,i;for(j=0;j<4;j++){for(i=0;i<8;i++){value=value>>1; //右移7次(第一次是00,相当于没有移位)if(irdata[k]>6) //循环8次{value=value|0x80;}k++;}ircode[j]=value;}irprosok=1;}/******************************************************************** ********函数的功能是:将ircode【】中的二进制代码转换成为16进制代码便于在数码管上显示******************************************************************* ********/void irwork(){display[0]=ircode[0]/16;display[1]=ircode[0]%16;display[2]=ircode[1]/16;display[3]=ircode[1]%16;display[4]=ircode[2]/16;display[5]=ircode[2]%16;display[6]=ircode[3]/16;display[7]=ircode[3]%16;}/******************************************************************** ****函数功能:用数码管显示解码结果********************************************************************* ***/void display1(){uchar i;for(i=0;i<8;i++){P2=seg_we[i];P0=seg_du[display[i]];delay_50us(40);}}void main(){timer0init(); //定时器初始化int1init(); //外部中断初始化while(1){if(irreceok) //判断数据接收完毕(数组中存储的是高低电平的时间){irpros(); //执行处理函数,将高低电平时间转化成16进制的0,1代码,存放在数组中irreceok=0; //标志清零}if(irprosok) //处理函数执行完毕,{irwork(); //将存储的16进制代码分离,便于数码管显示irprosok=0; //标志清零}display1();}}//在最后我再分析一下程序的编写思路,便于大家理解,一旦有按键按下,接受管接收到引导码,进入外部中断,并将高低电平的时间放入irdata【】数组中,接受完毕标志位置一,判断接受标志位,为1,进行处理函数,将高低电平转换成16进制数,处理标志位置一,判断处理标志位,为1,执行分离函数,将16进制数分离,便于数码管显示,分离完毕后显示。

红外线遥控解码接收程序-C语言

红外线遥控解码接收程序-C语言

红外线遥控解码接收程序-C语言.txt铁饭碗的真实含义不是在一个地方吃一辈子饭,而是一辈子到哪儿都有饭吃。

就算是一坨屎,也有遇见屎壳郎的那天。

所以你大可不必为今天的自己有太多担忧。

红外线遥控解码接收程序-C语言#include <regx51.h>#define uchar unsigned char#define uint unsigned int#define IR_RE P3_2bit k=0; //红外解码判断标志位,为0那么为有效信号,为1那么为无效uchar date[4]={0,0,0,0}; //date数组为存放地址原码,反码,数据原码,反码/*--------------------------延时1ms程子程序-----------------------*/delay1000(){uchar i,j;i=5;do{j=95;do{j--;}while(j);i--;}while(i);}/*---------------------------延时882us子程序-----------------------*/delay882(){uchar i,j;i=6;do{j=71;do{j--;}while(j);i--;}while(i);}/*--------------------------延时2400us程子程序-----------------------*/delay2400(){uchar i,j;i=5;do{j=237;do{j--;}while(j);i--;}while(i);}//**************************************************************//**************************************************************/*----------------------------------------------------------*//*-----------------------红外解码程序(核心)-----------------*//*----------------------------------------------------------*/void IR_decode(){uchar i,j;while(IR_RE==0);delay2400();{delay1000();delay1000();for(i=0;i<4;i++){for(j=0;j<8;j++){while(IR_RE==0); //等待地址码第1位高电平到来delay882(); //延时882us判断此时引脚电平///CY=IR_RE;if(IR_RE==0){date[i]>>=1;date[i]=date[i]|0x00;}else if(IR_RE==1){delay1000();date[i]>>=1;date[i]=date[i]|0x80;}} //1位数据接收完毕} //32位二进制码接收完毕}}//*****************************************************************//********************************************************************/*------------------------外部中断0程序-------------------------*//*------------------主要用于处理红外遥控键值--------------------*/void int0() interrupt 0{uchar i;k=0;EX0=0; //检测到有效信号关中断,防止干扰for(i=0;i<4;i++){delay1000();if(IR_RE==1){k=1;} //刚开场为9ms的引导码. }if(k==0){// EX0=0; //检测到有效信号关中断,防止干扰IR_decode(); //如果接收到的是有效信号,那么调用解码程序P0=date[1];delay2400();delay2400();delay2400();}EX0=1; //开外部中断,允许新的遥控按键}//*********************************************************************//********************************void main(){SP=0x60; //堆栈指针EX0=1; //允许外部中断0,用于检测红外遥控器按键EA=1; //总中断开while(1);}总结:关于本段程序的准确延时在<<C51中准确的延时与计算的实现>>里的评论有很好的诠释.//在STC12C5410上运用红外线解码程序.主要的问题在于延迟上。

合泰单片机编写遥控器程序

合泰单片机编写遥控器程序
HOLTEK SEMICONDUCTOR INC.
❖ 红外线遥控接收
4) 每次正确的按键接收,蜂鸣器响一声提示。蜂鸣器 有两种办法实现,一种是I/O直接驱动,用子程序来驱 动。另一种是用芯片本身的功能BZ,用定时器的溢出做 蜂鸣器时钟源。 特别注意二者的Configuration Option 选项不同。
HOLTEK SEMICONDUCTOR INC.
❖ 红外线遥控接收
1. HT6221应用的简单说明 1)HT6221的标准应用电路,如图36
图36
HOLTEK SEMICONDUCTOR INC.
❖ 红外线遥控接收
2)根据试验简化电路,如图37
图37
HOLTEK SEMICONDUCTOR INC.
❖ 红外线遥控接收
3) 试验电路的遥控地址A0~A15的计算,如图38
理论计算的结果:
图38
A15 A14 A13 A12 A11 A10 A09 A08 A07 A06 A05 A04 A03 A02 A01 A00
1111111100000000
ADDRH= FFH ADDRL= 00H
HOLTEK SEMICONDUCTOR INC.
图42
HOLTEK SEMICONDUCTOR INC.
❖ 红外线遥控接收
图43
HOLTEK SEMICONDUCTOR INC.
❖ 红外线遥控接收
4. 用定时器溢出做蜂鸣器驱动 1)Configuration Option 选项
MCU Name : HT48R30A-1 -------------------------------------------------------Oscillator : external crystal WDT : Disable LVR : Disable CLR WDT : One clear instruction PA Pull high : Enable input type PA: Schmitt Trigger PB Pull high : Enable PC Pull high : Enable PG Pull high : Enable

红外遥控器软件解码原理和程序

红外遥控器软件解码原理和程序

void rs232(void) interrupt 4{ static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2; //sbuf1,sbuf2 用来接收 发送临时用,rsbuf1,rsbuf2 用来分别用来存放接收发送的半字节 EA=0; //禁止中断 if(RI){ RI=0; //清除接收中断标志位 sbuf1=SBUF; //将接收缓冲的字符复制到 sbuf1 if(sbuf1==HEAD){ //判断是否帧开头 state1=10; //是则把 state 赋值为 10 buf1=RECEIVE; //初始化接收地 址 } else{
void tf_2(void); void read_ir(void); void ir_jiema(void); void ir_init(void); void ir_exit(void); void store_ir(void); void read_key(void); void reset_iic(void); unsigned char read_byte_ack_iic(void); unsigned char read_byte_nack_iic(void); bit write_byte_iic(unsigned char a); void send_ack_iic(void); void send_nack_ic(void); bit receive_ack_iic(void); void start_iic(void); void stop_iic(void); void write_key_data(unsigned char a); unsigned int read_key_data(unsigned char a); void ie0(void) interrupt 0{ie_0();} void tf0(void) interrupt 1{tf_0();} void ie1(void) interrupt 2{ie_1();} void tf1(void) interrupt 3{tf_1();tf_2();} void tf2(void) interrupt 5{ //采用中断方式跟查询方式相结合的办法解 码 EA=0; //禁止中断 if(TF2){ //判断是否是溢出还是电平变化产生的中断 TF2=0; //如果是溢出产生的中断则清除溢出位,重 新开放中断退出 EA=1; goto end; } EXF2=0; //清除电平变化产生的中断位 *ir=RCAP2H; //把捕捉的数保存起来 ir++; *ir=RCAP2L; *ir++; F0=1; TR0=1; //开启计数器 0 loop: TL0=0; //将计数器 0 重新置为零 TH0=0; while(!EXF2){ //查询等待 EXF2 变为 1 if(TF0)goto exit; //检查有没超时,如果超时则退出 };

红外遥控器解码程序

红外遥控器解码程序

//===================================================================== //// 红外遥控器解码程序演示//// 本程序主要将现在比较常用TX1300遥控器进行解码,将解码后的数据通过P2端////口的数码管显示出来,为了更好的看到运行过程,特加了三个指示灯用来指示当////前运行状态.P10主要用来闪亮,表示程序正在运行,P11则用来表示接收到数据, ////P12表示触发内部的定时器操作.P13的闪亮表示正确接收完一个数据. //// 程序运行效果: 打开本机电源开关,可以看到P10不停的闪动,按下遥控器的数////字键,数码管则显示相应的数字键(1-9).可以看到P11,P12在显示后呈亮状态.则////可以接收下一个数据,在上面过程中可以看到P13闪亮了一下.表明上次正确接收////到数据. ////---------------------------------------------------------------------//// 开发日期: 2009/01/30 研发单位:上海腾芯实业有限公司//#include <reg52.h> //包含51单片机相关的头文件#define uint unsigned int //重定义无符号整数类型#define uchar unsigned char //重定义无符号字符类型uchar code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定义数码管显示数据0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9uchar code RecvData[]={0x07,0x0A,0x1B,0x1F,0x0C,0x0D,0x0E,0x00,0x0F,0x19};uchar IRCOM[7];static unsigned int LedFlash; //定义闪动频率计数变量unsigned char RunFlag=0; //定义运行标志位bit EnableLight=0; //定义指示灯使能位/***********完成基本数据变量定义**************/sbit S1State=P1^0; //定义S1状态标志位sbit S2State=P1^1; //定义S2状态标志位sbit B1State=P1^2; //定义B1状态标志位sbit IRState=P1^3; //定义IR状态标志位sbit RunStopState=P1^4; //定义运行停止标志位sbit FontIRState=P1^5; //定义FontIR状态标志位sbit LeftIRState=P1^6; //定义LeftIR状态标志位sbit RightIRState=P1^7; //定义RightIRState状态标志位/*************完成状态指示灯定义*************/sbit S1=P3^2; //定义S1按键端口sbit S2=P3^4; //定义S2按键端口/*************完成按键端口的定义*************/sbit LeftLed=P2^0; //定义前方左侧指示灯端口sbit RightLed=P0^7; //定义前方右侧指示灯端口/*************完成前方指示灯端口定义*********/sbit LeftIR=P3^5; //定义前方左侧红外探头sbit RightIR=P3^6; //定义前主右侧红外探头sbit FontIR=P3^7; //定义正前方红外探头/*************完成红外探头端口定义***********/sbit M1A=P0^0; //定义电机1正向端口sbit M1B=P0^1; //定义电机1反向端口sbit M2A=P0^2; //定义电机2正向端口sbit M2B=P0^3; //定义电机2反向端口/*************完成电机端口定义***************/sbit B1=P0^4; //定义话筒传感器端口sbit RL1=P0^5; //定义光敏电阻端口sbit SB1=P0^6; //定义蜂鸣端口/*********完成话筒,光敏电阻,蜂鸣器.端口定义**/sbit IRIN=P3^3; //定义红外接收端口/*********完成红外接收端口的定义*************/#define ShowPort P2 //定义数码管显示端口extern void ControlCar(uchar CarType); //声明小车控制子程序void delayms(unsigned char x) //0.14mS延时程序{unsigned char i; //定义临时变量while(x--) //延时时间循环{for (i = 0; i<13; i++) {} //14mS延时}}void Delay() //定义延时子程序{ uint DelayTime=30000; //定义延时时间变量while(DelayTime--); //开始进行延时循环return; //子程序返回}void IR_IN() interrupt 2 using 0 //定义INT2外部中断函数{unsigned char j,k,N=0; //定义临时接收变量EX1 = 0; //关闭外部中断,防止再有信号到达delayms(15); //延时时间,进行红外消抖if (IRIN==1) //判断红外信号是否消失{EX1 =1; //外部中断开return; //返回}while (!IRIN) //等IR变为高电平,跳过9ms 的前导低电平信号。

红外遥控器解码程序

红外遥控器解码程序

红外线遥控器在家用电器和工业控制系统中已得到广泛应用,了解他们的工作原理和性能、进一步自制红外遥控系统,也并非难事。

1.红外线的特点人的眼睛能看到的可见光,若按波长排列,依次(从长到短)为红、橙、黄、绿、青、蓝、紫,如图1所示。

由图可见,红光的波长范围为0.62μm~0.76μm,比红光波长还长的光叫红外线。

红外线遥控器就是利用波长0.76μm~1.5μm之间的近红外线来传送控制信号的。

红外线的特点是不干扰其他电器设备工作,也不会影响周边环境。

电路调试简单,若对发射信号进行编码,可实现多路红外遥控功能。

2.红外线发射和接收人们见到的红外遥控系统分为发射和接收两部分。

发射部分的发射元件为红外发光二极管,它发出的是红外线而不是可见光,如图2所示。

常用的红外发光二极管发出的红外线波长为940nm左右,外形与普通φ5mm发光二极管相同,只是颜色不同。

一般有透明、黑色和深蓝色等三种。

判断红外发光二极管的好坏与判断普通二极管一样的方法。

单只红外发光二极管的发射功率约100mW。

红外发光二极管的发光效率需用专用仪器测定,而业余条件下,只能凭经验用拉距法进行粗略判定。

接收电路的红外接收管是一种光敏二极管,使用时要给红外接收二极管加反向偏压,它才能正常工作而获得高的灵敏度。

红外接收二极管一般有圆形和方形两种。

由于红外发光二极管的发射功率较小,红外接收二极管收到的信号较弱,所以接收端就要增加高增益放大电路。

然而现在不论是业余制作或正式的产品,大都采用成品的一体化接收头,如图3所示。

红外线一体化接收头是集红外接收、放大、滤波和比较器输出等的模块,性能稳定、可靠。

所以,有了一体化接收头,人们不再制作接收放大电路,这样红外接收电路不仅简单而且可靠性大大提高。

图3是常用两种红外接收头的外形,均有三只引脚,即电源正VDD、电源负(GND)和数据输出(Out)。

接收头的引脚排列因型号不同而不尽相同,图3列出了因接收头的外形不同而引脚的区别。

红外遥控编码原理及C程序,51单片机红外遥控

红外遥控编码原理及C程序,51单片机红外遥控

红外遥控解解码程序#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit lcden=P1^0;sbit rs=P1^2;sbit ir=P3^2;sbit led=P1^3;sbit led2=P3^7;unsigned int LowTime,HighTime,x;unsigned char a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;unsigned char flag;//中断进入标志位uchar z[4];uchar code table[]={"husidonghahahah"};uchar code table1[]={"User Code:"};void delay(uint x){uint i,j;for(i=x;i>0;i--) //i=xms即延时约xms毫秒for(j=100;j>0;j--);}void write_com(uchar com){//写液晶命令函数rs=0;lcden=0;P2=com;delay(3);lcden=1;delay(3);lcden=0;}void write_date(uchar date){//写液晶数据函数rs=1;lcden=0;P2=date;delay(3);lcden=1;delay(3);lcden=0;}void init_anjian() //初始化按键{a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;j=0;k=0;l=0;m=0;n=0;o=0;p=0;q=0;r=0;s=0;t=0;u=0;}void init_1602(){//初始化函数uchar num;lcden=0;rs=0;write_com(0x38);//1602液晶初始化write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<14;num++)//写入液晶固定部分显示{write_date(table[num]);delay(3);}write_com(0x80+0x40);for(num=0;num<9;num++){write_date(table1[num]);delay(3);}}void write_dianya(uchar add,char date){//1602液晶刷新时分秒函数4为时,7为分,10为秒char shi,ge;shi=date%100/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void dingshiqi() //定时器记高低电平时间{TH0=0; //定时器高八位置0TL0=0; //定时器低八位置0TR0=1; //开启定时器0while(ir==0); //如果是低电平就等待,给低电平计时TR0=0; //关闭定时器T0LowTime=TH0*256+TL0; //保存低电平时间TH0=0; //定时器高八位置0TL0=0; //定时器低八位置0TR0=1; //开启定时器0while(ir==1); //如果是高电平就等待,给引导码高电平计时TR0=0; //关闭定时器T0HighTime=TH0*256+TL0; //保存高电平长度}void main(){char i=0;TMOD=0x01; //定时器T0作为定时模式ET0=1; //开T0中断IT0=0; //外部中断,下降沿触发EX0=1; //开外部中断EA=1; //开总中断init_1602();while(1){}}void inter0() interrupt 0 //开始解码{EX0=0; //关闭外部中断0,不再接受红外信号,只解码当前的红外信号。

C语言写的红外遥控解码程序

C语言写的红外遥控解码程序

C语言写的红外遥控解码程序#include “STC89C51RC.H”sbit DQ = P4;sb it SPK = P1;#include absacc.h#define seg1 XBYTE[0xffec]#define seg2 XBYTE[0xffed]#define seg3 XBYTE[0xffee]#define seg4 XBYTE[0xffef]unsigned char IRMcode[4];unsigned char code ledmap[]=//共阴LED 数码管译码表{0x3f,0x06,0x5b,0x4f,0x66,//0,1,2,3,4,0x6d,0x7d,0x07,0x7f,0x6f,//5,6,7,8,9,0x77,0x 7C,0x39,0x5E,0x79,//A,b,C,d,E,0x71,//F,};void delay(unsigned int);void main(){EA = 1;EX2 = 1; while(1){if (IRMcode[2]==~IRMcode[3]){seg1 = ~ledmap[IRMcode[2]/100];seg2 = ~ledmap[IRMcode[2]/10%10];seg3 = ~ledmap[IRMcode[2]%10];seg4 = 0xff;//熄灭}}}void Sound(void){SPK = 0;delay(10000);SPK = 1;}void IRMint(void) interrupt 6 using 2{unsigned char count;unsigned int count1;unsigned char i,j;EA = 0;count = 9;while(-- count){delay(100);//440usif(DQ){EA = 1;return;}}while(DQ==0);//通过引导码余下的低电平//以上完成引导码4.5ms 的低电平检测count = 9;count1 = 0;while(-- count){delay(100);//440usif(DQ==0){EA = 1;return;}}while(DQ==1)//通过引导码余下的高电平{ if(count1++1000) {P1=0x55;EA = 1;return;}}//以上完成引导码4.5ms 的高电平检测count1 = 0;for(j=0;j4;j++)//有效字节数设定{for(i=0;i8;i++)//字节bit 数{while(DQ==0);//通过编码低电平delay(200);//延时判断编码高电平维持长度IRMcode[j]=1;if(DQ)IRMcode[j]|=0x01;while(DQ==1){//通过编码余下的。

万能遥控器红外解码C程序

万能遥控器红外解码C程序

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--) ;
if(IRsignal==1) //如果IRsignal是"1",则向右移入一位"1"
{Delay1ms();
CodeTemp=CodeTemp|0x80;
if(j<8) CodeTemp=CodeTemp>>1;
}
else
if(j<8)CodeTemp=CodeTemp>>1;//如果IRsignal是"0",则向右移一位,自动补"0"
{while(IRsignal==0);
Delay4_5ms();
//跳过持续4.5ms的高电平
for(i=0;i<4;i++)
//分别读取4个字节
{for(j=1;j<=8;j++)
//每个字节8个bit的判断
{ while(IRsignal==0);
//等待上升沿
Delay0_9ms();
//从上升沿那一时刻开始延时0.9ms,再判断IRsignal
/* 前16位为8位用户码及其反码,后16位为8位的操作码及其反码
*/
/* 以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示"0"; */

红外遥控的C程序

红外遥控的C程序

红外遥控的C程序红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.引导码是告诉接收机准备接收红外遥控码.系统码是识别码,不同的遥控芯片有不同的误别码,以免搞错.遥控器上不同的按键有不同的键码,系统码和键码都是16位码,8位正码,8位反码.如SC6122的系统码是FF00,FF和00互为反码,键码1为EF10也是互为反码.关于SC6122的资料在我们的网页资料下载上有.SC6122的引导码为低电平为9000微秒,高电平为4500微秒.当然高电平不可能精确为9000微秒,在8000微秒到10000微秒都看作是正常范围,低电平在4000-5000之间都看作是正常范围.引导码后的32位编码(16位系统码和16位键码)不管高低电平,载波时间都是560微秒,但低电平持续时间是1125微秒,高电平持续时间是2250微秒,所以低电平除去载波时间大约是560微秒,高电平除去载波时间大约是1680微秒.低电平也有一个波动范围,在400-700之间都看作是正常的,具体多少可以通过示波器测量出来.高电平也有一个波动范围,在400-2000之间都看作是正常的,具体多少也是根据经验.当然范围越宽,捕捉红外线的范围也越宽,越精确.在捕捉到有高低电平之间,在560-1680之间取一个中间值1120微秒,认为小于1120微秒是低电平,大于1120微秒是高电平.下面有两个经过实践能在实验板上显示键码的程序,一个是汇编写的,一个是用C写的,与大家一起探讨遥控器.以下程序能在LCD上显示系统码和键码,按不同的按键,系统码不变,变的是键码.有不懂的地方可以在留言本上留言.RS EQU P2.5 ;这几个是LCD引脚.RW EQU P2.6E EQU P2.7IRR EQU P3.3 ;红外接收的输出接P3.3.BUF EQU 30H ;30H-33H保存解码结果;=============================================ORG 0000HAJMP MAIN;=============================================ORG 0030HMAIN:MOV SP,#70H ;堆栈指针设到70H的地方ACALL INIT_LCD ;初始化LCDMOV R7,#10ACALL DELAY_MSMOV DPTR,#MSG1CALL DISPLAY_LINE1 ;在第一行显示Test8: IR ReaderMOV DPTR,#MSG2CALL DISPLAY_LINE2 ;在第二行显示MAIN_LOOP:JB IRR,$ ;等待接收头信号为低ACALL GET_LOW ;测量引导脉冲低电平CLR CMOV A,R7SUBB A,#(8000/50) ;SC6122的引导脉冲低电平为9000US,我们只要测到低电平的值在8000-10000US范围内就认为合格的.JC MAIN_LOOP ;如果小于8000US,不对,重新等待接收CLR CMOV A,R7SUBB A,#(10000/50)JNC MAIN_LOOPACALL GET_HIGH ;测量引导脉冲高电平CLR CMOV A,R7SUBB A,#(4000/50)JC MAIN_LOOP ;如果小于4000US,不对,重新等待接收CLR CMOV A,R7SUBB A,#(5000/50)JNC MAIN_LOOP ;如果大于5000US,不对,重新等待接收MOV R0,#BUF ;MOV R5,#8 ;SC6122发的码有32位,我们用4个字节来存放,每个字节有8位IR_NEXT:CALL GET_LOWCLR CMOV A,R7SUBB A,#(300/50) ;300USJC MAIN_LOOP ;低电平小于300微秒认为不对,重新接收CLR CMOV A,R7SUBB A,#(800/50) ;800USJNC MAIN_LOOP ;低电平大于800微秒认为不对,重新接收ACALL GET_HIGHCLR CMOV A,R7SUBB A,#(300/50) ;300USJC MAIN_LOOP ;高电平小于300微秒认为不对,重新接收CLR CMOV A,R7SUBB A,#(2000/50) ;2000USJNC MAIN_LOOP ;高电平大于2000微秒认为不对,重新接收CLR CMOV A,R7SUBB A,#(1120/50) ; ;跟中间值1120进行比较RRC AMOV @R0,A ;通过CY移到间接地址R0中去DJNZ R5,IR_NEXT ;8位移完了吗MOV R5,#8INC R0MOV A,R0XRL A,#(BUF+4)JNZ IR_NEXT ;如果不到4个字节,接收下一个MOV DPTR,#MSG_6122ACALL DISPLAY_LINE1 ;显示格式名称ACALL DISPLAY_IR_CODE ;显示码AJMP MAIN_LOOP;============================================ MSG1: DB " Test8: IR Reader "MSG2: DB " "MSG_6122: DB " Format: SC6122 ";============================================ ;转为ASCII码在LCD在显示TO_ASCII:CJNE A,#0AH,TO_ASCII_1TO_ASCII_1:JC TO_ASCII_2 ;小于10ADD A,#('A'-10)RETTO_ASCII_2:ADD A,#'0'RET;============================================DISPLAY_IR_CODE:MOV A,#0C0H ;显示在第二行ACALL SEND_COMMAND_BYTE ;设置DDRAM地址MOV R0,#BUFDISPLAY_IR_CODE_NEXT:MOV A,@R0SWAP AANL A,#0FH ;分离出高字节ACALL TO_ASCII ;转为ASCII码ACALL SEND_DATA_BYTE ;显示MOV A,@R0ANL A,#0FH ;分离出低字节ACALL TO_ASCII ;转为ASCII码ACALL SEND_DATA_BYTE ;显示MOV A,#' 'ACALL SEND_DATA_BYTE ;显示空格INC R0MOV A,R0XRL A,#(BUF+4)JNZ DISPLAY_IR_CODE_NEXTMOV R0,#8 ;第2行共有20个字符,前面显示用了12个,再用8个空格填满DISPLAY_IR_CODE_B:MOV A,#' 'ACALL SEND_DATA_BYTEDJNZ R0,DISPLAY_IR_CODE_BRET;============================================;测量低电平时间,50US采样一次,R7加1一次,比如低电平时间为9000US,测得R7的结果为180(0B4H) ;OUTPUT: R7GET_LOW:MOV R7,#00HGET_LOW_NEXT:MOV R6,#20 ;在晶振为11.0592M时,延50US需要46个机器周期,DJNZ R6,$ ;这条指令执行需要2个机器周期JB IRR,GET_LOW_RTN ;接收头为高电平,结束测量INC R7MOV A,R7JNZ GET_LOW_NEXT ;看R7是否有溢出GET_LOW_RTN:RET;============================================;测量高电平时间,50US采样一次,R7加1一次,比如高电平时间为4500US,测得R7的结果为90;OUTPUT: R7GET_HIGH:MOV R7,#00HGET_HIGH_NEXT:MOV R6,#20 ;在晶振为11.0592M时,延50US需要46个机器周期,DJNZ R6,$ ;这条指令执行需要2个机器周期JNB IRR,GET_HIGH_RTN ;接收头为低电平,结束测量INC R7MOV A,R7JNZ GET_HIGH_NEXT ;看R7是否有溢出GET_HIGH_RTN:RET;============================================ ;============================================DELAY_MS:MOV R6,#250DELAY_MS_NEXT:NOPNOPDJNZ R6,DELAY_MS_NEXTDJNZ R7,DELAY_MSRET;============================================ ;INPUT: R7DELAY:DJNZ R7,$RET;============================================ ;向LCD写一个命令字节;INPUT: ACCSEND_COMMAND_BYTE:CLR RSCLR RWMOV P0,ASETB ENOPNOPNOPNOPNOPNOPCLR EMOV R7,#100ACALL DELAYRET;=============================================== ;向LCD写一个数据字节;INPUT: ACCSEND_DATA_BYTE:SETB RSCLR RWMOV P0,ASETB ENOPNOPNOPNOPNOPNOPCLR EMOV R7,#100ACALL DELAYRET;====================================================== ;初始化LCDINIT_LCD:MOV A,#30HACALL SEND_COMMAND_BYTEACALL SEND_COMMAND_BYTEACALL SEND_COMMAND_BYTEMOV A,#38H ;设置工作方式ACALL SEND_COMMAND_BYTEMOV A,#0CH ;显示状态设置ACALL SEND_COMMAND_BYTEMOV A,#01H ;清屏ACALL SEND_COMMAND_BYTEMOV A,#06H ;输入方式设置ACALL SEND_COMMAND_BYTERET;======================================================= ;在第一行显示;INPUT: DPTR指向要显示的内容DISPLAY_LINE1:MOV A,#080HDISPLAY_LINE1_A:ACALL SEND_COMMAND_BYTE ;设置DDRAM地址MOV R6,#20DISPLAY_LINE1_NEXT:CLR AMOVC A,@A+DPTRACALL SEND_DATA_BYTEINC DPTRDJNZ R6,DISPLAY_LINE1_NEXTMOV R7,#100ACALL DELAYRET;=======================================================;在第二行显示;INPUT: DPTR指向要显示的内容DISPLAY_LINE2:MOV A,#0C0HAJMP DISPLAY_LINE1_A;=======================================================END下面是一个用C写的遥控器程序.能在数码管上显示键码.#include <reg52.h>#define c(x) (x*110592/120000)sbit Ir_Pin=P3^3;unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F. unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7};unsigned char Led_Buf[4]; //显示缓冲区char Led_Index; //位选unsigned char Ir_Buf[4]; //用于保存解码结果//==============================================================//数码管扫描timer0() interrupt 1 using 1{TL0=65536-1000;TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描P0=0xff;P2=Led_Sel[Led_Index]; //位选P0=Led_Tab[Led_Buf[Led_Index]]; //段选if(++Led_Index>3) Led_Index=0; //四个扫描完了,到第一个数码管}//============================================================== unsigned int Ir_Get_Low(){TL1=0;TH1=0;TR1=1;while(!Ir_Pin && (TH1&0x80)==0);TR1=0;return TH1*256+TL1;}//============================================================= unsigned int Ir_Get_High(){TL1=0;TH1=0;TR1=1;while(Ir_Pin && (TH1&0x80)==0);TR1=0;return TH1*256+TL1;}//============================================================== main(){unsigned int temp;char i,j;Led_Index=1;TMOD=0x11;TL0=65536-1000;TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描EA=1;ET0=1;TR0=1;Led_Buf[0]=0;Led_Buf[1]=0;Led_Buf[2]=0;Led_Buf[3]=0; //显示区设成0do{restart:while(Ir_Pin);temp=Ir_Get_Low();if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000temp=Ir_Get_High();if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500for(i=0;i<4;i++) //4个字节for(j=0;j<8;j++) //每个字节8位{temp=Ir_Get_Low();if(temp<c(200) || temp>c(800)) goto restart; temp=Ir_Get_High();if(temp<c(200) || temp>c(2000)) goto restart; Ir_Buf[i]>>=1;if(temp>c(1120)) Ir_Buf[i]|=0x80;}Led_Buf[0]=Ir_Buf[2]&0xf;Led_Buf[1]=(Ir_Buf[2]/16)&0xf;Led_Buf[2]=Ir_Buf[3]&0xf;Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果}while(1);}。

单片机红外线遥控器解码程序

单片机红外线遥控器解码程序

单片机红外线遥控器解码程序
红外线遥控是目前使用最广泛的一种通信和遥控手段。

由于红外线遥控装
置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外
线遥控。

现在工业设备中,也已经广泛在使用。

1 红外遥控系统
通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯
片来进行控制操作,如图1 所示。

发射部分包括键盘矩阵、编码调制、LED 红
外发送器;接收部分包括光、电转换放大器、解调、解码电路。

2 遥控发射器及其编码
遥控发射器专用芯片很多,根据编码格式可以分成脉冲宽度调制和脉冲相位
调制两大类,这里我们以运用比较广泛,解码比较容易的脉冲宽度调制来加以
说明,现以3310 组成发射电路为例说明编码原理。

当发射器按键按下后,即
有遥控码发出,所按的键不同遥控编码也不同。

这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”
上述“0”和“1”组成的42 位二进制码经38kHz 的载频进行二次调制以提高发
射效率,达到降低电源功耗的目的。

然后再通过红外发射二极管产生红外线向
空间发射,
3310 产生的遥控编码是连续的42 位二进制码组,其中前26 位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。

后16 位为8 位
的操作码和8 位的操作反码用于核对数据是否接收准确。

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

红外摇控HS解码程序(合泰C)
红外摇控HS5104解码程序(合泰C)
现在市面上,风扇摇控器都用HS5104作编码芯片,关键是以低格占据市场。

用过HS5104的朋友都知道,它的工作电压比较高,在低电压3V以下工作时,经常会出错,很多朋友都说HS5104的接收程序不稳定。

其实,大多数是HS5104工作不稳定引起的,只要你接收程序合理,多接收几次作比较,码宽的变动变化率允许大一点(我的程序允许码宽变动在百分之三十),然后再保证HS5104的工作电压在3V以上,那肯定是没问题的。

下面一段程序,之所以接收程序会那么复杂,是针对HS5104不稳定而设计的。

它放在中断里进行,希望能给使用合泰C开发的朋友提供参考,或者下载后稍作修改便可实现功能调试。

//***********红外摇控ht48r05A-1 &amp; HS5104
//***********Make in QUSUN at 2008-01-18
//**********LCSOME**********************
#include &lt;HT48R06A-1.h&gt;
#pragma vector isr_4 @ 0x4
#pragma vector isr_8 @ 0x8
#define uchar unsigned char
#define ulint unsigned long int
#pragma rambank0
unsigned char rf_addr1;
unsigned char rf_addr2;//12位地址码
unsigned char rf_addr1_old;//
unsigned char rf_addr2_old;
unsigned char rf_cont;//接收次数,判断长按
unsigned char rf_bitsum;//接收到的数据位的计数器
unsigned char rf_0_sum;//接收到0的个数计数器
unsigned char rf_mksum;//码宽计数器
uchar time_s;//秒计数器
uchar time_ms;//毫秒计数器
uchar time_us;//微秒计数器
//*
bit rf_sta;//起始位有效标志1=有效
bit rf_bdata;//前一个接收检测电平
bit rf_ture;//接收成功标志1=有效
bit rf_6ms ;//6毫秒低电平指示,1有效
#define rf_in _pc1 //接收数据输入端
#define rf_1_sum rf_0_sum
#define SPEAKER _pb2
//***********************************************
void isr_4()
{//外部中断子程序........................
}//外部中断子程序
//**********************************************
void isr_8(){//计数器0中断子程序
if(!rf_sta)//如果起始位无效
{//00
rf_1_sum++;
if(rf_1_sum&gt;100)rf_cont=0;//如果释放按键则清计数器
if(!rf_6ms){//1 如果未满足6毫秒电平
if(!rf_in){rf_1_sum=0;}//如果接收到的是低电平,则清0计数
if(rf_1_sum&gt;40){//2
rf_6ms=1;//置6毫秒高电平有效
}//2
}//1
else //如果已满足6毫秒电平,则等待起始位
{//003
if(!rf_in)//一收到有低电平,则判为有开始
{
rf_addr1=0;
rf_6ms=0;
rf_b
data=0;
rf_bitsum=11;//初始化接收到的数据位,先接收11位,第12位独立接收rf_0_sum=0;//
rf_mksum=0;//码宽计数器
rf_sta=1 ;//置起始位有效
}
}//003
}//00
else//起始位有效
{//200
rf_mksum++;//码长计数器加1
if(rf_bitsum==0)
{//如果已经接收完11位,则处理接收第12位数据
if(rf_in)//等待高电平
{
if(rf_mksum&lt;=5){_c=0;}else {_c=1;}//判断最后一位数据
_rlc(&amp;rf_addr1);_rlc(&amp;rf_addr2);//移位存入数据,已经接收完12位数据
_rlc(&amp;rf_addr1);_rlc(&amp;rf_addr2);//修正ADDR2存5位数据addr1存7位按键码//addr1按键码存在高7位,第0位无意义
rf_sta=0;// 置起始位无效,重新接收下一贞
if((rf_addr2==0x1b)&amp;(rf_addr1_old==rf_addr1))
{rf_cont++;
if(rf_cont==3)rf_ture=1;
}//如果与上一次接收相同
else
{rf_addr1_old=rf_addr1;
rf_cont=0;
}//与上一次接收不相同,重新接收
rf_addr1=0;//清洗
}
goto timeret;//第12位数据,不处理低电平计数
}//如果已经接收完11位,则处理接收第12位数据
if(!rf_in)
{//3 如果接收的是低电平则处理如下
if(!rf_bdata){goto timeret;}//如果上次接收的是低电平,则退出
rf_bdata=0;
if(rf_mksum&lt;9) {rf_sta=0;goto timeret;}//如是码长太短,当作是收到误码处理
if(rf_mksum&gt;13) {rf_sta=0;goto timeret;} //如果码太长,说明协议不同,放弃处理
rf_mksum=0;//码宽计数器重新开始计数
if(rf_1_sum&lt;=5){_c=1;}else _c=0;
_rlc(&amp;rf_addr1);_rlc(&amp;rf_addr2);
rf_1_sum=0 ;
rf_bitsum--;
}//3处理接收
else //如果接收的是高电平则如此处理
{rf_bdata=1;
rf_1_sum++;//计算高电平的宽度
}
}//200
timeret: time_us++;
}//中断子程序
//***********************************************
**************************************
void safeguard_init()
{//初始化
_tmr = 0x64;//150毫秒中断一次
_tmrc = 0x91;//内部定时,打开计数分频比为1:4 ................................ ..................................... .................................
_intc=0x7;//允许定时0中断,允许外部中断,允许总中断
_wdts=0x0f;//WDT预分频1:128
}//初始化
//*************************************************************************
void spbb(void)//蜂鸣器叫一声
{
...................
....................
................
}
//********************************************************************************* ***********************
//********************************************************************************* **********************
void main(){
uchar i,y;
safeguard_init();//初始化
spbb();//上电时,蜂鸣器叫一声
//**************************************
while(1)
{//01主体
_clrwdt();
if(rf_ture)//接收有效
{//123
switch(rf_addr1_old)
{//对摇控器码解释
case 0x02: //
................
spbb();//B一声
break;
case 0x20://
..........
break;
default:
break;
}//对摇控器码解释
rf_ture=0;//重新开放接收}//123
}//01主体
}。

相关文档
最新文档