红外遥控接收程序

合集下载

基于AT89C51的红外接收程序

基于AT89C51的红外接收程序

#include <AT89X51.H>#define uchar unsigned charsbit int0=P3^2;sbit k0=P2^0;sbit k1=P2^1;sbit k2=P2^1;sbit k3=P2^3;sbit k4=P2^4;sbit k5=P2^5;sbit k6=P2^6;sbit k7=P2^7;uchar temp=0x00;uchar temp1=0x00;void delay60ms(void) {unsigned char i,j;for(i=120;i>0;i--)for(j=248;j>0;j--);}void delay15min(void){unsigned char i,j,k;for(k=1500;k>0;k--)for(i=120;i>0;i--)for(j=248;j>0;j--);}void delay45min(void){unsigned char i;for(i=3;i>0;i--)delay15min();}void delay60min(void){unsigned char i;for(i=4;i>0;i--)delay15min();}void delay90min(void){unsigned char i;for(i=6;i>0;i--)delay15min();}void delay30min(void){unsigned char i;for(i=2;i>0;i--)delay15min();}void delay10ms (void){unsigned char i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}void dingshi(temp1){unsigned char count=0;while(1){ if(temp1==0){delay10ms();if(temp1==0){count++;if(count==5){count=0;}while(temp1==0);}switch(count){case 0:delay15min();break;case 1:delay30min();break;case 2:delay45min();break;case 3:delay60min();break;case 4:delay90min();break;}P2=0;}}}void panduan (temp){while(1){switch(temp){case 0x01: k0=0;case 0x02 :k1=0;case 0x03 :k3=0;case 0x04 :k4=0;case 0x05 :k5=0;case 0x06 :dingshi(temp);}}}void main(void){while(1)receive();{uchar i;for(i=0;i<8;i++){temp<<=1;if (int0!=0)temp=0x01;}for(i;i<16;i++){temp1<<=1;if (int0!=0)temp=0x01;}if(temp==0x47)delay60ms();if(temp==0x47){if(temp1==0x07)k7=0;else if(temp1==0x09)P2=0;elsepanduan(temp1);}}}//遥控器:M50462AP - JINXING - 30个按键//单片机:STC89C51RC//晶振:11.0592MHz//红外接收:1838/*--------------------------------------------------------------*/#include <reg52.H>/*--------------------------------------------------------------*///红外接口定义sbit IRDA = P1^4;unsigned char T_C; //50us计数次数46#define D_ERROR 5 //容错值sbit ser=P2^1; //595串行数据输入sbit srclk=P2^2; //移位时钟sbit rclk=P2^3; //锁存时钟unsigned char idata LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//共阳极段码表说明void outbyte(unsigned char a,unsigned char b){ unsigned char j;for(j=0;j<8;j++) //位码移位串行输出{ if(a&0x80) ser=1; else ser=0; a=a<<1;srclk=0; //595移位脉冲srclk=1; }for(j=0;j<8;j++) //段码移位串行输出{ if(b&0x80) ser=1; else ser=0;b=b<<1;srclk=0; srclk=1; }rclk=0; //595锁存脉冲rclk=1; }void T0_init(void){ TMOD |= 0x02; TH0 = 0xd2;TL0 = 0xd2; IE |= 0x82;TR0 = 1;}void T0_intservice(void) interrupt 1{ T_C++; }void main(void){ unsigned char i, j;unsigned char IRDA_dat[2];T0_init();while(1){ for(j = 0; j < 2; j++){ while(IRDA); //1for(i = 0; i < 8; i++){ T_C = 0;while(!IRDA); //0 0.25mswhile(IRDA); //1 0.75ms-0/1.75ms-1if((T_C > (40 - D_ERROR)) && (T_C < (40 + D_ERROR))) {IRDA_dat[j] >>= 1; IRDA_dat[j] |= 0x80;} //1else if((T_C > (20 - D_ERROR)) && (T_C < (20 + D_ERROR))) {IRDA_dat[j] >>= 1;} //0 }if(j == 1) while(!IRDA);//0if(IRDA_dat[0] != 0x47) break; //错误处理,引导码是否正确引导码C0~C7由1110XX10组成}outbyte(0x00, ~IRDA_dat[1]);IRDA_dat[0] = 0; IRDA_dat[1] = 0;}}。

红外接收解码原理和源程序

红外接收解码原理和源程序

