找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机的红外遥控系统设计

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 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仿真工程 程序 论文

单片机源程序如下:
  1. #include <REG51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define SBM   0x80               
  6. #define m9    (65536-9000)            
  7. #define m4_5  (65536-4500)            
  8. #define m1_6  (65536-1630)            
  9. #define m_65  (65536-580)        
  10. #define m_56  (65536-560)        
  11. #define m40   (65536-40000)      
  12. #define m56   (65536-56000)      
  13. #define m2_25 (65536-2250)      
  14. sbit IR  = P3^6;                        
  15. sbit LED = P3^7;                        
  16. uchar KEY(void);
  17. void  SanZhuan(void);
  18. void  ZZ(uchar x);
  19. void  Z0(uchar temp);
  20. void  TT0(bit BT,uint x);
  21. void  YS(uchar time);
  22. void main(void)
  23. { TMOD = 0x01;         
  24.   IR=1;                          
  25.   while(1)
  26.   {SanZhuan();}
  27. }
  28. uchar KEY(void)
  29. {uchar H,L;            
  30. H=0;
  31. L=0;
  32. P1 = 0xf0;            
  33. if(P1!= 0xf0)         
  34.    { YS(10);            
  35.     if(P1!=0xf0)     
  36.       {H  = P1&0xf0;  
  37.        P1 = 0x0f;     
  38.        L  = P1&0x0f;   
  39.       }
  40.        return (H+L);
  41.    }
  42.   return 0;
  43. }
  44. void SanZhuan(void)
  45. { uchar v;
  46. v = KEY();
  47. switch(v)
  48. {case 0x77:ZZ(0x01);v=0;break;   
  49.   case 0xb7:ZZ(0x02);v=0;break;         
  50.   case 0xd7:ZZ(0x03);v=0;break;         
  51.   case 0xe7:ZZ(0x04);v=0;break;         
  52.   case 0x7b:ZZ(0x05);v=0;break;         
  53.   case 0xbb:ZZ(0x06);v=0;break;         
  54.   case 0xdb:ZZ(0x07);v=0;break;         
  55.   case 0xeb:ZZ(0x08);v=0;break;         
  56.   case 0x7d:ZZ(0x09);v=0;break;         
  57.   case 0xbd:ZZ(0x10);v=0;break;         
  58.   case 0xdd:ZZ(0x11);v=0;break;   
  59.   case 0xed:ZZ(0x12);v=0;break;         
  60.   case 0x7e:ZZ(0x13);v=0;break;         
  61.   case 0xbe:ZZ(0x14);v=0;break;         
  62.   case 0xde:ZZ(0x15);v=0;break;         
  63.   case 0xee:ZZ(0x16);v=0;break;         
  64.   default:v=0;
  65. }
  66. }
  67. void ZZ(uchar x)
  68. {  TT0(1,m9);               
  69.    TT0(0,m4_5);        
  70.    Z0(SBM);                                                                                                                    
  71.    Z0(~SBM);
  72.    Z0(x);
  73.    Z0(~x);
  74.    TT0(1,m_65);
  75.    TT0(0,m40);
  76.    while(KEY())
  77.    {  TT0(1,m9);
  78.       TT0(0,m2_25);
  79.       TT0( 1,m_56);
  80.       TT0(0,m40);
  81.           TT0(0,m56);
  82.           LED = !LED;                                       
  83.     }
  84. LED = 1;            
  85. }
  86. void Z0(uchar temp)
  87. {  uchar v;
  88.   for (v=0;v<8;v++)                    
  89.        {    TT0(1,m_65);                           
  90.                       if(temp&0x01) TT0(0,m1_6);
  91.                       else  TT0(0,m_56);     
  92.                       temp >>= 1;               
  93.         }   
  94. }
  95. void TT0(bit BT,uint x)
  96. {
  97.   TH0 = x>>8;               
  98.   TL0 = x;
  99.   TF0=0;                           
  100.   TR0=1;                           
  101.   if(BT == 0) while(!TF0);
  102.   else while(1)                  
  103.          {
  104.                 IR = 0;
  105.                 if(TF0)break;
  106.             if(TF0)break;
  107.                 IR = 1;
  108.            if(TF0)break;
  109.           if(TF0)break;
  110.           if(TF0)break;
  111.                 if(TF0)break;
  112.           if(TF0)break;
  113.           if(TF0)break;
  114.           if(TF0)break;
  115.           if(TF0)break;
  116.           if(TF0)break;
  117.                 if(TF0)break;
  118.                }
  119.   TR0=0;                           
  120.   TF0=0;                          
  121.   IR =1;                       
  122. }
  123. void YS(uchar time)
  124. {    uchar i,j;
  125.         for(i=0; i<time; i++)
  126.      for(j=0; j<247; j++)_nop_();
  127. }
  128. 接收程序
  129. #include<reg51.h>
  130. sbit IRIN=P3^2;
  131. sbit SPK=P0^0;
  132. sbit RELAY=P2^7;
  133. sbit P3_0=P3^0;
  134. sbit P3_1=P3^1;
  135. unsigned char IRDATA[7];
  136. unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90};
  137. unsigned char X1,X2;
  138. void IRZ();
  139. void XSQ();
  140. void main()
  141. { EA=1;
  142. EX0=1;
  143. IT0=1;
  144. P1=0xff;
  145. P2=0xc0;
  146. P3_0=0;
  147. P3_1=0;
  148. SPK=1;
  149. IRIN=1;
  150. IRZ();
  151. XSQ();
  152. }
  153. void delay(unsigned char x)
  154. { unsigned char i;
  155. while(x--)
  156. {for(i=0;i<10;i++){}}
  157. }
  158. void fs_d()
  159. {unsigned char i;
  160. for(i=0;i<100;i++)
  161. {delay(4);
  162.   SPK=~SPK;
  163. }
  164. SPK=1;
  165. }
  166. void IR_IN() interrupt 0 using 0
  167. { unsigned char j,k,n=0;
  168. EX0=0;
  169.   delay(20);
  170.   if(IRIN==1)
  171.    {EX0=1;
  172.     return;
  173. }
  174. while(!IRIN){delay(1);}
  175. for(j=0;j<4;j++)
  176. {for(k=0;k<8;k++)
  177. {while(IRIN) {delay(1);}
  178. while(!IRIN) {delay(1);}
  179. while(IRIN)
  180. {delay(1);
  181.   n++;
  182. if(n>=30)
  183. { EX0=1;
  184. return;}
  185. }
  186. IRDATA[j]=IRDATA[j]>>1;
  187. if(n>=8){IRDATA[j]=IRDATA[j]|0x80;}
  188. n=0;}
  189. }
  190. if(IRDATA[2]!=~IRDATA[3])
  191. {EX0=1;
  192. return;
  193. }
  194. else {}
  195. fs_d();
  196. EX0=1;
  197. }
  198. void XSQ()

  199. { while(1)
  200. { X1 =IRDATA[2]/16;
  201.   X2 =IRDATA[2]%16;
  202. P3_0=1;P3_1=1;P2=tab[X1];P3_0=1;delay(200);
  203. P3_0=1;P3_1=0;P2=tab[X2];delay(200);
  204. }
  205. }
  206. void IRZ()
  207. { while(1)
  208.    {
  209.    switch(IRDATA[2])
  210.          {   case 0x01:{P1=0xee;break;}
  211.              case 0x02:{P1=0xdd;break;}
  212.         case0x03:{P1=0xbb;break;}
  213.         case 0x04:{P1=0X77;break;}
  214.          case0x05:{P1=0xf0;break;}
  215.         case0x06:{P1=0x0f;break;}
  216.           case 0x07:{P1=0xaa;break;}
  217.              case 0x08:{P1=0x55;break;}
  218.         case0x09:{P1=0xe7;break;}
  219.             case 0x10:{P1=0xdb;break;}
  220.         case0x11:{P1=0xbd;break;}
  221.              case 0x12:{P1=0x7e;break;}
  222.         case0x13:{P1=0xc3;break;}
  223.         case0x14:{P1=0x3c;break;}
  224.         case0x15:{P1=0x00;break;}
  225.         case0x16:{P1=0xff;break;}
  226.     }
  227.         X1 = IRDATA[2]/16;
  228.      X2 = IRDATA[2]%16;
  229.      P2=tab[X2];P3_1=1;delay(10);P3_1=0;
  230.      P2=tab[X1];P3_0=1;delay(10);P3_0=0;
  231.        }
  232. }
