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

合集下载

红外遥控和C语言51红外遥控解码程序设计实例

红外遥控和C语言51红外遥控解码程序设计实例

红外遥控和C语言51红外遥控解码程序设计实例红外遥控和C语言51红外遥控解码程序设计实例什么是红外线?人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。

其中红光的波长范围为0.62~0.76μm;比红光波长还长的光叫红外线。

红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.红外线遥控就是利用波长为0.76~1.5μm之间的近红外线来传送控制信号的。

红外发光二极管一般有黑色、深蓝、透明三种颜色。

红外遥控系统一般分发射和接收两个部分。

发射部分的主要元件为红外发光二极管。

目前大量使用的红外发光二极管发出的红外线波长为940mm左右,外形与普通φ5发光二极管相同。

接收部分的红外接收管是一种光敏二极管。

红外发光二极管一般有圆形和方形两种。

由于红外发光二极管的发射功率一般都较小(100mW左右),所以红外接收二极管接收到的信号比较微弱,因此就要增加高增益放大电路。

最近几年大多都采用成品红外接收头。

成品红外接收头的封装大致有两种:一种采用铁皮屏蔽;一种是塑料封装。

均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VO或OUT)。

红外接收头的引脚排列因型号不同而不尽相同,可参考厂家的使用说明。

成品红外接收头的优点是不需要复杂的调试和外壳屏蔽,使用起来如同一只三极管,非常方便。

但在使用时注意成品红外接收头的载波频率。

红外遥控常用的载波频率为38kHz,这是由发射端所使用455kHz晶振来决定的。

在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz?12?37.9kHz?38kHz。

也有一些遥控系统采用36 kHz、40kHz、56 kHz等,由发射端晶振的振荡频率来决定。

红外遥控的特点是不影响周边环境的、不干扰其他电器设备。

室内近距离(小于10米)遥控中得到了广泛的应用。

红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.引导码是告诉接收机准备接收红外遥控码.系统码是识别码,不同的遥控芯片有不同的误别码,以免搞错.遥控器上不同的按键有不同的键码,系统码和键码都是16位码,8位正码,8位反码.如SC6122的系统码是FF00,FF和00互为反码,键码1为EF10也是互为反码.SC6122的引导码为低电平为9000微秒,高电平为4500微秒.当然高电平不可能精确为9000微秒,在8000微秒到10000微秒都看作是正常范围,低电平在4000-5000之间都看作是正常范围.引导码后的32位编码(16位系统码和16位不管高低电平,载波时间都是560微秒,但低电平持续时间是1125微秒,高键码) 电平持续时间是2250微秒,所以低电平除去载波时间大约是560微秒,高电平除低电平也有一个波动范围,在400-700之间都看作去载波时间大约是1680微秒.是正常的,具体多少可以通过示波器测量出来.高电平也有一个波动范围,在400-2000之间都看作是正常的,具体多少也是根据经验.当然范围越宽,捕捉红外线的范围也越宽,越精确.在捕捉到有高低电平之间,在560-1680之间取一个中间值1120微秒,认为小于1120微秒是低电平,大于1120微秒是高电平.////////////////////////////////////////////////////////红外接收后的数据通过UART发出//晶振:12M//author:cole//date:09.6.6//////////////////////////////////////////////////////#include reg52.h void uart_init(void);#define c(x)(x)sbit Ir_Pin=P3^2;unsigned char Ir_Buf[4];//用于保存解码结果 unsigned int Ir_Get_Low() {TL0=0;TH0=0;TR0=1;while(~Ir_Pin&&(TH0&0x80)==0); TR0=0;return TH0*256+TL0;}//===unsigned int Ir_Get_High(){TL0=0;TH0=0;TR0=1;while(Ir_Pin&&(TH0&0x80)==0); TR0=0;return TH0*256+TL0; }//==main(){unsigned int temp; char i,j;P3=0xff;uart_init();do{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; }}for(i=2;i 4;i++){SBUF=Ir_Buf[i];while(TI==0);TI=0;}}while(1);}///////////////////////////////////////////////////////////UART初始化//波特率:9600/////////////////////////////////////////////////////////void uart_init(void) {unsigned char u;ET1=0;TMOD=0x21;//定时器1工作在方式2(自动重装) SCON=0x50;//10位uart,容许串行接受 TH1=0xFD;TL1=0xFD;u=SBUF;TR1=1;}。

51单片机红外解码资料+源代码

51单片机红外解码资料+源代码

