红外线收发程序

合集下载

红外通信1(收发单个字节)程序设计说明

红外通信1(收发单个字节)程序设计说明

“红外通信1(收发单个字节)”程序设计说明1程序设计思路各种通信采用不同的通信协议,如串口通信、485通信、有线网络通信、无线通信等等,通信的协议不同通信的媒介也不一样,红外通信以红外光为通信媒介,将信号加载在红外光上进行传输。

图1 红外发送接收电路连接示意图1.1程序设计关键点(1)发送数据时,红外发光二极管在什么时候需要发光,如何发光?当串口发送0时,红外发光二极管需要发出38kHz的光;当串口发送端发送1时,红外发光二极管不发光。

(2)串口的波特率如何进行设置?由于红外接收头在接收到38kHz的红外脉冲信号一段时间后,才能把信号进行有效转换,故波特率时尽量设低,否则红外接收头接收红外脉冲的时间太短,无法对信号进行转化。

1.2程序工作过程(不包括按键工作过程)1.2.1发送收到发送的命令,在P3.7发出串行信号。

此时定时器T0已被设置为每13us(38kHz)触发一次中断,检测串口发送引脚P3.7的电平高低,若P3.7为低电平, P3.5(红外发送端)电平翻转,否则 P3.5置零(即通过P3.7来控制P3.5是否发出脉冲)。

1.2.2接收(1)红外线接收头接把接收到的红外信号转换成电平输入到接收引脚P3.6,串口1接收到数据;(2)串口8位数据接收完毕,接收方程序从接收缓冲寄存器SBUF中读出接到的数据;(3)把接收内容显示在数码管中。

1.3定时器的使用本程序使用了三个定时器: T0、T1和T2。

(1)T0:设置为13us中断一次,每次检测P3.7的电平高低,决定P3.5是否需要进行电平翻转,从而产生38kHz的红外脉冲。

(2)T1:作为串口1的波特率发生器,不产生中断。

(3)T2:用于控制按键消抖检测和数码管扫描的频率。

注明:因为红接收发容易接收到外界信号,所以在发送前应发出一个收发确认信号,让接收方接收数据。

程序中,发送数据前先发送数据0xca作为发送确认标志。

数据发送完毕后,根据串口1的特点,P3.7引脚会持续输出高电平,此时P3.5引脚持续输出低电平,红外发光二极管不发光。

红外发射接收程序

红外发射接收程序

红外发送调用SendIRdata();while(over==0);地址储存在addr(可根据需要改成发送16位地址,此程序发送的是八位地址,第二地址是第一个的反码)中,hwdata,c,d,over,dat是全局unsigned char ,在等待红外发送完成while(over==0)语句,等待时间为几十ms,可在前面或while中可执行其他程序。

(等待期间不需要执行其他程序也可把while语句放入SendIRdata()末尾)void SendIRdata(unsigned char x){TH1=0xdc;//发送9ms的起始码TL1=0xd8;TR2=1;TR1=1;hwdata=x;over=0;//红外发送结束标志,为1完成}/**************定时器1中断处理***************/void timeint(void) interrupt 3{switch(c){case 0: //起始码4.5msTH1=0xee;TL1=0x6c;TR2=0;c=1;dat=addr;//发送十六位地址的前八位break;case 1:TH1=0xfd; //560us高电平TL1=0xd0;TR2=1;c=2;break;case 2:if(dat&0x01){ TH1=0xf9;TL1=0x5c;}//1.7ms低电平else{ TH1=0xfd;TL1=0xd0;}//560us低电平TR2=0;dat>>=1;d++;c=1;if(d==8)dat=~addr;//发送十六位地址的后八位if(d==16)dat=hwdata;//发送八位数据if(d==24)dat=~hwdata;//发送八位数据的反码if(d==33){over=1;TR1=0;TR2=0;d=0;c=0;}break;}}外中断0 接收,储存在dat[3]全局变量中,hu,time1,time2,h,b,是unsigned char型全局变量,time是unsigned intvoid extern0() interrupt 0 //中断程序{if(hu==0){TL1=0;TH1=0;TR1=1;hu=1;}else{TR1=0;time1=TH1;time2=TL1;TL1=0;TH1=0;TR1=1;time=time1*256+time2;if(start==0){if((14000>time)&&(time>13000))start=1;}else{//if((time>2100)&&(2400>time))//{dat[h]>>=1; dat[h]=dat[h]|0x80;}//else//if((time>1000)&&(1250>time))//dat[h]>>=1;dat[h]>>=1;if((time>2100)&&(2400>time))dat[h]=dat[h]|0x80;b++;if(b>7){ b=0;h++;if(h>3){h=0;start=0;hu=0;if(dat[0]!=~dat[1]|| dat[2]!=~dat[3])dat[2]=0;}}}}}。

自己写的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有没有下降沿。

红外接收程序讲解

红外接收程序讲解

红外接收程序讲解 TYYGROUP system office room 【TYYUA16H-TYY-TYYYUA8Q8-红外接收程序讲解1、红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。

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

下面,我们将使用下面两种设备:另外,使用51单片机进行解码。

2、原理图从原理图看出,IR的data脚与51的PD2相连。

2、红外发射原理要对红外遥控器所发的信号进行解码,必须先理解这些信号。

a) 波形首先来看看,当我们按下遥控器时,红外发射器是发送了一个什么样的信号波形,如下图:由上图所示,当一个键按下超过22ms,振荡器使芯片激活,将发射一组108ms的编码脉冲(由位置1所示)。