复制代码



总电路.jpg (370.81 KB, 下载次数: 56)

总电路.jpg

解压.jpg (232.13 KB, 下载次数: 65)

解压.jpg

红外遥控控制电路设计.rar

389.12 KB, 下载次数: 78, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2018-6-15 01:32 | 只看该作者
楼主能补一下压缩包吗?
回复

使用道具 举报

板凳
ID:351137 发表于 2018-6-24 11:31 来自手机 | 只看该作者
admin 发表于 2018-6-15 01:32
楼主能补一下压缩包吗?

可以可以,给忘记了
回复

使用道具 举报

地板
ID:353024 发表于 2018-6-25 14:31 | 只看该作者
想看!!
回复

使用道具 举报

5#
ID:360797 发表于 2018-6-28 21:49 | 只看该作者
楼主能不能给一下注释啊,有些看不懂
回复

使用道具 举报

6#
ID:374869 发表于 2018-7-19 15:07 | 只看该作者
楼主,你好,这个程序好像没有关机模式(单片机进行掉电模式),遥控器可以关和打开掉风扇吗
回复

使用道具 举报

7#
ID:491250 发表于 2019-3-15 10:20 | 只看该作者
厉害了!!!
回复

使用道具 举报

8#
ID:491285 发表于 2019-3-15 10:51 | 只看该作者
谢谢分享!!!!!
回复

使用道具 举报

9#
ID:660762 发表于 2019-12-10 16:53 | 只看该作者
问一下,这个电路仿真能正常运行吗
回复

使用道具 举报

10#
ID:452928 发表于 2020-1-6 01:50 | 只看该作者
呔,妖怪哪里跑 发表于 2019-12-10 16:53
问一下,这个电路仿真能正常运行吗

可以的,但是给的程序好像有点和电路不匹配
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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