位地 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 址
源代码如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7;
uchar irtime; //红外时间 uchar startflag; //启动接收 uchar irdata[33]; uchar bitnum; uchar irreceiveok; //红外接收完毕 uchar ircode[4]; uchar irprosok; uchar disp[8]; uchar code smg_du[]={
发射器发射的的信号为
接收器接收到的信号为
即 9ms 低电平后 4.5ms 高电平作为起始码,之后接受到两次 8 位客户码,一次八位数据码,和一次八位数据反码。
遥控器在按键按下之后周期性的发出同一种 32 位二进制编 码周期约为 108ms,一组码持续时间随本身的“0”“1”个数不同
而不同。大约在 45~63ms 之间,当一个键按下 36ms,振荡器使芯 片激活,将发射一组 108ms 的编码脉冲这 108ms 编码脉冲由一个 起始码(9ms),一个结束码(4.5ms),低八位地址码(9~18ms), 高八位地址码(9~18ms),八位数据码(9~18ms),和这八位数据 码反码(9~18ms),如果按下超过 108ms 仍未松开,接下来发射 的代码(连发代码)将仅有起始码(9ms)和结束码(2.5ms)组 成。
解码的关键是如何识别零和一: “0”和“1”都是以 0.56ms 低电平开始的,不同的是高电平 宽度不同,“0”为 0.56ms“1”为 1.168ms,所以必须根据高电平 宽度来区别“0”和“1”。 如果从 0.56ms 低电平过后,开始延时,0.56ms 后,若读到的 电平为低,说明该位为零,反之则为一,可靠其间,延时必须比 0.56ms'长一些,又不能超过 1.12ms,否则如果该位为零,读到的 已是下一位高电平,因此取(1.12+0.56)/2=0.84ms 最为可靠,一 般取 0.84ms 左右均可。根据码的格式,应该等待 9ms 起始码和 4.5ms 结束码完成后才能读码。 备注:定时器/计数器控制寄存器 TCON 位序 D7 D6 D5 D4 D3 D2 D1 D0 号 位符 TF1 TR1 TF0 IR0 IE1 IT1 IE0 IT0 号

基于51单片机的红外遥控编码解码的C语言程序和电路[1]

基于51单片机的红外遥控编码解码的C语言程序和电路[1]

请勿转载!!!作品功能简介:当学习键按下后,红外接收头便可将接受到的信号存储到单片机中。

在接受到通用遥控器发出的信号后,如果按下发射键,单片机将调出刚刚储存的信息,通过红外发射头发射出和遥控器一样的信号来达到控制的作用。

#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit studylamp=P2^7;sbit lamp=P2^6;sbit studykey=P3^2;sbit remotein=P1^1;sbit remoteout=P1^0;sbit txkey=P2^0;uint i,j,m=255,n,k,s;uchar idata remotedata[206];uint head;uint remdata;//一毫秒延时程序delay1ms(uint t){for(i=0;i<t;i++)for(i=0;j<120;j++);}//初始化函数clearmen(){studylamp=1;lamp=1;remoteout=0;remotein=1;for(i=0;i<206;i++){remotedata[i]=0x00;}IE=0x00;IP=0x01;TMOD=0x22;PCON=0X00;TH1=0xf3;TL1=0xf3;IT0=1;EX0=1;EA=1;}//键功能函数void key_tx(){if(txkey==0){delay1ms(1);if(txkey==0){while(txkey==0);ET1=1;TR1=1;for(i=head;i>0;i--);remoteout=0;ET1=0;TR1=0;n=0;while(1){lamp=0;studylamp=1;if(remotedata[n]==0x00){delay1ms(10);break;}for(i=remotedata[n];i>0;i--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}n++;ET1=1;TR1=1;for(i=remotedata[n];i>0;i--);remoteout=0;ET1=0;TR1=0;n++;}}}}//主函数void main(){clearmen(); //初始化while(1){key_tx(); //按键扫描}}//40KHz发生器void time_intt1(void) interrupt 3{remoteout=~remoteout;}//外中断0void intt0(void) interrupt 0{ET1=0;TR1=0;EX0=0;EA=0;head=0;while(studykey==0);studylamp=0;lamp=1;while(remotein==1);head=0;while(remotein==0){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();head++;}n=0;remdata=0x0000;while(1){while(remotein==1){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();remdata++;}if(remdata>m) //高电平>5毫秒退出 {remotedata[n]=0x00;EX0=1;EA=1;goto end;}remotedata[n]=remdata;n++;remdata=0x0000;while(remotein==0){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();remdata++;}remotedata[n]=remdata;n++;remdata=0x00;}end: lamp=0;studylamp=0;}电路:实物:2009-06-25 12:39。

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单片机设计的红外线遥控器电路图及工作原理你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控解码器”。

