找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4312|回复: 4
打印 上一主题 下一主题
收起左侧

单片机红外遥控系统课程设计

[复制链接]
跳转到指定楼层
楼主
ID:463454 发表于 2019-1-8 21:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摘要

本设计采用51单片机作为遥控发射接收芯片,HS003B作为红外一体化接收发射管,在此基础上设计了一个简易的智能红外遥控系统。系统包括接收和发射两大部分,发射部分有16个按键,接收部分含有8盏彩色LED灯、一片二位数码管和蜂鸣器系统。发射部分通过键盘扫描判断哪个键被按下,经过单片机编码程序进行编码,控制红外发射电路发送信号。接收部分解码信号,实现相应的输出。本设计方案结合红外遥控设计简单、作方便、成本低廉等特点。

1 绪论

1.1课题目的和意义
随着科技的发展,人们生活的节奏也越来越快,随之人们对方便,快捷的要求也随之不断增高。遥控器的出现,在一定程度上满足了人们这个要求。遥控器是由高产的发明家Robert Adler在五十年代发明的[1]。而红外遥控是20世纪70年代才开始发展起来的一种远程控制技术,其原理是利用红外线来传递控制信号,实现对控制对象的远距离控制,具体来讲,就是有发射器发出红外线指令信号,有接收器接收下来并对信号进行处理,最后实现对控制对象的各种功能的远程控制。
红外遥控具有独立性、物理特性与可见光相似性、无穿透障碍物的能力及较强的隐蔽性等特点。随着红外遥控技术的开发和迅速发展,很多电器采用该项技术,使人们的生活更加便捷。本小组通过红外遥控技术来控制多盏彩灯的亮灭情况,实现各种花型以及数码管的数值显示。通过本课题的设计,更好的理解红外线的编码解码方式及其红外遥控系统的其他工作原理。

1.2红外线简介
红外线又称红外光波,在电磁波谱中,光波的波长范围为0.01um~1000um。根据波长的不同可分为可见光和不可见光,波长为0.38um~0.76um的光波可为可见光,依次为红、橙、黄、绿、青、蓝、紫七种颜色。光波为0.01um~0.38um的光波为紫外光(线),波长为0.76um~1000um的光波为红外光(线)。红外光按波长范围分为近红外、中红外、远红外、极红外4类。红外线遥控是利用近红外光传送遥控指令的,波长为0.76um~1.5um。用近红外作为遥控光源,是因为目前红外发射器件(红外发光管)与红外接收器件(光敏二极管、三极管及光电池)的发光与受光峰值波长一般为0.8um~0.94um,在近红外光波段内,二者的光谱正好重合,能够很好地匹配,可以获得较高的传输效率及较高的可靠性。
1.3红外遥控系统简介
红外遥控系统主要由遥控发射器、一体化接收头、单片机、接口电路组成,遥控器用来产生遥控编码脉冲,驱动红外发射管输出红外遥控信号,遥控接收头完成对遥控信号的放大、检波、整形、解调出遥控编码脉冲。遥控编码脉冲是一组串行二进制码,对于一般的红外遥控系统,此串行码输入到微控制器,由其内部CPU完成对遥控指令解码,并执行相应的遥控功能。使用遥控器作为控制系统的输入,需要解决如下几个关键问题:如何接收红外遥控信号;如何识别红外遥控信号以及解码软件的设计、控制程序的设计。
红外遥控是单工的红外通信方式,整个通信中,需要一个发射端和一个接收端。发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。红外接收端普遍采用价格便宜,性能可靠的一体化红外接收头接收红外信号,它同时对信号进行放大、检波、整形,得到TTL。


2 课题方案和设计思路

2.1总体方案
    红外遥控系统一般由红外发射装置和红外接收设备两大部分组成,图2-1为所示为结构框图。
                                                        

                  

图2-1 系统结构框图

红外发射装置又由键盘电路、红外编码芯片、电源和红外发射电路组成。红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。

2.2红外发射器设计2.2.1红外发射器原理
由于指令数据时间周期较长,信号频率很低,直接发射传送效率和距离受限,抗干扰性差,因此,必须采用二次调制方式,将指令数据通过载波信号进行调制,形成较高频率的复合信号,在通过红外发射二极管产生红外线发射出去。


图2-2 红外遥控发射原理框图

2.2.2红外编码
红外编码有很多种方式,本课题采用脉冲宽度调制方案,这种遥控码具有以下特征: 以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。 波形如下图。

图2-3 位“0”和位“1”波形图

    在此介绍较普遍使用的NEG标准。其数据格式包括引导码、用户码、数据码和数据反码,编码共占32位。数据反码是数据码反相后的编码,编码用于对数据的纠错。


