基于单片机的红外遥控设计与制作.doc

上传人:聆听****声音 文档编号:701912 上传时间:2023-04-29 格式:DOC 页数:19 大小:203.62KB
下载 相关 举报
基于单片机的红外遥控设计与制作.doc_第1页
第1页 / 共19页
基于单片机的红外遥控设计与制作.doc_第2页
第2页 / 共19页
基于单片机的红外遥控设计与制作.doc_第3页
第3页 / 共19页
基于单片机的红外遥控设计与制作.doc_第4页
第4页 / 共19页
基于单片机的红外遥控设计与制作.doc_第5页
第5页 / 共19页
基于单片机的红外遥控设计与制作.doc_第6页
第6页 / 共19页
基于单片机的红外遥控设计与制作.doc_第7页
第7页 / 共19页
基于单片机的红外遥控设计与制作.doc_第8页
第8页 / 共19页
基于单片机的红外遥控设计与制作.doc_第9页
第9页 / 共19页
基于单片机的红外遥控设计与制作.doc_第10页
第10页 / 共19页
基于单片机的红外遥控设计与制作.doc_第11页
第11页 / 共19页
基于单片机的红外遥控设计与制作.doc_第12页
第12页 / 共19页
基于单片机的红外遥控设计与制作.doc_第13页
第13页 / 共19页
基于单片机的红外遥控设计与制作.doc_第14页
第14页 / 共19页
基于单片机的红外遥控设计与制作.doc_第15页
第15页 / 共19页
基于单片机的红外遥控设计与制作.doc_第16页
第16页 / 共19页
基于单片机的红外遥控设计与制作.doc_第17页
第17页 / 共19页
基于单片机的红外遥控设计与制作.doc_第18页
第18页 / 共19页
基于单片机的红外遥控设计与制作.doc_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于单片机的红外遥控设计与制作.doc

《基于单片机的红外遥控设计与制作.doc》由会员分享,可在线阅读,更多相关《基于单片机的红外遥控设计与制作.doc(19页珍藏版)》请在冰点文库上搜索。

基于单片机的红外遥控设计与制作.doc

基于单片机的红外遥控设计与制作

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

#defineuintunsignedint

#defineucharunsignedchar

#definekeyrowP0

#definekeylineP2

ucharcodekeyv[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;

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遥控码发射程序流程图

红外信号发射过程:

 

该遥控器采用脉冲个数编码,不同的脉冲个数代表不同的码,最小为2个脉冲,最大为17个脉冲,为了使接收可靠,第一位码宽为3ms,其余为1ms,遥控码数据帧间隔大于10ms 。

当某个被控电器的电源开关被按下时,单片机先读出键值,然后根据键值设定遥控码的脉冲个数,再调制成40kHz方波由红外线发光管发身出去。

相应的遥控码发射程序如下:

 

sbitremoteout=P3^5;

externvoiddelay1ms(uinttime);

/*************初始化函数***********/

voidinit(void){

remoteout=0;

IE=0x00;

IP=0x08;

TMOD=0x22;

TH1=0xf3;

TL1=0xf3;

EA=1;

}

/*****************发射函数***********/

voidsend_infrared(ucharkeyval)

{

ucharm;

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发生器************/

voidtime_intt1(void)interrupt3{

remoteout=~remoteout;}

4.1.3遥控发射主程序流程图

遥控发射的主程序流程图:

首先初始化程序,然后调用键扫描程序。

相应的发射主程序如下:

#include

#defineuintunsignedint

#defineucharunsignedchar

externucharkeyscan(void);

externvoidinit(void);

externvoidsend_infrared(ucharkeyval);

voiddelay1ms(uinttime){

uinti,j;

for(i=0;i

for(j=0;j<110;j++);

}

voidmain()

{

uintkeyval;

init();

while

(1)

{

keyval=keyscan();

while(keyscan());

if(keyval){send_infrared(keyval);}

}

}

4.1.4 中断程序流程图

中断过程:

首先判断低电平脉宽度是否大于2ms,若脉宽不到2ms,则中断返回;若低电平大于2ms,则接收并对低电平脉冲计数,接下来看判断高电平脉宽度冲是否大于3ms,若脉宽不到3ms,则返回上一接收计数过程;若高电平脉宽大于3ms,则按照脉冲个数至对应功能程序。

此时中断返回。

相应的中断程序如下:

 

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitremotein=P3^1;

externvoiddelay1ms(uinttime);

ucharvalue;

/***********初始化********/

voidclearmen(void)

{

EX0=1;

EA=1;

}

/**************外中断遥控接收函数**************/

voidintt0(void)interrupt0

{ucharkeyval,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

#include

#defineucharunsignedchar

#defineuintunsignedint

externvoidclearmen(void);

externucharvalue;

uchartemp;

voiddelay1ms(uinttime){

uinti,j;

for(i=0;i

for(j=0;j<110;j++);

}

voidyouyi(void)//7个流水灯逐个闪动

{uinti;

temp=0x01;

for(i=0;i<8;i++)

{

P2=~temp;

delay1ms(1000);

temp<<=1;

}

}

voidzuoyi(void)//7个流水灯反向逐个闪动

{uinti;

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)

{

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;}

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

#defineuintunsignedint

#defineucharunsignedchar

#definekeyrowP0

#definekeylineP2

ucharcodekeyv[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;

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;

externvoiddelay1ms(uinttime);

/*************初始化函数***********/

voidinit(void){

remoteout=0;

IE=0x00;

IP=0x08;

TMOD=0x22;

TH1=0xf3;

TL1=0xf3;

EA=1;

}

/*****************发射函数***********/

voidsend_infrared(ucharkeyval)

{

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)interrupt3{

remoteout=~remoteout;}

externucharkeyscan(void);

externvoidinit(void);

externvoidsend_infrared(ucharkeyval);

voiddelay1ms(uinttime){

uinti,j;

for(i=0;i

for(j=0;j<110;j++);

}

voidmain()

{

uintkeyval;

init();

while

(1)

{

keyval=keyscan();

while(keyscan());

if(keyval){send_infrared(keyval);}

}

}

接收系统:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitremotein=P3^1;

externvoiddelay1ms(uinttime);

ucharvalue;

/***********初始化********/

voidclearmen(void)

{

EX0=1;

EA=1;

}

/**************外中断遥控接收函数**************/

voidintt0(void)interrupt0

{ucharkeyval,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;

}

接收主程序:

externvoidclearmen(void);

externucharvalue;

uchartemp;

voiddelay1ms(uinttime){

uinti,j;

for(i=0;i

for(j=0;j<110;j++);

}

voidyouyi(void)

{uinti;

temp=0x01;

for(i=0;i<8;i++)

{

P2=~temp;

delay1ms(1000);

temp<<=1;

}

}

voidzuoyi(void)

{uinti;

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++)

{

P2=temp;

delay1ms(1000);

temp<<=1;

}

}

voidfquanliang(void)

{

uinti;

temp=0x7f;

for(i=0;i<8;i++)

{

P2=temp;

delay1ms(1000);

Temp>>=1;

}

}

voidmain()

{clearmen();

P0=0xff;

while

(1){

if(

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2