上述“0”和“1”构成旳32位二进制码经38kHz旳载频进行二次调制以提升发射效率,到达降低电源功耗旳目旳。然后再经过红外发射二极管产生红外线向空间发射,如图。
UPD6121G产生旳遥控编码是连续旳32位二进制码组,其中前16位为顾客辨认码,能区别不同旳电器设备,预防不同机种遥控码相互干扰。芯片厂商把顾客辨认码固定为十六进制旳一组数;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合旳编码。遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身旳连续时间随它包括旳二进制“0”和“1”旳个数不同而不同,大约在45~63ms之间,图4为发射波形图。当一种键按下超出36ms,振荡器使芯片激活,将发射一组108ms旳编码脉冲,这108ms发射代码由一种起始码(9ms),一种成果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据旳反码(9ms~18ms)构成。假如键按下超出108ms仍未松开,接下来发射旳代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)构成。
注:P3.2接旳是外部中断
红外接受头将38K载波信号过虑,得到与发射代码反向接受代码
发射端旳“0”和“1”
红外解码旳关键就是辨认 0和1
Hale Waihona Puke 1. 解码旳关键是怎样辨认“0”和“1”,从位旳定义我们能够发觉“0”、“1”均以0.56ms旳低电平开始,不同旳是高电平旳宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平旳宽度区别“0”和“1”。假如从0.56ms低电平过后,开始延时,0.56ms后来,若读到旳电平为低,阐明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超出1.12ms,不然假如该位为“0”,读到旳已是下一位旳高电平,所以取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。

红外发射接收程序

红外发射接收程序

红外发送调用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;}}}}}。

基于单片机的红外遥控接收电路

基于单片机的红外遥控接收电路

1 引言近年来随着计算机在社会各领域的渗透,单片机的应用正在不断地走向深入,同时也带动传统的控制、检测等工作日益更新。

传统的遥控器大多采用无线电遥控技术,随着科技的进步,红外线遥控技术的进一步成熟,红外遥控也逐步成为了一种被广泛应用的通信和遥控手段。

为了方便实用,传统的家庭电器逐渐采用红外线遥控。

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

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

由于其无法穿透墙壁,故不同房间的家用电器可使用通用的遥控器而不会产生相互干扰;电路调试简单,只要按给定电路连接无误,一般不需任何调试即可投入工作;编解码容易,可进行多路遥控。

红外遥控虽然被广泛应用,但各产商的遥控器不能相互兼容。

当今市场上的红外线遥控装置一般采用专用的遥控编码及解码集成电路,但编程灵活性较低,且产品多相互绑定,不能复用,故应用范围有限。

而本文采用单片机进行遥控系统的应用设计,遥控装置将同时具有编程灵活、控制范围广、体积小、功耗低、功能强、成本低、可靠性高等特点,因此采用单片机的红外遥控技术具有广阔的发展前景。

2 概述2.1 基于单片机的红外遥控系统概述当今社会科学技术的发展与日俱增,人们生活水平也是日益提高,为了减少人们的工作量,所以对各种家用电器、电子器件的非人工控制的要求越来越高,针对这种情况,设计出一种集成度比较高的控制体系是必然的。

现代科技的飞速发展在许多危险、不可近场合也对远程控制提出了越来越高的要求。

单片机是指一个集成在一块芯片上的完整计算机系统。

尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。

同时集成诸如通讯接口、定时器,实时时钟等外围设备。

而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。

红外遥控器接收程序

红外遥控器接收程序