2.3红外接收端设计
接收端主要包括红外接收模块和解调单片机。其中,红外线接收模块包括光电转换放大器和解调电路。当红外线发射信号进入模块后,在其输出端得到原先的数字控制编码,再经过单片机解码程序进行解码,便知按下那个键,实现相应输出。P0.0连接蜂鸣器系统,每成功接收到信号,蜂鸣器发出一声响声。P1口连接8盏彩灯,接收数据不同彩灯的花色不同,P2口、P3.0和P3.1连接一片二位数管,数码管显示从01到16的数值,分别对应发射部分的16个按键。
                                                                                    
                                                                                                           

3硬件结构设计与介绍

3.2 红外发射电路
本遥控发射器采用脉冲宽度调制红外遥控方式,脉冲宽度调制红外遥控就是指令信号产生电路以不同的脉冲编码代表不同的控制指令。
在确定选择AT89C51作为本设计发射电路核心芯片和点触式开关作为控制键后,加上一个简单红外发射电路和12M晶体震荡器便可实现红外发射。
发射部分的主要元件为红外发光二极管。它实际上是一只特殊的发光二极管,由于其内部材料不同于普通发光二极管,因而在其两端施加一定电压时,它发出的便是红外线而不是可见光。目前大量使用的红外发光二极管发出的红外线波长为940nm左右,外形与普通Φ5发光二极管相同,只是颜色不同[6]。
遥控发射通过键盘,每按下一个键,即产生具有不同的编码数字脉冲,这种代码指令信号调制在38KHz的载波上,激励红外光二极管产生不同的脉冲,通过空间的传送到受控机的遥控接收器。P1口作为按键部分,P3.6口作为发射部分。
独立式键盘可工作在查询方式下,通过I/O口读入键状态,当有键被按下时I/O口变为低电平,而未被按下的键对应为高电平,这样通过读电平状态可判断是否有键按下和哪个键被按下。


图3-2 红外发射端电路         
3.3红外接收电路设计3.3.1 红外接收模块
HS003B是一种常见的红外接收模块。红外接收模块内部含有高频的滤波电路,专门用来滤除红外合成信号的载波信号(38KHz),并送出接收到的信号。模
块有3个引脚;引脚1(GND)为接地端;引脚2(VCC)为为电源正极;引脚3
(OUT)为数字信号输出端。

3.3.2数码管

   表3-1 七段LED字形码

显示字符

共阳极

字符码

共阴极

字符码

0

3FH

C0H

1

06H

F9H

2

5BH

A4H

3

4FH

B0H

4

66H

99H

5

6DH

92H

6

7DH

82H

7

07H

F8H

8

7FH

80H

9

6FH

90H


                       图3-4 二位数码管显示器

设计中用到型号为7SEG-MAX2-CA-BLUE的二位共阳极数码管显示器。它的左下侧的ABCDEFG DP是LED数码管显示器的I/O口,是段选信号,右下侧的12是它的位选信号,就是从左到右分别是第一位到第二位,段选信号与位选信号分别接到单片机的不同输出口,例如段选信号可以接到P2口,位选信号可以接到P3.0口和P3.1口,共阳极的字形显示代码为:unsigned char[]={0xc0, 0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90},P3.0输出为0,P3.1输出为1时,选中第二位,段选信号就执行从0到9的显示,P3.0输出为1,P3.1输出为0时,选中第一位,段选信号就执行从0到9的显示。
3.3.3 彩灯系统
P1口连接8盏彩灯,P1.0和P1.4连接的是LED-RED,P1.1和P1.5连接的是LED-YELLOW,P1.2和P1.6连接的是LED-GREEN,P1.3和P1.7连接的是LED-BLUE。根据接收到的信号显示不同的花型。

                        图3-5 彩灯系统连接图

3.3.4蜂鸣器系统
     P0.0连接蜂鸣器系统,每成功接收到信号,蜂鸣器发出一声响声。
                         图3-6 蜂鸣器系统连接图
3.3.5红外接收端电路图
                   图3-7  红外接收端电路图

4 软件设计

4.1 定时/计数器功能简介
AT89C51单片机内部设有两个16位可编程的定时/计数器,简称定时器0和定时器1,分别用T0和T1表示。其功能同一般定时计数器,主要作用是:第一,作为一段特定时间长短的定时;第二,可以计算由T1或T0引脚输入的脉冲数,前者在应用上可以产生正确的时间延迟及定时去执行中断服务程序,而后者则是计数器或者计频器的设计。
这两个定时器本身有四种工作模式可供使用,如表2所示。

表4-1 四种工作模式

M1   MO

工作方式

功能说明

0     0

模式0

13位计数器

0     1

模式1

16位计数器

1     0

模式2

8位自动重装计数器

1     1

模式3

定时器0:分成两个8位计数器

定时器1:停止计数