该小制作所需要的元件很少:单片机TA89C2051一只,RS232接口电平与TTL电平转换心片MAX232CPE 一只,红外接收管一只,晶振11.0592MHz,电解电容10uF4只,10uF 一只,电阻1K1个,300欧姆左右1个,瓷片电容30P2个。

发光二极管8个。

价钱不足20元。

电路图及原理:主控制单元是单片机AT89C2051,中断口INT0跟红外接受管U1相连,接收红外信号的脉冲,8个发光二极管作为显示解码输出(也可以用来扩展接其他控制电路),U3是跟电脑串行口RS232相连时的电平转换心片,9、10脚分别与单片机的1、2脚相连,(1脚为串行接收,2脚为串行发送),MAX232CPE的7、8脚分别接电脑串行口的2(接收)脚、3(发送脚)。

晶振采用11.0592MHz,这样才能使得通讯的波特率达到9600b/s,电脑一般默认值是9600b/s、8位数据位、1位停止位、无校验位。

电路就这么简单了,现在分析具体的编程过程吧。

如图所示,panasonic遥控器的波形是这样的(经过反复测试的结果)。

开始位是以3.6ms低电平然后是3.6ms高电平,然后数据表示形式是0.9ms低电平0.9ms 高电平周期为1.8ms表示“0”,0.9ms低电平2.4ms高电平周期为3.3ms表示“1”,编写程序时,以大于3.4ms小于3.8ms高电平为起始位,以大于2.2ms小于2.7ms高电平表示“1”,大于0.84ms小于1.11ms高电平表示“0”。

因此,我们主要用单片机测量高电平的长短来确定是“1”还是“0”即可。

定时器0的工作方式设置为方式1:mov tmod,#09h,这样设置定时器0即是把GATE置1,16位计数器,最大计数值为2的16次方个机器周期,此方式由外中断INT0控制,即INT0为高时才允许计数器计数。

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解码方法二你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。

自己写的51单片机的红外线遥控接收程序(C语言)

自己写的51单片机的红外线遥控接收程序(C语言)

//51单片机做的红外遥控实验(C语言)#include<reg51.h>#define u8 unsigned char#define u16 unsigned int#define ID 0x00 //本遥控器的ID号sbit ir=P3^3;code u8 seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9的段码code u8 s[]={1,0x40,0x48,0x04,0x02,0x05,0x54,0x0A,0x1E,0x0E}; u8 buf[4];bit ir_f=0;u8 nu;void delay(u16 x){while(x--);}void show(u16 x){u8 i=0,k=0;u8 s[4];kk:s[i]=x%10;if((x/10)>=1){x=x/10;i++;goto kk;}k=i+1;for(i=0;i<k;i++){P0=seg[s[i]];P2=~(8>>i);delay(300);P0=0XFF;P2=0XFF;}}void timer0_init(){TH0=0;TL0=0;TMOD|=0x01;TR0=0;}u16 low_test(){u16 t;TR0=1;while((ir==0)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0; //t=(TH*256+TL0);//机器周期数return t;}u16 high_test(){u16 t;TR0=1;while((ir==1)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0;return t;}/*u16 time_test(bit x){}*/u8 receive_8bit(){u8 d,i;u16 t;for(i=0;i<8;i++){t=low_test();t=high_test();d>>=1;if((t>=2750)&&(t<=3100)){d|=0x80;}}return d;}void ir_decode(){u16 t;u8 i;if(ir==0)//有遥控信号{t=low_test();//8295-9000us,倍频的是16590-18000if((t>=14500)&&(t<=18000))//检查引导码低电平时间{t=high_test();if((t>=8000)&&(t<=9000))//检查高电平{for(i=0;i<4;i++){buf[i]=receive_8bit();}if(buf[0]==(~buf[1]))//检查系统码是否正确{if(buf[0]==ID){if(buf[2]==(~buf[3])){//具体按键处理ir_f=1; //遥控有效}}}}}}}/*void key(){if(buf[2]==0x40){P1^=(1<<0);}if(buf[2]==0x48){P1^=(1<<1);}}*/void ir_execuse(){if(ir_f==1){switch(buf[2]){case 0x40:P1^=(1<<0);break;case 0x48:P1^=(1<<1);break;case 0x04:P1^=(1<<2);break;case 0x02:P1^=(1<<3);break;case 0x05:P1^=(1<<4);break;case 0x54:P1^=(1<<5);break;case 0x0A:P1^=(1<<6);break;case 0x1E:P1^=(1<<7);break;}ir_f=0;}}void show_d(){u8 j;for(j=0;j<10;j++){if(s[j]==buf[2]){nu=j;break;}}show(nu);}void isr_init(){EA=1;EX1=1;//外部中断,一直看3.3有没有下降沿。