//STC89C52RC//11.0592MHZ#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define TH0_V ALUE 0xc5#define TL0_V ALUE 0xc5 // 定时器计数值#define ANT P2^4 //红外IO口,可任意一个IO//系统变量定义区============================================================volatile unsigned char irr_b=0,s_s=0;//irr_b接收状态指示,s_s显示许可volatile signed long da=0; //32位数据码volatile unsigned char wb=0, a=0; //wb为接收到的位数,a为接收到信号高低电平判断依据volatile unsigned int js=0; //定时器计数volatile unsigned char a1=1,a2=1; //上升沿处理变量void timer_init(void){ET0=0;TMOD=0x02;TCON=0x10;TL0=TL0_VALUE;TH0=TH0_V ALUE;ET0=1;}void timer_start(){TR0=1;EA=1;}void timer0_interrupt(void) interrupt 1 //大约63us中断一次{js++;//判断下降a2=ANT;if (a1>a2){if(irr_b==0) //第一个中断{irr_b=1; //状态为:开始接收js=0;}else if(irr_b==1) //第二个以后的中断{a=js; //读取定时器的值if((170<a)&&(a<240)) //判断是引导,还是数据10.7ms-15.7ms 引导码长13.5ms{wb=0; //数据计数清零da=0; //数据清零js=0; //定时器清零}else //数据{if((8<a)&&(a<25)) //0.5ms-1.57ms 低电平长1.125ms{wb++;js=0;da=(da<<1) ;}else{if((25<a)&&(a<45)) //1.57ms-2.8ms 高电平长2.25ms{wb++;js=0;da=(da<<1) +1 ;}}if(wb>=32) //数据长度够32位{irr_b=0; //状态为停止接收wb=0; //数据计数清零s_s=1; //打开显示许可}}}}a1=a2; //a为两个下降沿之间的时间}void program(void){uchar ds=0,d1;while(1){ds=js;if(ds>250) //定时器超时,接收复位{js=0;irr_b=0;da=0;wb=0;s_s=0;}if(s_s==1) //显示开关打开,开始显示{TR0=0; //关闭全局中断//显示设备码d1=da>>8;d1=da; //把long型的da强制转换为char型的d1switch(d1){case 0xff:P2=0xff;uart_tx(255);break; //停止,灯全灭case 0x9f:P2=0xfe;uart_tx(191);break; //正转,对应的灯亮case 0x5f:P2=0xfd;uart_tx(239);break; //反转,对应的灯亮case 0xaf:P2=0xfb;uart_tx(251);break; //加速,对应的灯亮case 0x6f:P2=0xf7;uart_tx(254);break; //减速,对应的灯亮default:break; }s_s=0; //关闭显示开关TR0=1; //开全局中断}}}void delay_ms(unsigned int i){unsigned int j;while(i--){for(j=0;j<75;j++);}}void uart_init(){TMOD|=0X20; //只把M1置为1,其余位不变,默认为0TH1=0XFD;TL1=0XFD;SCON=0X50; // 设定串行口工作方式PCON&=0XEF; // 波特率不倍增,只把倍增位置0,其他位保持不变,默认为0TR1=1;}void uart_tx(unsigned char txd){SBUF=txd;while(!TI);TI=0;}void uart_cn(unsigned char *cn,unsigned char cn_nub){unsigned char i;for(i=0;i<(cn_nub);i++){uart_tx(cn[i]); //发送数据i_nop_();_nop_();_nop_();_nop_();_nop_(); //无实际意义,后移cpu指针,使指令按字对齐,减少取指令时的内存访问次数}}void main(){timer_init();timer_start();uart_init();EA=1;P2=0xf0;delay_ms(10);program();}。

红外遥控器程序及原理、程序

