MSP430G2553定时器捕获之红外遥控器编码破解
- 格式:pdf
- 大小:415.40 KB
- 文档页数:8
第1篇一、实验目的本次实验旨在通过搭建红外遥控系统,了解红外遥控的基本原理,掌握红外遥控信号的编码和解码方法,并利用单片机实现对红外遥控信号的解码,实现对红外遥控器的控制。
二、实验原理红外遥控技术是一种无线通信技术,通过发射端发送特定编码的红外信号,接收端接收该信号并进行解码,从而实现对电器的控制。
红外遥控系统主要由发射端和接收端两部分组成。
1. 发射端:由按键矩阵、编码调制电路和红外发射器组成。
按键矩阵根据按键的不同产生不同的编码信号,编码调制电路将这些信号调制在38kHz的载波上,红外发射器将调制后的信号发射出去。
2. 接收端:由红外接收器、前置放大电路、解调电路和指令信号检出电路组成。
红外接收器接收发射端发射的红外信号,前置放大电路对信号进行放大,解调电路将38kHz的载波信号去除,指令信号检出电路从解调后的信号中提取出指令信号。
三、实验设备1. 红外遥控发射器2. 红外接收模块3. 单片机开发板4. 连接线5. 电源6. 红外遥控解码程序四、实验步骤1. 搭建红外遥控系统:将红外接收模块连接到单片机开发板的相应引脚上,确保连接正确无误。
2. 编写红外遥控解码程序:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
3. 程序烧录与调试:将解码程序烧录到单片机中,连接电源,进行程序调试。
4. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
五、实验结果与分析1. 红外遥控系统搭建成功:通过连接红外接收模块和单片机开发板,成功搭建了红外遥控系统。
2. 解码程序编写与调试:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
在调试过程中,通过观察单片机的输出,验证了程序的正确性。
3. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
实验结果表明,单片机能够成功解码红外信号,并实现红外遥控器的控制功能。
电设工作小结之 MSP430G2553学习笔记―2电设工作小结之-msp430g2553学习笔记―2电设工作小结之――msp430g2553学习笔记――2接通一篇:(四),adc101,adc10就是十位的ad,在g2553上加a0~a7八个可以外接的ad地下通道,a10收到片上的温度传感器上,其他的地下通道都直奔在内部的vcc或gnd上。
因为就是10为的ad所以计算公式如下:2,adc参考电压的选择:adc的参考电压可以为:由adc掌控寄存器0adc10ctl0掌控。
但是必须提升adc的精度的话,尽量不要用内部的参照电压,最出色外接一个比较稳定的电压做为参照电压,因为内部的产生的参照电压不是特别平衡或精度不是特别的高。
比如我在采用时碰到的情况如下:vref设为2.5v但实际的值大概为2.475v,选择vccvss作为参考,用电压表测得大概为3.58v还是不小的偏差的。
另外,在有可能的情况下,尽量使用很大的vr+和vr-,以增大纹波对取样结果的影响。
3,adc10的取样方式存有:单通道单次取样,单通道多次取样,多通道单次取样,多通道多次取样。
4,dtc:因为adc10只有一个采样结果存储寄存器adc10mem,所以除了在单通道单次采样的模式下,其他的三个模式都必须使用dct,否则转换结果会不停地被新的结果给覆盖。
dtc是转换结果传送控制,也就是转换结果可以不用cpu的干预,就可以自动地存储在指定的存储空间内。
使用这种方式转换速度快,访问方便,适用于高速采样模式中。
dtc的使用可以从下面的例子中很容易看明白:#include#include\uchars1[]={\uchars2[]={\voidadc_init(){adc10ctl1=conseq_3+inch_1;//2通道多次转换,最大转换通道为a1adc10ctl0=adc10sht_2+msc+adc10on+adc10ie;//adc10on,interruptenabl参照电压选默认值vcc和vss//采样保持时间为16xadc10clks,adc内核开,中断使能msc多次转换选择开//如果msc置位,则第一次开始转换时需要触发源触发一次,以后的转换会自动进行中断使能//采用dtc时,当一个块传输完结,产生中断//数据传送控制寄存器0adc10dtc0设置为默认模式:单传送块模式,单块传送完停止adc10dtc1=0x04;//数据传送控制寄存器14conversions定义在每块的传送数目一共采样4次所以单块传送4次//以后就暂停了传输因为就是两地下通道的,所以就是每个地下通道取样数据传输2次adc10ae0|=bit0+bit1;//p1.0p1.1adcoptionselect使能模拟输入脚a0a1//不晓得为什么,当p10p11都悬空时,取样值相同,用电压表测得悬空电压相同,但是当都接通取样源的时候,//取样就是相同的}voidmain(void){uintadc_sample[8]={0};//存储adc序列取样结果wdtctl=wdtpw+wdthold;bcsctl1=calbc1_12mhz;//设定cpu时钟dco频率为12mhzdcoctl=caldco_12mhz;p2dir|=bit3+bit4;//液晶的两条线init_lcd();adc_init();wr_string(0,0,s1);wr_string(0,3,s2);for(;;){adc10ctl0&=~enc;//adc不使能够其实这句话可以放到紧接着cpu唤起之后的,因为cpu唤起了,表明我们想的//转换数据传送完成了,如果adc继续转换,那么转换结果也不再传输,是无用的。
前言我的这篇文章根本不是什么出版社发行的书籍,更不是某个工程师写的宏篇巨著,这篇文章充其量就是一篇应用笔记。
其实这样的小文章没有写前言的必要,但我想在正文前写点什么,以便告诉大家我这篇文章是干什么用的,所以就套用了书籍的格式,开头写上了前言。
希望大家能够理解,勿喷~~这篇文章主要介绍了MSP430G2553单片机和320*240TFT液晶屏的连接使用方法,并详细解释了代码中所有语句的含义。
解释代码过程中,又渗透了查阅单片机手册(附件:《G2手册》)、查阅单片机头文件的方法。
用三天的时间,大家踏踏实实仔细看这篇文章,就能达到以下程度:1.会使用液晶屏,了解液晶屏的工作原理,显示颜色、字符、图案(双色)2.会使用自模提取软件3.会查阅手册,进一步理解寄存器的配置(@_@||)4.初步掌握SPI通信机理附几项说明:1.源代码都用WDTCTL=WDTPW+WDTHOLD;深色背景标出,方便查看2.截图都已注明来源,用【】标注,你可以从附件里的PDF文档里找到3.本实验所用器件有:G2单片机(已焊上晶振)、数据线、8根杜邦线、2.2寸液晶屏(或引脚完全兼容的2.8寸液晶屏,这个液晶屏每个像素点比2.2寸的大,但是分辨率还是240*320,引脚上比2.2寸的多了四个脚——触屏功能。
但是在做这个实验的时候,只需连上后文提到的那几个引脚)4.液晶屏的膜禁止撕掉,液晶屏要轻拿轻放,不要长时间通电(原因下页会说的)借用液晶屏要去管理员那里登记,如有损坏原价赔偿(非暴力手段是不会坏的)第一步:把线连好,连线方式如下表所示液晶屏中文解释单片机备注SDO (MISO)主机输入从机输出空所用液晶屏不会给单片机发数据的,所以这根线不用连(能省则省)LED液晶屏背光VCC正常是VCC通过一个滑动变阻器连到LED 上,这里为了方便直接连上。
这样做虽然可以使背光很亮,但是接线的地方等一会儿会很烫,所以建议隔一段时间断电冷却一下下SCK时钟信号线P1.4SPI通信需要有同一根时钟线P1.4口第二功能就是输出SMCLK时钟信号SDI (MOSI)主机输出从机输入P1.2M(monster主人,主机)O(Output输出)S(Slave奴隶,从机)I(Input输入)P1.2口第二功能是MOSID/C数据/控制选择位P1.3这一位可以随便设定,只要可以输出高低电平就行。
程序可以用来查看每个遥控按键的编码,以便于开发利用遥控每一个按键。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit en=P3^4;sbit rs=P3^5; //用于控制1602sbit rw=P3^6;sbit dula=P2^6;sbit wela=P2^7; //用于控制晶体管sbit IRIN=P3^2; //红外接收器数据线IO 口uchar IRCOM[4]=0;//定义数组IRCOM,分别装解码后得到的数据//IRCOM[0] 低8位地址码//IRCOM[1] 高8位地址码//IRCOM[2] 8位数据码//IRCOM[3] 8位数据码的反码uchar code table[]="MAKE BY HEIQISHI"; uchar code table1[]="The code is 0x";uchar code table2[]="0123456789abcdef";//////////////显示程序///////////////////void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=112;y>0;y--); //大约是1ms,因为单片机的时钟周期为11.0592mhz。
}void Write_com(uchar com){rs=0; //指令P0=com; //写指令函数delay(5);en=1;delay(5);en=0;}void Write_data(uchar dat){rs=1; //数据P0=dat; //写指令函数delay(5);en=1;delay(5);en=0;}void _1602Init(){wela=0;dula=0; //用于关闭晶体管,因为都是用P0en=0; //初始时使能为0rw=0;Write_com(0x38); //显示屏模式设置为1602方案Write_com(0x0c); //显示开关/光标设置Write_com(0x06);Write_com(0x01); //清屏Write_com(0x80); //指针置零}//////////////////////////////////////////////////////////////////////解码程序///////////////////void delay014ms(uchar x) //x*0.14MS STC10F04延时约0.15MS{uchar i;while(x--){for(i=0;i<15;i++) //13;}}//////////////初始化////////////void IR_init(void){EA=1;EX0=1; //允许总中断中断,使能INT0 外部中断IT0=1; //触发方式为脉冲负边沿触发IRIN=1; //I/O口初始化}////////////解码过程//////////////void IR_CODE(void) interrupt 0 //在外部中断子程序中解码{uchar j,k,N=0,shi,ge;EX0=0; //防止干扰delay014ms(15); //延时2.1msif (IRIN) //2.1ms能够检测出各种错误信号{EX0 =1;return;} //确认IR信号出现while(!IRIN); //等IR变为高电平,跳过9ms的前导低电平信号。
本文是基于单片机红外通讯的代码,代码分为发射板代码和接收板代码。
指令码是用户发给接收系统的指令,用以控制设备完成相应的操作。
指令码是一串数据流,其构成如图3-2。
一个完整的指令码由10ms高平引导码、3ms低平开始码、1ms脉宽正脉冲、3ms低平结束码、下一个10ms高平引导码组成。
其中引导码、开始码和结束码都是为了系统能够正确接受信号而设置的,能够判断信号是否有效、信号起始和结束。
信号中的脉冲个数才是我们指令码的指令所在,不同的脉冲个数对应不同的指令。
图3-2 指令码的组成3.3 红外遥控发射系统的设计红外遥控发射部分系统框图见图3-3。
发送端采用单片机的定时中断功能,由定时器T1产生周期为26us 的矩形脉冲,即每隔13us定时器T1产生中断输出一个相反的信号使单片机输出端产生周期为38KHz的脉冲信号。
系统通过连着单片机的按键获取用户遥控指令码,经按键扫描确认,然后交由单片机编码生成信息码,再由红外发射二极管将信息码发射出去。
在次设计中用到了T1和T0两个定时器,定时器T0控制T1开启和关闭,T0定时长度由指令码中高低电平维持时间长度决定。
具体发射过程如下:(1)定时器T1打开10ms,发射10ms引导码。
(2)定时器T1关闭3ms,发射3ms低平开始码。
(3)定时器T1打开1ms,发射1ms脉宽高电平脉冲。
(4)定时器T1关闭1ms,发射1ms脉宽低电平。
(5)重复(3)和(4)发射一定数目的脉冲。
(6)最后T1打开2ms和最后一个脉冲的1ms低电平一起构成3ms结束码,最终发射的信号如图3-2。
3.4 红外遥控接收系统的设计红外遥控接收电路框图见图3-4。
红外接收端普遍采用价格便宜,性能可靠的一体化红外接收头(MS0038 , 它接收红外信号频率为38KHz ,周期约26μs)。
它能同时对信号进行放大、检波、整形,得到TTL 电平的编码信号。
当接收头接收到26us周期的脉冲,输出低电平,否则输出高电平。
单片机STM32F103C8T6的红外遥控器解码系统设计一、本文概述本文旨在详细阐述基于STM32F103C8T6单片机的红外遥控器解码系统的设计和实现过程。
随着科技的不断进步和智能化设备的普及,红外遥控器作为一种常见的遥控设备,已经广泛应用于家电、安防、玩具等多个领域。
然而,红外遥控器发出的红外信号往往需要通过解码器才能被设备正确识别和执行,因此,设计一款高效、稳定、可靠的红外遥控器解码系统具有重要意义。
本文将首先介绍红外遥控器的基本原理和信号特点,然后详细阐述STM32F103C8T6单片机的性能特点和在红外遥控器解码系统中的应用优势。
接着,将详细介绍红外遥控器解码系统的硬件设计,包括红外接收头的选择、电路设计和PCB制作等。
在软件设计部分,将详细阐述如何通过STM32F103C8T6单片机的编程实现红外信号的接收、解码和处理,以及如何将解码后的数据通过串口或其他通信方式发送给主控制器。
本文还将对红外遥控器解码系统的性能进行测试和分析,包括信号接收距离、解码速度和稳定性等方面的测试。
将总结本文的主要工作和创新点,并对未来的研究方向进行展望。
通过本文的研究和实现,旨在为红外遥控器解码系统的设计提供一种新的思路和方法,同时也为相关领域的研究人员提供有益的参考和借鉴。
二、红外遥控器基础知识红外遥控器是一种常见的无线遥控设备,它利用红外光作为信息载体,通过发射和接收红外光信号实现对设备的远程控制。
这种遥控方式因其简单、低成本和无需视线连接等优点,在各类消费电子产品中得到了广泛应用,如电视机、空调、音响等。
红外遥控器的工作原理主要基于红外辐射和光电器件的检测。
遥控器内部通常包含一个或多个红外发射管,当按下按键时,发射管会发射出特定频率和编码的红外光信号。
接收端则配备有红外接收头,该接收头内部有一个光敏元件(如硅光敏三极管或光敏二极管),用于检测红外光信号并将其转换为电信号。
为了区分不同的按键操作,红外遥控器通常采用特定的编码方式对按键信号进行编码。
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解码方法二你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。
MSP430单片机串口通信详解#include"msp430G2553.h"#include "in430.h"void UartPutchar(unsigned char c);unsigned char UartGetchar();unsigned char temp=0;unsigned char number[2]={0};void main( void ){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBCSCTL1 = CALBC1_1MHZ; // Set DCODCOCTL = CALDCO_1MHZ;P1DIR|=BIT6;P1OUT&=~BIT6;P1SEL = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXD P1SEL2 = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXDUCA0CTL1 |= UCSSEL_2; // 选择时钟BRCLKUCA0BR0 = 106; // 1MHz 9600UCA0BR1 = 0; // 1MHz 9600UCA0MCTL = UCBRS2 + UCBRS0; // 波特率=BRCLK/(UBR+(M7+...0)/8)UCA0CTL1 &= ~UCSWRST;// 初始化顺序:SWRST=1设置串口,然后设置SWRST=0,最后设置相应中断IE2 |= UCA0RXIE; // 使能接收中断while(1){//UartPutchar(9);// display_int(temp,0);__delay_cycles(10000);}}/**********************************UART接收中断*************************/#pragma vector=USCIAB0RX_VECTOR__interrupt void USCI0RX_ISR(void){//while (!(IFG2&UCA0TXIFG)); // 等待发送完成 //UCA0TXBUF = UCA0RXBUF; // TX ->; RXed charactertemp=UCA0RXBUF;}/******************************UART发送字节函数*************************/void UartPutchar(unsigned char c){while(!(IFG2 & UCA0TXIFG)); //待发送为空UCA0TXBUF=c;IFG2 &=~UCA0RXIFG;}/*********************************UART接收字节数据******************/unsigned char UartGetchar(){unsigned char c;while(!(IFG2 & UCA0RXIFG)); //等待接收完成c=UCA0RXBUF;IFG2 &=~UCA0TXIFG;return c;}/******智能控制工作室*******/MSP430g2553串口通信MSP430的不同型号,其串行通讯工作模式是一样的。
MSP430G2553应用之红外遥控器按键编码的破解(ls_core)之前笔者利用51单片机、FPGA 和S3C2440对红外遥控器的编码破解过。
由于最近手里使用的单片机为MSP430G2553,同时也为了扩展LaunchPad 开发板按键所需,笔者还是将之前弄使用过的红外遥控器拿了起来。
使用遥控器作为开发板的按键使有个好处就是,占用一个IO 口即可扩展出很多按键。
但是,这样做的不足就是,占用了一个定时器和相应中断的资源。
所以,建议大家应该依据具体的项目工程而确定具体的解决方案。
好了进入正题。
一 红外时序在这里笔者探讨的问题是破解红外遥控器的编码,而不是对其编码。
所以,我们直接谈谈红外接收头1838T 接收到红外遥控器发送出的按键编码时序。
笔者在普源(RIGOL)示波器上观察到的时序波形如图1红外遥控器按键编码时序所示:图1 红外遥控器按键编码时序面对这样一列串行的序列,笔者将其测量、记录、整理并为其制作了一张时序图以便讲解,绘制的时序图如下图2 红外编码时序图 所示:ls _c o r e Q Q 1021480125 837278968图2 红外编码时序图接下来,让我们一起详细地探讨一下这一列时序波形。
首先当我们手中的遥控器的按键被按下时,其红外发射头会发射出红外线(该红外线载有数据信息,即对应的按键编码),然后红外接收头1838T 会接收该红外线对其解码还原载波信息。
所还原的信息即为按键编码的串行时序信息,如上图2所示。
那笔者所讲的破解编码是指的什么呢?很显然,笔者所讲的破解就是要把图2所示的串行数据转化成方便微机或者是人记忆识别的并行数据。
好,接着让我们一起分析一下这个时序。
⑴ 空闲状态:当红外接收头1838T 没有数据时(无按键按下,或是数据转化完成),红外接收头的输出引脚会一直保持高电平,即上图2所指的空闲状态。
⑵ 引导码:当红外接收头1838T 接收到了数据,其输出引脚首先会由空闲的高电平状态跳转为低电平状态,该低电平状态会保持9ms ,那么着9ms 的高电平状态即称之为引导码。
⑶ 结果码:引导码过后,红外接收头的输出引脚会由低电平状态跳回到高电平状态并保持4.5毫秒,那么这4.5ms 的高电平状态即称之为结果码。
ls _c o r e⑷ 逻辑编码区:结果码过后,红外接收头的输出引脚便会输出一段高低电平跳转维持53.76ms 的时序区(该区内容之后详细探讨),之后再次回答空闲区,标志的一次转化完成。
二 逻辑编码为了更好的说明逻辑编码区的信息,笔者将逻辑编码区放大进行讲解,如图3 逻辑编码区所示:图3 逻辑编码区凡是在逻辑编码区的时序列,其低电平保持时间全部为0.56ms ,高电平保持时间不是0.56ms 即为1.68ms (没有任何其他情况)。
那么当单片机接收到这一串行的数据之后是按照什么样的规则将其转化成相应的并行数据的呢?规则是这样的,凡是在逻辑编码区内的串行数据,将连续的0.56ms 的低电平和0.56ms 的高电平编码为‘0’,将连续的0.56ms 的低电平和1.68ms 的高电平编码为‘1’。
如果按照这样的规则对逻辑去内的串行数据进行编码,编码完成后会形成一个32为的编码,其编码图如下图4 逻辑编码区编码结果所示:ls _c o r e Q Q 1021480125 837278968图4 逻辑编码区编码结果该编码结果共32位,占用4个字节,其高字节C31-C24为遥控器识别码,C23-C16为遥控器识别码的反码,即遥控识别码和遥控识别反码之和为0xFFFF ,按键操作码是不同遥控器的识别码,即不同遥控器的遥控识别码不同,同一遥控器不同按键的遥控识别码相同。
其低字节C15-C8为按键操作码,C7-C0为按键操作码的反码,即按键操作码和按键操作反码之和为0xFFFF ,同一遥控器不同按键的按键操作码不同。
因此可以推断,理论上同一遥控器可以接入255个按键。
呵呵,如果需要多按键的项目建议使用此方案哦。
三 破解算法明白了基本原理就可以动手借助单片机这个平台编程对其破解了。
笔者在这里利用的是MSP430g2553这款单片机。
但是在编程之前还是要确定一下破解方案最为重要。
⑴ 硬件条件MSP430G2553拥有两个定时器,每个定时器的比较捕获模块儿都支持捕获功能,捕获方有:捕获上升沿、捕获下降沿和捕获上升沿和下降。
在本文里笔者选用Timer1的捕获模块儿CCR1的下降沿捕获功能来记录每个下降沿到来时定时器Timer1中的计数值。
⑵ 软件算法利用已有的硬件条件制作软件算法流程图如下图5软件流程图所示:ls _c o r e图5 软件流程图笔者的定时器Timer1的驱动输入 时钟配置为ACLK ,其是有外部的振荡器输入的时钟大小为32.768KHz ,每个时钟周期为0.0305ms 。
由于每个周期的编码序列为(9+4.5+53.7)ms=67.2ms 。
所以笔者设置的定时值为67.2/0.0305=2203。
为了安全起见,该值稍微设置大了一些,这里设置为3000。
这样当系统上电之后,进行必要的初始化后进入主函数工作。
当有按键按下时,捕获模块CCR1会捕获到引导码的下降沿,产生中断。
当第一次中断时,初始化红外编码数据并开启定时器Timer1。
对于红外数据笔者定义了一个结构体如下:typedef struct CODE { char ir_flag; /*如果有有效的红外数据过来,该位置1*/ int code_time[33];/*数组记录红外编码的33组逻辑编码*/ int code_num; /*数组记录的逻辑编码个数*/int code;/*编码值*/} IrStruct;之后的每次中断中通过读取CCR1将读取到的定时器计数值记录在结构体的数组中。
这样,记满33次后就记好了一个按键的全部计数值,然后通过一定的算法当把32位编码的时间全部记录好后。
对记录好的时间进行处理(相邻两个做差、比较),处理后比较,若其时ls _c o r e Q Q 1021480125 837278968间差大于1.525ms 可认为是逻辑编码'1',否则为逻辑编码‘0’。
确定红外编码记录于结构体的code 中并置位ir_flag 位,表示有按键按下,等待主程序将数据读走。
在这里笔者给出计算按键的子函数:static void CalCode() { for (pIr->code_num=NUM-1;pIr->code_num>24;pIr->code_num--){if ((pIr->code_time[pIr->code_num]-pIr->code_time[pIr->code_num-1])>50)/*如果记录数据大于50即时间差大于50*0.0305ms ,则认为是逻辑编码‘1’*/ pIr->code |=0x1; else pIr->code &=~(0x1); if (pIr->code_num>25)pIr->code<<=0x1; pIr->code_time[pIr->code_num]=0;}pIr->code_num=-1;pIr->ir_flag=1; /*该位置1表示,有有效的按键信息录入,等待CPU 读走*/}好啦,今天的博文就写到这里,谈到这里,笔者个人认为已经把红外遥控器的编码已经解释很是清楚了。
剩下的事儿就是根据算法将程序编写出来,然后在硬件上调试出来就OK 了!当你破解了红外遥控器编码,以后红外遥控器你想怎么用就怎么用了。
占用一个IO 口便可实现对几十个按键利用。
当然了,这是以牺牲定时器和中断的资源为代价的哦!在下面附出定时器Timer1的初始化程序:/******************************************************************** * File name : timer1.c * Creating time : 2012-7-22* Author : 李帅 * pen-name : 亦然* Organization: 济南大学(2013年本科毕业)* Function : 该文件可用作模块儿化编程作为MSP430G2553的定时器 *Timer1捕获模块儿CCR1的初始化。
* Declareing: 如有错误的地方请各位指出,交流。
交流使我们共同进步!* E-mail: ls_core@* Contact way : QQ:1021480125 客:/lscore ********************************************************************/ #include <msp430g2553.h> #include "uart.h" #include "ir.h"ls _c o r e/******************************************************************** * 名称 : T imer1A3Init()* 功能 : T imer1捕获模块儿CCR1的初始化 * 输入 : 无* 返回值: 无********************************************************************/ void Timer1A3Init() { /**************************************************************** * 定时器Timer1的TA1CCR1捕获信号选择为TA1.1,由P2.1输入***************************************************************/ P2DIR &=~BIT1 ; P2SEL |= BIT1;/**************************************************************** * 设置定时器Timer1_A* TASSEL_1:Timer A clock source select: 1 - ACLK * MC_1 :Timer A mode control: 1 - Up to CCR0 * TAIE:允许主计数器TA 溢出中断* TACLR :Timer A counter clear* *************************************************************/ TA1CTL |= TASSEL_1 + MC_1 + TACLR; //时钟源:SMCLK;增计数模式//+ TAIE /**************************************************************** * 设置定时器Timer1_A 的捕获/比较模块1 * CCIE :允许定时器Timer0_A 的捕获/比较模块1中断* CM1 :捕获下降沿 * CAP:设为捕获功能* SCS :同步捕获* *************************************************************/ TA1CCTL1 |= CCIE +CM1 + CAP + SCS ;/**************************************************************** * 设置定时器Timer1_A 的捕获/比较模块0的计数值* 计数值=(计数周期)*(32.768KHz)* **************************************************************/ TA1R=0;TA1CCR0 =0;}ls _c o r e Q Q 1021480125 837278968/******************************************************************** * 名称 : T A1_ISR* 功能 : T imer1捕获模块儿CCR1中断服务程序 * 输入 : 无* 返回值: 无********************************************************************/ #pragma vector = TIMER1_A1_VECTOR __interrupt void TA1_ISR(void ) { switch (TA1IV){ case 0x02: { Record(); break ;}default : break ;}}/********************** end of file *********************************/好啦,今天就将这些,希望前辈能多多指正,谢谢!我在后面还会将我的学习心得整理成文,包括FPGA 和ARM 等。