4.2 遥控码的发射
当某个操作按键按下时,单片机先读出键值,然后根据键值设定遥控码的脉冲个数,再调制成38kHz方波由红外线发光管发射出去[13]。
通常,红外遥控是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。为了提高抗干扰性能和降低电源消耗,将上述的遥控编码脉冲对频率为38KHz(周期为26us)的载波信号进行脉幅调制(PAM),再经缓冲放大后送到红外发光管,将遥控信号发射出去。
红外信号发射过程:首先发射9ms高电平和4.5ms低电平的引导码,再发送16位地址码的前8位,16位地址码的后8位,8位按键数据和8位按键数据反码。
在实践中,采用红外线遥控方式时,由于受遥控距离,角度等影响,使用效果不是很好,如采用调频或调幅发射接收码,可提高遥控距离,并且没有角度影响。
发射控制程序由主程序和键扫描程序、编码发送程序组成,在主程序中,采用键扫描子程序完成各个按键的功能,遥控发射主程序的流程图
(a)红外发射主程序流程图            (b)红外数据发送子程序流程图
                 图4-1红外发射端程序流程图
4.3 红外接收
红外遥控解码程序主要工作为等待红外线信号出现,并跳过引导信号,搜集连续32位的编码数据,并存入内存的连续空间。其位信号判别的原则是:以判断各个位的波宽信号来决定高低信号(0或1)。
位解码原理如下:
  • 解码为0:高电平宽度0.56ms+低电平宽度0.56ms。
  • 解码为1:高电平宽度0.56ms+低电平宽度1.68ms。
编码数据读取后,经过单片机将编码数据与键盘代码进行比对,即可解调出具体的按键值,便可知按下哪个键,而做出相应的控制处理,完成红外遥控的动作。

  • 红外接收主程序流程图         (b)红外接收中断子程序流程图
                 图4-2 红外接收端程序流程图

5 课程设计总结和心得

这次课程设计耗用了1个星期的心血,从一开始的确定课题,到后来的资料查找、理论学习,再有就是调试和测试过程,这一切都使我的理论知识和动手能力进一步提高。
通过本次红外系统的设计,我大有收获。从得到题目到查找资料,从proteus仿真的调试到失败后再一次全部重新开始……在这一个充满挑战伴随挫折,充满热情伴随打击的过程中,我感触颇深,它已不仅是一个对我的学习知识情况和我的应用动手能力的检验,而且还是对我的钻研精神,面对困难的心态,做事的毅力和耐心的考验。我在这个过程中深刻的感受到了做课程设计的意义所在。这个课题的根本技术就是单片机控制技术,加部分外围电路来实现一些复杂的功能。可以根据要求改变软件来实现功能的更新和扩展。
本课题的重点、难点是:
(1) 考虑电路实现原理以及与单片机的接口;
(2) 红外发送与接收技术;
   通过完成本课题,我了解并掌握了红外遥控技术的基本理论知识,更深入的掌握单片机在实际电路中的开发和应用。为以后从事单片机软硬件产品的设计开发打下了一定的基础,培养了从事产品研发的信心。

6 参考文献

[1]单片机原理与应用及C51程序设计,夏维成 杨加国 编著,清华大学出版社。
[2] C语言程序设计(第三版),谭浩强 编著,清华大学出版社。
[3] 单片机系统设计与仿真—基于Proteus,肖婧 编著, 北京航空航天大学出版社。
[4] DIY玩转51单片机, 王守中 编著,电子工业出版社。                                                                                                      
[5] 单片机侧控技术应用实例解析, 许江淳 陈显宁 陈焰 付丽霞 编著,中国电力出版社。
[6] 单片机接口模块应用与开发实例详解, 薛小玲 刘志群 贾俊荣 编著, 北
京航空航天大学出版社

  • 附录

附录1 Proteus仿真图


附录2 发射程序   





#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_();
}





附录3 接收程序





#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;}
      case 0x03:{P1=0xbb;break;}
        case 0x04:{P1=0X77;break;}
                    case 0x05:{P1=0xf0;break;}
        case 0x06:{P1=0x0f;break;}
                  case 0x07:{P1=0xaa;break;}
                 case 0x08:{P1=0x55;break;}
        case 0x09:{P1=0xe7;break;}
                case 0x10:{P1=0xdb;break;}
        case 0x11:{P1=0xbd;break;}
                 case 0x12:{P1=0x7e;break;}
        case 0x13:{P1=0xc3;break;}
        case 0x14:{P1=0x3c;break;}
        case 0x15:{P1=0x00;break;}
        case 0x16:{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;
              }
}

完整的Word格式文档51黑下载地址:
单片机课程设计.doc (500.5 KB, 下载次数: 40)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:442132 发表于 2019-1-15 17:50 | 只看该作者
nice,值得参考
回复

使用道具 举报

板凳
ID:187359 发表于 2019-11-3 13:49 | 只看该作者
Nice,值得借鉴
回复

使用道具 举报

地板
ID:452928 发表于 2019-11-24 20:20 | 只看该作者
兄弟,你这proteus仿真程序和.HEX文件能不能发一下呢
回复

使用道具 举报

5#
ID:493097 发表于 2019-11-25 11:29 | 只看该作者
看看先~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表