如果键按下超过108ms仍未松开,接下来发射的代码(连发代码由位置3所示)将仅由起始码(9ms)和结束码()组成。

下面把位置1的波形放大:由位置1的波形得知,这108ms发射代码由一个起始码(9ms),一个结果码(),低8位地址码(用户编码)(9ms~18ms),高8位地址码(用户编码)(9ms~18ms),8位数据码(键值数据码)(9ms~18ms)和这8位数据的反码(键值数据码反码)(9ms~18ms)组成。

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

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

XS-091遥控板的0和1采用PWM方法编码,即脉冲宽度调制。

下图为一个发射波形对应的编码方法:放大0和1的波形如下图:这种编码具有以下特征:以脉宽为、间隔、周期为的组合表示二进制的“0”;以脉宽为、间隔、周期为的组合表示二进制的“1”。

3、红外接收原理a) 波形红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:放大,位定义0和位定义1波形如下:4、解码原理及算法注:代码宽度算法:16位地址码的最短宽度:×16=18ms 16位地址码的最长宽度:×16=36ms可以得知8位数据代码及其8位反代码的宽度和不变:(+)×8=27ms所有32位代码的宽度为(18ms+27ms)~(36ms+27ms)对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码。

红外收发模块51单片机程序部分

红外收发模块51单片机程序部分

深圳市技新电子科技有限公司www.jixin.pro红外收发模块51单片机程序部分V1.0.0.0红外收发模块51单片机程序部分1、红外收发原理介绍1.1红外接收头决定了通信的频率是38KHZ红外通信模块发射红外光的频率是38KHZ,这个频率是由红外接收探头决定的,市场上还有其他频率的产品这里不讨论。

技小新的红外收发模块上面用的接收头就是这种38KHZ 的,型号是IRM-3638T。

红外发射的探头没有这个频率限制,所以可以用单片机自由控制。

1.2红外通信的流程单片机A控制红外发光管,发射38KHZ频率的光,同时遵守一定的通信规则,比如电影里常见的“摩斯密码”。

红外接收头连接着单片机B,红外接收头收到红外光后会输出一连串的高低电平到单片机B,单片机B根据“摩斯密码”的规则解码。

这样就完成了一次红外通信。

1.3红外载波调制的约定我们使用的通信方式叫做载波调制。

(1)由于发射频率是38KHZ,很容易得出发射一个信号的周期是26.3uS.(2)对于发射端:“载波发射”一个周期是,发光8.77uS+不发光17.53uS。

“载波不发射”一个周期是,26.3uS不发光。

(3)对于接收端:如果收到了一个“载波发射”信号,输出低电平26.3uS。

如果收到了一个“载波不发射”信号(其实就是没有收到信号),输出高电平26.3uS。

真正使用时候要发送一连串的“载波发射”和“载波不发射”,这样接收端输出的是连续的脉冲。

(注意,仅仅一个“载波发射”并不能让接收端正确输出。

)1.4NEC_upd6121红外通信协议。

这是很多遥控器厂商都在使用的协议。

它的协议约定如下:(1)引导码:342个连续“载波发射”+171个“载波不发射”。

