|
本帖最后由 PROTUSE 于 2018-6-24 19:20 编辑
本设计采用51单片机作为遥控发射接收芯片,HS003B作为红外一体化接收发射管,在此基础上设计了一个简易的智能红外遥控系统。系统包括接收和发射两大部分,发射部分有16个按键,接收部分含有8盏彩色LED灯、一片二位数码管和蜂鸣器系统。发射部分通过键盘扫描判断哪个键被按下,经过单片机编码程序进行编码,控制红外发射电路发送信号。接收部分解码信号,实现相应的输出。本设计方案结合红外遥控设计简单、作方便、成本低廉等特点。 总体方案
红外遥控系统由红外发射装置和红外接收设备两大部分组成。红外发射装置又由键盘电路、红外编码芯片、电源和红外发射电路组成。红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。 红外接收端主要包括红外接收模块和解调单片机。其中,红外线接收模块包括光电转换放大器和解调电路。
软件设计
遥控码的发射
当某个操作按键按下时,单片机先读出键值,然后根据键值设定遥控码的脉冲个数,再调制成38kHz方波由红外线发光管发射出去。
通常,红外遥控是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。为了提高抗干扰性能和降低电源消耗,将上述的遥控编码脉冲对频率为38KHz(周期为26us)的载波信号进行脉幅调制(PAM),再经缓冲放大后送到红外发光管,将遥控信号发射出去。
红外信号发射过程:首先发射9ms高电平和4.5ms低电平的引导码,再发送16位地址码的前8位,16位地址码的后8位,8位按键数据和8位按键数据反码。
在实践中,采用红外线遥控方式时,由于受遥控距离,角度等影响,使用效果不是很好,如采用调频或调幅发射接收码,可提高遥控距离,并且没有角度影响。
发射控制程序由主程序和键扫描程序、编码发送程序组成,在主程序中,采用键扫描子程序完成各个按键的功能,遥控发射主程序的流程图 红外接收
红外遥控解码程序主要工作为等待红外线信号出现,并跳过引导信号,搜集连续32位的编码数据,并存入内存的连续空间。其位信号判别的原则是:以判断各个位的波宽信号来决定高低信号(0或1)。
位解码原理如下: 1)解码为0:高电平宽度0.56ms+低电平宽度0.56ms。 2)解码为1:高电平宽度0.56ms+低电平宽度1.68ms。
编码数据读取后,经过单片机将编码数据与键盘代码进行比对,即可解调出具体的按键值,便可知按下哪个键,而做出相应的控制处理,完成红外遥控的动作。 发射程序
附上proteus仿真工程 程序 论文
单片机源程序如下:
- #include <REG51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define SBM 0x80
- #define m9 (65536-9000)
- #define m4_5 (65536-4500)
- #define m1_6 (65536-1630)
- #define m_65 (65536-580)
- #define m_56 (65536-560)
- #define m40 (65536-40000)
- #define m56 (65536-56000)
- #define m2_25 (65536-2250)
- sbit IR = P3^6;
- sbit LED = P3^7;
- uchar KEY(void);
- void SanZhuan(void);
- void ZZ(uchar x);
- void Z0(uchar temp);
- void TT0(bit BT,uint x);
- void YS(uchar time);
- void main(void)
- { TMOD = 0x01;
- IR=1;
- while(1)
- {SanZhuan();}
- }
- uchar KEY(void)
- {uchar H,L;
- H=0;
- L=0;
- P1 = 0xf0;
- if(P1!= 0xf0)
- { YS(10);
- if(P1!=0xf0)
- {H = P1&0xf0;
- P1 = 0x0f;
- L = P1&0x0f;
- }
- return (H+L);
- }
- return 0;
- }
- void SanZhuan(void)
- { uchar v;
- v = KEY();
- switch(v)
- {case 0x77:ZZ(0x01);v=0;break;
- case 0xb7:ZZ(0x02);v=0;break;
- case 0xd7:ZZ(0x03);v=0;break;
- case 0xe7:ZZ(0x04);v=0;break;
- case 0x7b:ZZ(0x05);v=0;break;
- case 0xbb:ZZ(0x06);v=0;break;
- case 0xdb:ZZ(0x07);v=0;break;
- case 0xeb:ZZ(0x08);v=0;break;
- case 0x7d:ZZ(0x09);v=0;break;
- case 0xbd:ZZ(0x10);v=0;break;
- case 0xdd:ZZ(0x11);v=0;break;
- case 0xed:ZZ(0x12);v=0;break;
- case 0x7e:ZZ(0x13);v=0;break;
- case 0xbe:ZZ(0x14);v=0;break;
- case 0xde:ZZ(0x15);v=0;break;
- case 0xee:ZZ(0x16);v=0;break;
- default:v=0;
- }
- }
- void ZZ(uchar x)
- { TT0(1,m9);
- TT0(0,m4_5);
- Z0(SBM);
- Z0(~SBM);
- Z0(x);
- Z0(~x);
- TT0(1,m_65);
- TT0(0,m40);
- while(KEY())
- { TT0(1,m9);
- TT0(0,m2_25);
- TT0( 1,m_56);
- TT0(0,m40);
- TT0(0,m56);
- LED = !LED;
- }
- LED = 1;
- }
- void Z0(uchar temp)
- { uchar v;
- for (v=0;v<8;v++)
- { TT0(1,m_65);
- if(temp&0x01) TT0(0,m1_6);
- else TT0(0,m_56);
- temp >>= 1;
- }
- }
- void TT0(bit BT,uint x)
- {
- TH0 = x>>8;
- TL0 = x;
- TF0=0;
- TR0=1;
- if(BT == 0) while(!TF0);
- else while(1)
- {
- IR = 0;
- if(TF0)break;
- if(TF0)break;
- IR = 1;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- }
- TR0=0;
- TF0=0;
- IR =1;
- }
- void YS(uchar time)
- { uchar i,j;
- for(i=0; i<time; i++)
- for(j=0; j<247; j++)_nop_();
- }
- 接收程序
- #include<reg51.h>
- sbit IRIN=P3^2;
- sbit SPK=P0^0;
- sbit RELAY=P2^7;
- sbit P3_0=P3^0;
- sbit P3_1=P3^1;
- unsigned char IRDATA[7];
- unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90};
- unsigned char X1,X2;
- void IRZ();
- void XSQ();
- void main()
- { EA=1;
- EX0=1;
- IT0=1;
- P1=0xff;
- P2=0xc0;
- P3_0=0;
- P3_1=0;
- SPK=1;
- IRIN=1;
- IRZ();
- XSQ();
- }
- void delay(unsigned char x)
- { unsigned char i;
- while(x--)
- {for(i=0;i<10;i++){}}
- }
- void fs_d()
- {unsigned char i;
- for(i=0;i<100;i++)
- {delay(4);
- SPK=~SPK;
- }
- SPK=1;
- }
- void IR_IN() interrupt 0 using 0
- { unsigned char j,k,n=0;
- EX0=0;
- delay(20);
- if(IRIN==1)
- {EX0=1;
- return;
- }
- while(!IRIN){delay(1);}
- for(j=0;j<4;j++)
- {for(k=0;k<8;k++)
- {while(IRIN) {delay(1);}
- while(!IRIN) {delay(1);}
- while(IRIN)
- {delay(1);
- n++;
- if(n>=30)
- { EX0=1;
- return;}
- }
- IRDATA[j]=IRDATA[j]>>1;
- if(n>=8){IRDATA[j]=IRDATA[j]|0x80;}
- n=0;}
- }
- if(IRDATA[2]!=~IRDATA[3])
- {EX0=1;
- return;
- }
- else {}
- fs_d();
- EX0=1;
- }
- void XSQ()
- { while(1)
- { X1 =IRDATA[2]/16;
- X2 =IRDATA[2]%16;
- P3_0=1;P3_1=1;P2=tab[X1];P3_0=1;delay(200);
- P3_0=1;P3_1=0;P2=tab[X2];delay(200);
- }
- }
- void IRZ()
- { while(1)
- {
- switch(IRDATA[2])
- { case 0x01:{P1=0xee;break;}
- case 0x02:{P1=0xdd;break;}
- case0x03:{P1=0xbb;break;}
- case 0x04:{P1=0X77;break;}
- case0x05:{P1=0xf0;break;}
- case0x06:{P1=0x0f;break;}
- case 0x07:{P1=0xaa;break;}
- case 0x08:{P1=0x55;break;}
- case0x09:{P1=0xe7;break;}
- case 0x10:{P1=0xdb;break;}
- case0x11:{P1=0xbd;break;}
- case 0x12:{P1=0x7e;break;}
- case0x13:{P1=0xc3;break;}
- case0x14:{P1=0x3c;break;}
- case0x15:{P1=0x00;break;}
- case0x16:{P1=0xff;break;}
- }
- X1 = IRDATA[2]/16;
- X2 = IRDATA[2]%16;
- P2=tab[X2];P3_1=1;delay(10);P3_1=0;
- P2=tab[X1];P3_0=1;delay(10);P3_0=0;
- }
- }
复制代码
|
评分
-
查看全部评分
|