基于单片机的红外遥控设计与制作13工试2班舒佳章韬略一、设计目的对于本课题的研究,其理论中的价值是对红外线这种电磁波的特性进行更加深入的研究。
同时在与单片机和电子电路的共同作用下,找到单片机及电子电路在实际运用中的更多功能,从而挖掘出红外线和硬件设备结合中的更多可能性。
在现实意义中,对于红外线的使用,它不仅提高了单片机、硬件设备和硬件系统在智能遥控领域的广泛应用,而相对了在硬件设施上使用了红外线的遥控技术,也同时大大拓宽了硬件设施的应用围。
在不久的将来,我相信,人们对于红外遥控控制的运用,会变得越来越广。
二、设计要求基本功能要求:1.以一个单片机作为控制遥控器,另一个单片机控制系统为被遥控对象;2.用遥控器的10个遥控开关,控制遥控对象的10个电源开关通断;3.能实现10个电源开关状态显示;4.能实现定时开关某一个电源开关。
扩展功能:1.能实现灯光亮度连续调节;2.能根据不同电器实现不同时间通断控制;3.其他扩展功能。
三、方案设计3.1红外遥控发射电路的方案采用指令键产生电路产生不同的控制指令,单片机进行状态的编码,直接由单片机的口输出方波信号控制红外发射管进行发射。
红外发射管采用普通的红外发射二极管。
3.2红外遥控接收电路的方案遥控系统采用红外线脉冲个数编码,直接利用单片机软件解码,实现功能的遥控。
3.3单片机的选择本设计所编写的程序比较简单,功能也比较少,所用到的输入输出端口也不是很多,所以我们决定用STC89C52单片机来完成本设计,既方便也很实用。
3.4红外遥控系统电路的原理框图以及各部分作用各部分作用:(1)行列式键盘行列式键盘又称为矩阵式键盘,用I/O线组成行列结构,按键设置在行列的交点上,行列式分别连接到按键开关的两端。
键盘中有无按键按下是由行线送入扫描字及列线读入列线状态字来判断的,有键按下时通过查键并执行键功能程序。
(2)红外线发射电路遥控器信息码由单片机的定时器1中断产生40KHZ红外线方波信号。
由P3.5口输出,经过三极管放大,由红外线发射管发送。
(3)单片机单片机用于输出方波信号控制红外发射电路的工作。
3.5红外接收部分原理框图以及各部分作用各部分作用: (1)+5V电源电路给单片机最小系统、控制电路提供以及红外接收电路提供电压。
(2)红外接收电路红外接收电路把接收到的状态在部进行解码,从而实现不同的功能。
(3)控制电路通过发射电路的按键实现对控制电路的控制作用。
3.6系统硬件电路的设计红外发射电路:红外接收电路:四、遥控发射及接收控制电路的软件设计4.1 软件设计流程图4.1.1键扫描程序流程图相应的按键扫描程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define keyrow P0#define keyline P2uchar code keyv[8]={1,2,4,8}; uchar keyscan(void){uchar keyval,i;keyval=0;keyrow=0xfe;if(keyline!=0xff)for(i=0;i<4;i++)if(~keyline==keyv[i]) keyval=i+1; keyrow=0xfd;if(keyline!=0xff)for(i=0;i<4;i++)if(~keyline==keyv[i]) keyval=i+5; keyrow=0xfb;if(keyline!=0xff)for(i=0;i<4;i++)if(~keyline==keyv[i]) keyval=i+9; keyrow=0xf7;if(keyline!=0xff)for(i=0;i<4;i++)if(~keyline==keyv[i]) keyval=i+13; while(keyline!=0xff);return(keyval);}红外信号发射过程:该遥控器采用脉冲个数编码,不同的脉冲个数代表不同的码,最小为2个脉冲,最大为17个脉冲,为了使接收可靠,第一位码宽为3ms,其余为1ms,遥控码数据帧间隔大于10ms 。
当某个被控电器的电源开关被按下时,单片机先读出键值,然后根据键值设定遥控码的脉冲个数,再调制成40kHz 方波由红外线发光管发身出去。
sbit remoteout=P3^5;extern void delay1ms(uint time);/*************初始化函数***********/void init(void) {remoteout=0;IE=0x00;IP=0x08;TMOD=0x22;TH1=0xf3;TL1=0xf3;EA=1;}/*****************发射函数***********/void send_infrared(uchar keyval){uchar m;ET1=1;TR1=1;delay1ms(3);ET1=0;TR1=0;remoteout=0;for(m=keyval;m>0;m--) {delay1ms(1);ET1=1;TR1=1;delay1ms(1);ET1=0;TR1=0;remoteout=0; }delay1ms(10);}/******************40KHZ发生器************/ void time_intt1(void) interrupt 3 {remoteout=~remoteout; }4.1.3遥控发射主程序流程图遥控发射的主程序流程图:首先初始化程序,然后调用键扫描程序。
相应的发射主程序如下:#include<reg52.h>#define uint unsigned int#define uchar unsigned charextern uchar keyscan(void);extern void init(void);extern void send_infrared(uchar keyval);void delay1ms(uint time) {uint i,j;for(i=0;i<time;i++)for(j=0;j<110;j++);}void main(){uint keyval;init();while(1){keyval=keyscan();while(keyscan());if(keyval) {send_infrared(keyval);}}}4.1.4 中断程序流程图中断过程:首先判断低电平脉宽度是否大于2ms,若脉宽不到2ms,则中断返回;若低电平大于2ms,则接收并对低电平脉冲计数,接下来看判断高电平脉宽度冲是否大于3ms,若脉宽不到3ms,则返回上一接收计数过程;若高电平脉宽大于3ms,则按照脉冲个数至对应功能程序。
此时中断返回。
相应的中断程序如下:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit remotein=P3^1;extern void delay1ms(uint time);uchar value;/***********初始化********/void clearmen(void){EX0=1;EA=1;}/**************外中断遥控接收函数**************/void intt0(void) interrupt 0{ uchar keyval,k,sign;EX0=0;sign=0;keyval=0;if(remotein==0){delay1ms(2);if(remotein==0)while(1){while(remotein==0);keyval++;k=0;delay1ms(1);while(remotein==1){delay1ms(1);k++;if(k>2){value=keyval-1;sign=1;break;}} if(sign) break;}}EX0=1;}4.1.5遥控接收器主程序流程图相应的接收主程序:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intextern void clearmen(void);extern uchar value;uchar temp;void delay1ms(uint time) {uint i,j;for(i=0;i<time;i++)for(j=0;j<110;j++);void youyi(void) //7个流水灯逐个闪动{ uint i;temp=0x01;for(i=0;i<8;i++){P2=~temp;delay1ms(1000);temp<<=1;}}void zuoyi(void) //7个流水灯反向逐个闪动{ uint i;temp=0x80;for(i=0;i<8;i++){P2=~temp;delay1ms(1000);Temp>>=1;}}void quanliang(void){uint i;temp=0xfe;for(i=0;i<8;i++) //7个流水灯依次全部点亮{P2=temp;delay1ms(1000);temp<<=1;}}void fquanliang(void){uint i;temp=0x7f;for(i=0;i<8;i++) //7个流水灯依次全部点亮{P2=temp;delay1ms(1000);Temp>>=1;}void main(){ clearmen();P0=0xff;while(1) {if(value==1) {P2=0xfe;}if(value==2) {P2=0xfd;}if(value==3) {P2=0xfb;}if(value==4 {P2=0xf7;}if(value==5) {P2=0xef;}if(value==6) {P2=0xdf;}if(value==7) {P2=0xbf;}if(value==8) {P2=0x7f;}if(value==9) {P1=0xfe;}if(value==10) {P1=0xfd;}if(value==11) youyi();if(value==12) zuoyi();if(value==13) quanliang();if(value==14) fquanliang();}}五、演示结果当按下键1时,发光二极管LED1亮;当按下键2时,发光二极管LED2亮;当按下键3时,发光二极管LED3亮;当按下键4时,发光二极管LED4亮;当按下键5时,发光二极管LED5亮;当按下键6时,发光二极管LED6亮;当按下键7时,发光二极管LED7亮;当按下键8时,发光二极管LED8亮;当按下键9时,发光二极管LED9亮;当按下键10时,发光二极管LED10亮;当按下键11时,发光二极管LED8-LED1依次渐亮;当按下键12时,发光二极管LED1-LED8依次渐亮;当按下键13时,发光二极管LED8-LED1依次全亮;当按下键14时,发光二极管LED1-LED8依次全亮;附录:1.程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define keyrow P0#define keyline P2uchar code keyv[8]={1,2,4,8};uchar keyscan(void){uchar keyval,i;keyval=0;keyrow=0xfe;if(keyline!=0xff)for(i=0;i<4;i++)if(~keyline==keyv[i]) keyval=i+1;keyrow=0xfd;if(keyline!=0xff)for(i=0;i<4;i++)if(~keyline==keyv[i]) keyval=i+5;keyrow=0xfb;if(keyline!=0xff)for(i=0;i<4;i++)if(~keyline==keyv[i]) keyval=i+9;keyrow=0xf7;if(keyline!=0xff)for(i=0;i<4;i++)if(~keyline==keyv[i]) keyval=i+13;while(keyline!=0xff);return(keyval);}sbit remoteout=P3^5;extern void delay1ms(uint time);/*************初始化函数***********/void init(void) {remoteout=0;IE=0x00;IP=0x08;TMOD=0x22;TH1=0xf3;TL1=0xf3;EA=1;}/*****************发射函数***********/void send_infrared(uchar keyval){uchar m;ET1=1;TR1=1;delay1ms(3);ET1=0;TR1=0;remoteout=0;for(m=keyval;m>0;m--) {delay1ET1=1;TR1=1;delay1ms(1);ET1=0;TR1=0;remoteout=0; } delay1ms(10);}/******************40KHZ发生器************/void time_intt1(void) interrupt 3 {remoteout=~remoteout; }extern uchar keyscan(void);extern void init(void);extern void send_infrared(uchar keyval);void delay1ms(uint time) {uint i,j;for(i=0;i<time;i++)for(j=0;j<110;j++);}void main(){uint keyval;init();while(1){keyval=keyscan();while(keyscan());if(keyval) {send_infrared(keyval);}}接收系统:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit remotein=P3^1;extern void delay1ms(uint time);uchar value;/***********初始化********/void clearmen(void){EX0=1;EA=1;}/**************外中断遥控接收函数**************/ void intt0(void) interrupt 0{ uchar keyval,k,sign;EX0=0;sign=0;keyval=0;if(remotein==0){delay1ms(2);if(remotein==0)while(1){while(remotein==0);keyval++;k=0;delay1ms(1);while(remotein==1){delay1ms(1);k++;if(k>2){value=keyval-1;sign=1;break;}} if(sign) break;}EX0=1;}接收主程序:extern void clearmen(void); extern uchar value;uchar temp;void delay1ms(uint time) { uint i,j;for(i=0;i<time;i++)for(j=0;j<110;j++);}void youyi(void){ uint i;temp=0x01;for(i=0;i<8;i++){P2=~temp;delay1ms(1000);temp<<=1;}}void zuoyi(void){ uint i;temp=0x80;for(i=0;i<8;i++){P2=~temp;delay1ms(1000);Temp>>=1;}}void quanliang(void) {uint i;temp=0xfe;for(i=0;i<8;i++){P2=temp;delay1ms(1000);temp<<=1;}void fquanliang(void){uint i;temp=0x7f;for(i=0;i<8;i++){P2=temp;delay1ms(1000);Temp>>=1;}}void main(){ clearmen();P0=0xff;while(1) {if(value==1) {P2=0xfe;}if(value==2) {P2=0xfd;}if(value==3) {P2=0xfb;}if(value==4 {P2=0xf7;}if(value==5) {P2=0xef;}if(value==6) {P2=0xdf;}if(value==7) {P2=0xbf;}if(value==8) {P2=0x7f;}if(value==9) {P1=0xfe;}if(value==10) {P1=0xfd;}if(value==11) youyi();if(value==12) zuoyi();if(value==13) quanliang();if(value==14) fquanliang();}}2.个人小结这次课程设计我们的题目是设计单片机遥控系统设计,以51单片机为基础通过红外发射与接收装置来实现信息的传递,通过这次课程设计,我学会了红外通信装置的使用以及它们之间编码的设计。