接收端的反应是9mS的低电平+4.5mS的高电平。

(2)数据“0”表示为:21个连续“载波发射”+21个连续“载波不发射”。

接收端的反应是:0.56mS的低电平+0.56mS的高电平。

(3)数据“1”表示为:21个连续“载波发射”+64个连续“载波不发射”。

红外收发程序

红外收发程序

#include "reg51.h"#define uchar unsigned char#define uint unsignedint//用单片机来模拟发送SAA3010数据码//作者:全立波,quanlibo@ucharsendstart=3; //起始位2位+控制位1位+系统位6位=8位,其中起始两位为1,其它各为均为0ucharsenddatas=1; //数据位为6位,这里只用该字节的前6位uchar count=0;sbit P1_0=P1^0; //用来控制红外发光二极管来发送数据bit sendflag=0; //发送数据的标志量void Init();void sendData();uchardatas[28];void main(void){Init();while(1){if(sendflag==1){//串口不允许中断ET1=0;TR1=0;ES=0;//一个周期是26.32us,那么一个周期的一半应该是13us,所有的错误全部都在这里(看来网上发表的文章也是一些理论没有真正实践过)//12MHZ,38KHZ//TH1=0xf3;//TL1=0xf3;//11.0592MHZ ,38KHZTH1=0xf4;TL1=0xf4;sendflag=0;sendData();}};}//这里定义1位的时间为在 1.651ms,那么半位的时间为1.651ms/2=0.8255ms=825.5us//事先准备要发送的数void sendData(){uchar c=0;uint b=0;//待发送的数据uchar s=0;sendstart=3;//起始码for(c=0;c<8;c++){if(senddatas-(senddatas/2)*2){//为1b=b|1;}else{//为0b=b|0;}if(c<7){b=b<<1;}senddatas=senddatas>>1;}b=b<<8>>2;//做起来真是精细,还要搞掉后面没有被占掉的值,否则数据不准确,做学问真的是不容易啊b=b |sendstart;//下面代码用来装配发送数据c=0;//先发送起始位2位+控制位1位+系统位5位=8位,后面的6位是数据位,共14位//用NPN三极管放大信号do{if(b-(b/2)*2){//发送1的前半位datas[s++]=1;}else{//发送0的前半位datas[s++]=0;}if(b-(b/2)*2){//发送1的后半位datas[s++]=0;}else{//发送0的后半位datas[s++]=1;}//数据循环右移,发送下一位数据b=b>>1;}while(++c<14);//开始发送数据count=0;//12MHZ,延时0.8255ms用//TH0=0xfc;//TL0=0xc6;//11.0592MHZ,延时0.8255ms用TH0=0xfd;TL0=0x07;ET0=1;TR0=1;}void Init(){//刚开始启动不发送P1_0=0;//我们这里利用定时器1的工作方式2(8位自动重载)来发送载波信号TMOD=0x21;EA=1;//总中断允许ES=1;//允许串口中断//串口工作于方式1,8位UART,波特率可变,允许串口接受数据,工作方式为1,无奇偶校验位。

红外接收和发送程序

红外接收和发送程序

遥控发送程序ORG0000HLOOPO: MOV SCON ,#0C0H ;设定串行口工作方式3MOV TMOD , #20H ;T1工作方式2MOV PCON , #00H ;波特率设置MOV TL1 , #OF4H ;定时初始值F4送TL1MOV TH1 , #OF4H ;定时初始值F4送TH1*******************************************************************CP: JB P1.0 ,CPK ;判断遥控按键P1.0是否按下LCALL PP ;调用延时JB P1.0 , CPSTEB TR1 ;启动定时器T1MOV 50H ,#5FH ; 将立即数5FH 送50H 存储单元MOV RO ,#50H;将立即数50H 送RO寄存器MOV R1 , #05H ;将立即数05H送R1寄存器IND: MOV A,@R0 ; 将50H中的5F送累加器AMOV C , PMOV TB8 ,CMOV SBUF ,A;将要发送数据5F送串行数据缓冲器AAA : JNB P1.1 ,ON1 ; P1.1是”0”电平时转至调制程序BBB”JB P1.1 ,CCC ;P1.1是”1”电平等待AMP AAACCC : JBC TI ,CP ;判断发送中断标志位]SETB P1.2 ;P1.2置1AJMP BBBON1: ACALL ONAJMP AAAPP: MOV R6, #05H ;延时子程序100P3: MOV R5 , #OF9HNOPNOP100P4: DJNZ R5 ,100P4DJNZ R6 ,100P3RETON: CP1 P1.2 ;0电平调制程序。

