V | .. | . | .. |
基于单片机的红外遥控设计与制作
13工试2班 舒佳 章韬略
一、设计目的
对于本课题的研究,其理论中的价值是对红外线这种电磁波的特性进行更加深入的研究。同时在与单片机和电子电路的共同作用下,找到单片机及电子电路在实际运用中的更多功能,从而挖掘出红外线和硬件设备结合中的更多可能性。在现实意义中,对于红外线的使用,它不仅提高了单片机、硬件设备和硬件系统在智能遥控领域的广泛应用,而相对了在硬件设施上使用了红外线的遥控技术,也同时大大拓宽了硬件设施的应用围。在不久的将来,我相信,人们对于红外遥控控制的运用,会变得越来越广。
二、设计要求
基本功能要求:
1.以一个单片机作为控制遥控器,另一个单片机控制系统为被遥控对象;
2.用遥控器的10个遥控开关,控制遥控对象的10个电源开关通断;
3.能实现10个电源开关状态显示;
4.能实现定时开关某一个电源开关。
扩展功能:
. . | . 资料. | . |
V | .. | . | .. |
1.能实现灯光亮度连续调节;
2.能根据不同电器实现不同时间通断控制;3.其他扩展功能。
三、方案设计
3.1红外遥控发射电路的方案
采用指令键产生电路产生不同的控制指令,单片机进行状态的编码,直接由单片机的口输出方波信号控制红外发射管进行发射。红外发射管采用普通的红外发射二极管。
3.2红外遥控接收电路的方案
遥控系统采用红外线脉冲个数编码,直接利用单片机软件解码,实现功能的遥控。
3.3单片机的选择
本设计所编写的程序比较简单,功能也比较少,所用到的输入输出端口也不是很多,所以我们决定用STCC52单片机来完成本设计,既方便也很实用。
3.4红外遥控系统电路的原理框图以及各部分作用
. . | . 资料. | . |
V | .. | . | .. |
各部分作用:
(1)行列式键盘
行列式键盘又称为矩阵式键盘,用I/O线组成行列结构,按键设置在行列的交点上,行列式分别连接到按键开关的两端。键盘中有无按键按下是由行线送入扫描字及列线读入列线状态字来判断的,有键按下时通过查键并执行键功能程序。
(2)红外线发射电路
遥控器信息码由单片机的定时器1中断产生40KHZ红外线方波信号。由P3.5口输出,经过三极管放大,由红外线发射管发送。
(3)单片机
单片机用于输出方波信号控制红外发射电路的工作。
3.5红外接收部分原理框图以及各部分作用
. . | . 资料. | . |
V | .. | . | .. |
各部分作用:(1)+5V电源电路
给单片机最小系统、控制电路提供以及红外接收电路提供电压。
(2)红外接收电路
红外接收电路把接收到的状态在部进行解码,从而实现不同的功能。
(3)控制电路
通过发射电路的按键实现对控制电路的控制作用。
3.6系统硬件电路的设计
. . | . 资料. | . |
V | .. | . | .. |
红外发射电路:
. . | . 资料. | . |
V | .. | . | .. |
红外接收电路:
四、遥控发射及接收控制电路的软件设计
4.1软件设计流程图
4.1.1键扫描程序流程图
. . |
| . |
V | .. | . | .. |
相应的按键扫描程序:
#include<reg52.h>
#defineuint unsigned int
#defineuchar unsigned char
#definekeyrow P0
#definekeyline P2
ucharcode keyv[8]={1,2,4,8};
ucharkeyscan(void)
{
ucharkeyval,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;
. . | . 资料. | . |
V | .. | . | .. |
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);
}
4.1.2遥控码发射程序流程图
. . | . 资料. | . |
V | .. | . | .. |
红外信号发射过程:
该遥控器采用脉冲个数编码,不同的脉冲个数代表不同的码,最小为2个脉冲,最大为17个脉冲,为了使接收可靠,第一位码宽为3ms,其余为1ms,遥控码数据帧间隔大于10ms。当某个被控电器的电源开关被按下时,单片机先读出键值,然后根据键值设定遥控码的脉冲个数,再调制成40kHz方波由红外线发光管发身出去。
. . | . 资料. | . |
V | .. | . | .. |
相应的遥控码发射程序如下:
sbitremoteout=P3^5;
externvoid delay1ms(uint time);
/*************初始化函数***********/
voidinit(void) {
remoteout=0;
IE=0x00;
IP=0x08;
TMOD=0x22;
TH1=0xf3;
TL1=0xf3;
EA=1;
}
/*****************发射函数***********/
voidsend_infrared(uchar keyval)
{
ucharm;
ET1=1;TR1=1;delay1ms(3);ET1=0;TR1=0;remoteout=0;
for(m=keyval;m>0;m--) {
delay1ms(1);
. . | . 资料. | . |
V | .. | . | .. |
ET1=1;TR1=1;delay1ms(1);ET1=0;TR1=0;remoteout=0;
}
delay1ms(10);
}
/******************40KHZ发生器************/
voidtime_intt1(void) interrupt 3 {
remoteout=~remoteout; }
4.1.3遥控发射主程序流程图
遥控发射的 |
| 主程序流程图:首先初始 |
化程序,然后 | 调用键扫描程序。相应 |
的发射主程序如下:
#include<reg52.h>
#defineuint unsigned int
#defineuchar unsigned char
externuchar keyscan(void);
externvoid init(void);
. . | . 资料. | . |
V | .. | . | .. |
externvoid send_infrared(uchar keyval);
voiddelay1ms(uint time) {
uinti,j;
for(i=0;i<time;i++)
for(j=0;j<110;j++);
}
voidmain()
{
uintkeyval;
init();
while(1)
{
keyval=keyscan();
while(keyscan());
if(keyval){send_infrared(keyval);}
}
}
4.1.4中断 | . 资料. | 程序流程图 | . |
. . |
V | .. | . | .. |
中断过程:首先判断低电平脉宽度是否大于2ms,若脉宽不到2ms,则中断返回;若低电平大于2ms,则接收并对低电平脉冲计数,接下来看判断高电平脉宽度冲是否大于3ms,若脉宽不到3ms,则返回上一接收计数过程;若高电平脉宽大于3ms,则按照脉冲个数至对应功能程序。此时中断返回。相应的中断程序如下:
#include<reg52.h>
#include<intrins.h>
#defineuchar unsigned char
#defineuint unsigned int
sbitremotein=P3^1;
externvoid delay1ms(uint time);
ucharvalue;
/***********初始化********/
voidclearmen(void)
{
EX0=1;
EA=1;
. . | . 资料. | . |
V | .. | . | .. |
}
/**************外中断遥控接收函数**************/
voidintt0(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;
}
. . | . 资料. | . |
V | } | if(sign) break; | .. | . | .. |
}
}
EX0=1;
}
4.1.5遥控接收器主程序流程图
相应的接收主程序:
#include<reg52.h>
#include<intrins.h>
. . | . 资料. | . |
V | .. | . | .. |
#defineuchar unsigned char
#defineuint unsigned int
externvoid clearmen(void);
externuchar value;
uchartemp;
voiddelay1ms(uint time) {
uinti,j;
for(i=0;i<time;i++)
for(j=0;j<110;j++);
}
voidyouyi(void) //7 个流水灯逐个闪动
{ uint i;
temp=0x01;
for(i=0;i<8;i++)
{
P2=~temp;
delay1ms(1000);
temp<<=1;
}
}
voidzuoyi(void) //7 个流水灯反向逐个闪动
. . | . 资料. | . |
V | .. | . | .. |
{ uint i;
temp=0x80;
for(i=0;i<8;i++)
{
P2=~temp;
delay1ms(1000);
Temp>>=1;
}
}
voidquanliang(void)
{uinti;
temp=0xfe;
for(i=0;i<8;i++) //7 个流水灯依次全部点亮
{
P2=temp;
delay1ms(1000);
temp<<=1;
}
}
voidfquanliang(void)
. . | . 资料. | . |
V | .. | . | .. |
{
uinti;
temp=0x7f;
for(i=0;i<8;i++) //7 个流水灯依次全部点亮
{
P2=temp;
delay1ms(1000);
Temp>>=1;
}
}
voidmain()
{ 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;} | ||
. . |
V | | .. | . | .. |
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依次全亮;
. . | . 资料. | . |
V | .. | . | .. |
当按下键14时,发光二极管LED1-LED8依次全亮; 附录:
1.程序:
#include<reg52.h>
#defineuint unsigned int
#defineuchar unsigned char
#definekeyrow P0
#definekeyline P2
ucharcode keyv[8]={1,2,4,8};
ucharkeyscan(void)
{
ucharkeyval,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;
. . | . 资料. | . |
V | .. | . | .. |
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);
}
sbitremoteout=P3^5;
externvoid delay1ms(uint time);
/*************初始化函数***********/
voidinit(void) {
remoteout=0;
IE=0x00;
IP=0x08;
TMOD=0x22;
. . | . 资料. | . |
V | .. | . | .. |
TH1=0xf3;
TL1=0xf3;
EA=1;
}
/*****************发射函数***********/
voidsend_infrared(uchar keyval)
{
ucharm;
ET1=1;TR1=1;delay1ms(3);ET1=0;TR1=0;remoteout=0;
for(m=keyval;m>0;m--) {
delay1
ET1=1;TR1=1;delay1ms(1);ET1=0;TR1=0;remoteout=0; }
delay1ms(10);
}
/******************40KHZ发生器************/
voidtime_intt1(void) interrupt 3 {
remoteout=~remoteout; }
externuchar keyscan(void);
externvoid init(void);
. . | . 资料. | . |
V | .. | . | .. |
externvoid send_infrared(uchar keyval);
voiddelay1ms(uint time) {
uinti,j;
for(i=0;i<time;i++)
for(j=0;j<110;j++);
}
voidmain()
{
uintkeyval;
init();
while(1)
{
keyval=keyscan();
while(keyscan());
if(keyval){send_infrared(keyval);}
}
}
接收系统:
#include<reg52.h>
. . | . 资料. | . |
V | .. | . | .. |
#include<intrins.h>
#defineuchar unsigned char
#defineuint unsigned int
sbitremotein=P3^1;
externvoid delay1ms(uint time);
ucharvalue;
/***********初始化********/
voidclearmen(void)
{
EX0=1;
EA=1;
}
/**************外中断遥控接收函数**************/
voidintt0(void) interrupt 0
{ uchar keyval,k,sign;
EX0=0;sign=0;keyval=0;
if(remotein==0)
{
delay1ms(2);
if(remotein==0)
while(1)
{
. . | . 资料. | . |
V | .. | . | .. |
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;
}
接收主程序:
externvoid clearmen(void);
externuchar value;
. . | . 资料. | . |
V | .. | . | .. |
uchartemp;
voiddelay1ms(uint time) {
uinti,j;
for(i=0;i<time;i++)
for(j=0;j<110;j++);
}
voidyouyi(void)
{ uint i;
temp=0x01;
for(i=0;i<8;i++)
{
P2=~temp;
delay1ms(1000);
temp<<=1;
}
}
voidzuoyi(void)
{ uint i;
temp=0x80;
for(i=0;i<8;i++)
{
. . | . 资料. | . |
V | .. | . | .. |
P2=~temp;
delay1ms(1000);
Temp>>=1;
}
}
voidquanliang(void)
{uinti;
temp=0xfe;
for(i=0;i<8;i++)
{
P2=temp;
delay1ms(1000);
temp<<=1;
}
}
voidfquanliang(void)
{
uinti;
temp=0x7f;
for(i=0;i<8;i++)
. . | . 资料. | . |
V | .. | . | .. |
{
P2=temp;
delay1ms(1000);
Temp>>=1;
}
}
voidmain()
{ clearmen();
P0=0xff;
while(1) {
if(value==1) if(value==2) if(value==3) if(value==4 if(value==5) if(value==6) if(value==7) if(value==8) if(value==9) | {P2=0xfe;} |
if(value==10) {P1=0xfd;}
if(value==11) youyi();
if(value==12) zuoyi();
. . | . 资料. | . |
V | .. | . | .. |
if(value==13) quanliang();
if(value==14) fquanliang();
}
}
2.个人小结
这次课程设计我们的题目是设计单片机遥控系统设计,以51单片机为基础通过红外发射与接收装置来实现信息的传递,通过这次课程设计,我学会了红外通信装置的使用以及它们之间编码的设计。另外,
通过自己设计焊接单片机让我对单片机的结构有了新的认识与理解。单片机的每一个端口都有自己所需的结构与电路,特别是P0口,需要接上拉电阻。这次课程设计我负责接收模块与部分程序设计,我用了一个hs0038一体化红外接收头,使接收电路大大的简洁化了,为了找hs0038的电路,还上网找了很多版本的资料,最终确定了一个相对简单的电路,且比较稳定。最后实验结果虽然不尽如人意,但是也学会了很多电路设计的方法。
——————章韬略
这次课程设计,我们的设计共分为两个模块,我负责的是红外发射模块。首先我在网上查询了一些关于红外发射模块硬件电路的资料,确定所需要的硬件材料。运用软件来绘制出了硬件电路图。再购买到了材料之后,开始了硬件电路的焊接工作,焊接完成后,开始编写程序。在写程序的过程中,我了解到了51单片机
芯片的工作原理,学会了矩阵键盘的扫描原则。同时,也认清了红外发射的原理, | ||
. . | . 资料. | . |
V | .. | . | .. |
这次我采用的是按脉冲个数来对应相应的功能,相对来说更为简单易懂。再完成这些工作之后,我们开始了测试和调节,虽然最终并没有完全达到预期的效果,但通过这次课程设计,我还是了学会了很多电路设计和单片机的知识。
-----------舒佳
. . | . 资料. | . |
因篇幅问题不能全部显示,请点此查看更多更全内容