51红外遥控原理

51红外遥控原理

51红外遥控原理红外遥控技术是一种利用红外线进行远程无线控制的技术,广泛应用于家电、电视、空调、音响等设备上。

其原理是利用红外线的特性进行信息的传输与解码。

首先,红外遥控的原理基于红外线的传播特性。

红外线是一种波长较长的电磁辐射,其波长范围为0.75微米到1000微米。

红外线具有穿透力强、传播速度快、直线传播等特点,且几乎不受可见光的影响。

因此,红外线可以穿透透明的物体,如玻璃、塑料等,而不能穿透不透明的物体,如墙壁等。

在红外遥控中,遥控器是发射器,被控制的设备是接收器。

遥控器中包含一个红外线发射二极管,通过对其通电激活,在发射二极管前方会形成一个红外线发射区域。

而被控制的设备中则装有一个红外线接收头,用于接收发射器发出的红外线信号。

红外遥控的工作过程一般分为发射和接收两个步骤。

在发射过程中,当用户按下遥控器上的某个按键时,遥控器会从内部的码库中选择相应的红外线编码,通过发射二极管产生红外线信号。

这个红外线信号包含了具体的操作指令,如开关、音量调节、频道切换等。

发射二极管将红外线信号发出,在空气中以光的形式传播,然后被被控设备的红外线接收头接收。

在接收过程中,被控设备接收到红外线信号后,红外线接收头会将红外线转换为电信号,并将其传送给设备的中央处理芯片。

中央处理芯片会进行解码操作,将接收到的红外线信号解码成对应的指令。

然后,中央处理芯片根据解码结果执行相应的操作,控制设备的开关、音量、频道等。

例如,如果用户按下遥控器上的音量加键,中央处理芯片会解码出音量加的指令,并相应地改变设备的音量。

总体来说,红外遥控的原理是通过发射器发出红外线信号,经过空气传播到接收器,接收器将红外线信号转换成电信号并进行解码,最终通过中央处理芯片控制设备的操作。

通过这种原理,用户可以远程操控各种设备,实现便捷的家电控制。

需要注意的是,不同厂商之间的红外编码方式可能存在差异,这就需要设备的红外接收头能够识别出不同编码方式,并将其转换为标准的电信号进行解码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)
{
}
}
void inter0() interrupt 0 //开始解码
{
EX0=0;//关闭外部中断0,不再接受红外信号,只解码当前的红外信号。
dingshiqi();//定时器记高低电平时间,引导码
if((LowTime>8500)&&(LowTime<9500)&&(HighTime>3600)&&(HighTime<5000))
TR0=0;//关闭定时器T0
HighTime=TH0*256+TL0;//保存高电平长度
}
void main()
{
char i=0;
TMOD=0x01;//定时器T0作为定时模式
ET0=1;//开T0中断
IT0=0;//外部中断,下降沿触发
EX0=1;//开外部中断
EA=1;//开总中断
init_1602();
temp=temp|0x80;
}
z[i]=temp;//将解码出的字节值储存在a[i]
}
if(z[2]=~z[3])
{
led2=~led2;
x=z[2];
init_anjian();
switch(x)
{
case 0x45:a=1;//CH-
break;
case 0x46:b=1;//CH
break;
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);
case 0x47:c=1;//CH+
break;
case 0x44:d=1;//<<<<
break;
case 0x40:e=1;//>>>>
break;
case 0x43:f=1;//>>||
break;
case 0x07:g=1;//-
break;
case 0x15:h=1;//+
break;
case 0x09:i=1;//EQ
while(ir==0);//如果是低电平就等待,给低电平计时
TR0=0;//关闭定时器T0
LowTime=TH0*256+TL0;//保存低电平时间
TH0=0;//定时器高八位置0
TL0=0;//定时器低八位置0
TR0=1;//开启定时器0
while(ir==1);//如果是高电平就等待,给引导码高电平计时
ge=datБайду номын сангаас%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void dingshiqi()//定时器记高低电平时间
{
TH0=0;//定时器高八位置0
TL0=0;//定时器低八位置0
TR0=1;//开启定时器0
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"};
//如果是引导码,就开始解码,否则放弃,引导码的低电平计时
//次数=9000us/1=9000,判断区间:(8300-500=7800,8300+500=8800)
{
uchar i,j;
uchar temp;
//led=~led;
for(i=0;i<4;i++) //连续读取4个用户码和键功能码
{
for(j=0;j<8;j++)//每个码有8位数字
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()//初始化按键
红外遥控解解码程序
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P1^0;
sbit rs=P1^2;
sbit ir=P3^2;
sbit led=P1^3;
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;
相关文档
最新文档