(共有82个CP1 P1.2)RET********************************************************************4、遥控接收程序W AIT: JBC R1 ,LOOP5 ;遥控接收程序LJMP KEYLOOP5: MOV R0 ,#51H;将立即数51H送R0MOV R7 ,#03H ;将立即数03H送R7LOOP6: MOV A ,SBUF ;将串行缓冲器接收到的数据累加器AJNB PSW.0 LOOP7 ;标志位F0清零了吗?JNB RB8 ,LOOP8 ;数据接收完了吗?LOOP9 MOV @RO ,A;开锁处理程序MOV R1 , 51HCJNE R1 ,#1EH ,LPDJNZ 52H , KPCLR P1.7MOV 52H ,# 02HMOV R0 ,#OOHLJMP W AITKP: SETB P1.7MOV R0 ,#00HLJMP W AITLP: DJNZ R7 ,W AITCLR PSW.5LJMP W AITLOOP7: JB RB8 , LOOP8LJMP LOOP9LOOP8: SETB PSW.5 ;给标志位F0置1LJMP W AIT ;继续接收数据。

51单片机红外数据收发程序(NEC标准)

51单片机红外数据收发程序(NEC标准)

发射部分程序:/********************************************************* FUNCTION: 红外数据发送 * DESCRIPTION: * HARDWAER: * PROGRAMMER: XXC * DATE: 2010-9-6 * COPYRIGHT: no * **********************************************************/;---------------------------------------------------------- ;存储空间定义DSEG AT 30HSend BIT P2.0LedSend BIT P2.1;---------------------------------------------------------- ;主程序CSEG AT 0000HORG 0000HAJMP L_MainORG 0030HL_Main: MOV SP,#60HMOV DPTR,#T_SendBufferMOV R1,#08H ;发送1字节数据(先低位后高位)MOV R2,#00H;发送4字节L_Loop1:CLR LedSend ;开LED指示NOPNOPSETB SendLCALL F_Delay4500us ;引导码LCALL F_Delay4500usCLR SendLCALL F_Delay4500usL_Loop2:MOV A,R2MOVC A,@A+DPTRL_Loop3:SETB SendLCALL F_Delay560us ;560usCLR SendRRC AJC L_Next1LCALL F_Delay560usLJMP L_Next2L_Next1:LCALL F_Delay1680usL_Next2:DJNZ R1,L_Loop3INC R2CJNE R2,#04H,L_Loop2SETB Send ;560us高电平结束LCALL F_Delay560usCLR SendSETB LedSend ;关LED指示LJMP $/*INT_Int0:PUSH ACCPUSH PSWCPL LED1POP PSWPOP ACCRETI*/;---------------------------------------------------------- ;延时约4500usF_Delay4500us:MOV R7,#20L_Delay4500:MOV R6,#225DJNZ R6,$DJNZ R7,L_Delay4500RET;---------------------------------------------------------- ;延时约560usF_Delay560us:MOV R7,#2L_Delay560:MOV R6,#140DJNZ R6,$DJNZ R7,L_Delay560RET;---------------------------------------------------------- ;延时约1680usF_Delay1680us:LCALL F_Delay560usLCALL F_Delay560usLCALL F_Delay560usRET;---------------------------------------------------------- ;延时约1sF_Delay1s:MOV R7,#5L_Delay1s1:MOV R6,#200L_Delay1s2:MOV R5,#250DJNZ R5,$DJNZ R6,L_Delay1s2DJNZ R7,L_Delay1s1RET;-----------------------------------------------;红外发送区数据T_SendBuffer:DB 0FH,0F0H ;用户码及反码DB 56H,0A9H ;操作码及反码END ;结束接收部分程序:/********************************************************* FUNCTION: 红外数据接收程序 * DESCRIPTION: * HARDWAER: * PROGRAMMER: XXC * DATE: 2010-9-7 *COPYRIGHT: no * **********************************************************/;---------------------------------------------------------- ;存储空间定义DSEG AT 30HF_Re BIT P3.2LED1 BIT P2.6R_Receive: DS 4 ;红外数据接收空间;---------------------------------------------------------- ;主程序CSEG AT 0000HORG 0000HAJMP L_MainORG 0003H ;INT0入口LJMP INT_Int0ORG 0030HL_Main: MOV SP,#60HSETB EASETB EX0SETB IE0 ;下降沿触发MOV DPTR,#T_CodeL_LoopMain:;------------------------MOV R1,#R_Receive+2MOV A,@R1ANL A,#0FH ;屏蔽高4位MOVC A,@A+DPTRMOV P1,A;------------------------;CPL P2.5;LCALL F_Delay300msLJMP L_LoopMain;---------------------------------------------------------- ;外部中断0;Function: NEC红外解码.黑色遥控器用户码FFH,00H;P3.2接外部中断INT_Int0:PUSH ACCPUSH PSWMOV R0,#R_ReceiveMOV R3,#08HMOV R4,#04HLCALL F_Delay8000usJB F_Re,L_ExitINT0 ;非引导码退出JNB F_Re,$LCALL F_Delay2500usJNB F_Re,L_ExitINT0 ;遇简码退出JB F_Re,$CLR LED1 ;open LED1L_NextBit:JNB F_Re,$LCALL F_Delay840usJB F_Re,L_Next1MOV C,F_ReLJMP L_Next2L_Next1:MOV C,F_ReLCALL F_Delay1100usL_Next2:RRC A ;先收低位DJNZ R3,L_NextBitMOV @R0,AINC R0MOV R3,#08HDJNZ R4,L_NextBitL_ExitINT0:SETB LED1 ;close LED1POP PSWPOP ACCRETI;---------------------------------------------------------- ;延时约8000usF_Delay8000us:MOV R7,#20L_Delay8000:MOV R6,#200DJNZ R6,$DJNZ R7,L_Delay8000RET;---------------------------------------------------------- ;延时约840us。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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);
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);
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);
一般红外电视遥控器的输出都是用编码后串行数据对 38~40kHz 的方波进行 脉冲幅度调制而产生的。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种 遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为 0.565ms、间隔 0.56ms、周期为 1.125ms 的组合表示二进制的“0”;以脉宽为 0.565ms、间隔 1.685ms、周期为 2.25ms 的组 合表示二进制的“1”。
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
void SendIRdata(char p_irdata); void delay();
void main(void) {
count = 0;
flag = 0; OP = 0; P3_4 = 0;
do{ delay(); SendIRdata(12);
}while(1); }
//定时器 0 中断处理 void timeint(void) interrupt 1 {
TH0=0xFF; TL0=0xE6; //设定时值为 38K 也就是每隔 26us 中断一次 count++;
if (flag==1) {
制作的实物如下图所示:
因为只是实验,所以顾不得外形的美观了,呵呵,不好意思献丑了!
照片中下面的是我电视卡所附的遥控器,中间的为电视卡红外接收头, 上面的电路可用来“代替”原配遥控器来控制电视卡电视频道……
【参考】 1、红外线遥控器解码程序,作者:谢刚 2、自制红外遥控逻辑分析器,作者:广公男生
//停止发送红外信号(即编码中的高电平) if(irdata-(irdata/2)*2) //判断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 {
根据红外编码的格式,发送数据前需要先发送 9ms 的起始码和 4.5ms 的结果码。 遥控串行数据编码波形如下图所示:
接收方一般使用 TL0038 一体化红外线接收器进行接收解码,当 TL0038 接收到 38kHz 红外信号时,输出端输出低电平,否则为高电平。所以红外遥控 器发送红外信号时,参考上面遥控串行数据编码波形图,在低电平处发送 38kHz 红外信号,高电平处则不发送红外信号。
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;
上述“0”和“1”组成的 32 位二进制码经 38kHz 的载频进行二次调制,然后再通过 红外发射二极管产生红外线向空间发射。一般电视遥控器的遥控编码是连续的 32 位二进制码组,其中前 16 位为用户识别码,能区别不同的红外遥控设备,防止不同 机种遥控码互相干扰。后 16 位为 8 位的操作码和 8 位的操作反码,用于核对数据 是否接收准确。
单片机红外电视遥控器电路图如下:
C51 程序代码:
#include <AT89X51.h>
static bit OP;
//红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag; //红外发送标志
//发送 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);
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++) { } } }
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++) {
相关文档
最新文档