红外遥控器程序及原理、程序
Data=1;//收到数据 1 } else if(Tim>=10 && Tim<50) {
Data=0;//收到数据 0 }
if(Ok==1) {
hw_jsm<<=1; hw_jsm+=Data;
if(Num>=32)
{ hw_jsbz=1; break }
EXTI_ClearITPendingBit(EXTI_Line15); }
printf_init(); //printf 初始化
while(1)
{
if(hw_jsbz==1) //如果红外接收到
{
hw_jsbz=0;
//清零
printf("红外接收码 %0.8X\r\n",hw_jsm); //打印
hw_jsm=0;
//接收码清零
}
}
}
1.1 红外遥控简介简介 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低, 成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用 到计算机系统中。 由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在 设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控 频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器, 可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以 及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影 响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电 器,也不会影响临近的无线电设备。 红外遥控的编码目前广泛使用的是: NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM(脉冲位置调制)。 普中科技 STM32 开发板配套的遥控器使用的是 NEC 协议,其特征如下: 1、 8 位地址和 8 位指令长度; 2、地址和命令 2 次传输(确保可靠性) 3、 PWM 脉冲位置调制,以发射红外载波的占空比代表“ 0”和“ 1”; 4、载波频率为 38Khz; 5、位时间为 1.125ms 或 2.25ms; NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms ( 560us 脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms( 560us 脉冲+560us 低 电平) 。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样, 我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。 NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步 码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制 反 码均是 8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的 可靠性(可 用于校验)。 2.数据码格式 数据格式包括了引导码、用户码、数据码和数据码反码,编码总占 32 位。数据反码是数据 码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电 路中被设置成第一段用户码的反码。

5104红外接收程序

5104红外接收程序

5104红外接收程序//cmd_state 起始码、用户码、指令码所处的状态标志//cmd_data 指令码7位数据存储器//cmd_start 起始码接收完毕标志//cmd_admin 用户码接收完毕标志//cmd_bit 端口中断或定时器溢出中断接收到的一位数据,该数据有三种状态:1、0、错误static volatile uchar cmd_state,cmd_data;static volatile bit cmd_start,cmd_admin;void IntCmd(){if(!cmd_start) //若起始码未接收到,则先持续处理起始码{if(cmd_bit==1){switch (cmd_state){case 1:cmd_state=2;break; //1 1case 2:cmd_state=2;break; //1 1 1时,舍弃第一个接收到的1 default:cmd_state=1;break; //1 否则,认为是起始码的第一个bit }}else if(cmd_bit==0){switch (cmd_state){case 2:cmd_state=3;break; //1 1 0 正确的起始码default:cmd_state=0;break; //?? ?? ?? ??(全部字节不对,)}}else cmd_state=0; //若接收到的是错误位,则清除起始码的侦测记录if(cmd_state==3) //得到完整的起始码{cmd_state=0;cmd_admin=0;cmd_start=1;}}else{if(!cmd_admin){if(cmd_bit==1){if(cmd_state==1){cmd_state=0;cmd_data=0;cmd_admin=1;}else cmd_state=1;}else //若用户码出现0或者错误位,则重置起始码{cmd_state=0;cmd_start=0;}}else{if(cmd_bit==1||cmd_bit==0){cmd_data=(cmd_data<<1)|cmd_bit;cmd_state++;if(cmd_state==7){cmd_state=0;cmd_start=0;cmd_admin=0;switch (cmd_data){case 0X01:Key1=1;break; //第1个键按下每个按键可以用按键时间来替换,当倒计时为0时,自动清除按键标志。

电视机红外遥控和接收的制作(完整的电路、程序、照片)

电视机红外遥控和接收的制作(完整的电路、程序、照片)
红外遥控器的原理到处是,这里就不多废话了,直接上图:
程序:
#include<reg52.h> #include<intrins.h> #include<stdio.h>
#define uint unsigned int #define uchar unsigned char
sbit ir=P3^2 ; //红外端口 sbit P2_0=P2^0 ; //LED1 端口
} }
红外发射原理图:
晶振用的是 22.1184M
三级管驱动红外发射电路: 红外发射程序如下:(参考网上程序)
R16 另一边接 P1.0
#include <reg52.h> #define uint unsigned int #define uchar unsigned char bit irout;//红外管状态 sbit ir=P1^7;//红外发射管控制脚 uint count, set_count;//中断计数,设定中断次数 bit flag,keyflag;//红外发送标志,按键标志位 uchar irsys[4]={0x1a,0xa1,0xdc,0x03};//26 位系统码,最后一个字节只用 2 位 uchar ircode,irdata; /********************************************** 延时 1ms ***********************************************/
} } } }
/************************************* 主程序
*************************************/ void main() {
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include "remote.h"
UINT IrCode; //高8位为系统码,低八位为数据码
/*************************************************************************** *FUNCTION NAME: DelayIr
*CREATE DATE: 2012/6/7
*CREATED BY: XS
*FUNCTION: IR采样延时:0.14ms
*MODIFY DATE: 2012/6/7
*INPUT: 无
*
*RETURN: 无
***************************************************************************/ void DelayIr(UCHAR timer)
{
UCHAR i;
while(timer--)
{
for (i = 0; i<13; i++);
}
}
/*************************************************************************** *FUNCTION NAME: RemoteDecode
*CREATE DATE: 2012/6/7
*CREATED BY: XS
*FUNCTION: IR遥控解码
*MODIFY DATE: 2012/6/7
*INPUT: 无
*
*RETURN: 无
***************************************************************************/ void RemoteDecode(void)
{
UCHAR i,j,n = 0;
UCHAR irDat[4] = {0};
EX0 = 0;
DelayIr(1);
if (IRIN==1)
{
EX0 = 1;
return;
}
DelayIr(29);
if (IRIN==1)
{
EX0 = 1;
return;
}
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。

{
DelayIr(2);
}
for (i=0;i<4;i++) //收集四组数据
{
for (j=0;j<8;j++) //每组数据有8位
{
while (IRIN) //等IR 变为低电平,跳过4.5ms的前导高电平信号。

{
DelayIr(2);
}
while (!IRIN) //等IR 变为高电平
{
DelayIr(2);
}
while (IRIN) //计算IR高电平时长
{
DelayIr(2);
n++;
if (n>=30) //0.14ms计数过长自动离开。

{
EX0 = 1;
return;
}
} //高电平计数完毕
irDat[i] = irDat[i] >> 1; //数据最高位在前
if (n>=8)
irDat[i] = irDat[i] | 0x80; //数据最高位补“1”
n = 0;
}
}
// if (irDat[2] != ~irDat[3]) //数据码与其反码比较
// {
// EX0 = 1;
// return;
// }
IrCode = (irDat[2]<<8) + irDat[3];
EX0 = 1;
}
/*************************************************************************** *FUNCTION NAME: ExitInt0
*CREATE DATE: 2012/6/8
*CREATED BY: XS
*FUNCTION: 红外遥控解码:NEC码:系统码+系统反码+数据码+数据反码
*MODIFY DATE: 2012/6/8
*INPUT: 无
*RETURN: 无
***************************************************************************/ void ExitInt0(void) interrupt 0
{
RemoteDecode();
}。

相关文档
最新文档