找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红外遥控发射+接收电路源程序及Proteus仿真设计 有波形图显示

  [复制链接]
跳转到指定楼层
楼主
设计一个基于单片机的嵌入式系统,要求具备以下功能:
红外数据的接收及解码,红外发色电路
数码管的显示驱动控制
将接收到的红外数据进行实时显示(限于动态扫描方法)
请根据以上功能要求,进行硬件系统设计,编写软件程序并画出流程图。
利用单片机进行遥控系统的应用设计,相较于市面上遥控集成电路受功能键数及应用范围限制,具有编程灵活多样、操作码个数可随意设定的优点。本设计利用AT89C52制作红外遥控系统,使用Keil软件编写程序,在Proteus软件中采用IRLINK模块用于接收并解调红外信号,进行程序的仿真。设计中,矩阵键盘充当遥控器,当我们按下某一个键时,经单片机识别,CPU向接有红外发射管的端口发射一定频率的脉冲,该脉冲与38KHz左右的载波脉冲进行调制,然后将已调制的脉冲进行缓冲放大,激励红外发光二极管将电能转化为光能,使得红外发光二极管发射出一定频率的红外线,当接收控制系统接收到该红外光后,由单片机内定时/计数器得到该红外光的频率,然后将该频率送往CPU,由CPU对该信号进行反编码,识别出控制信号,控制LED灯亮,蜂鸣器发声,并从数码管显示出按键值,同时示波器显示红外发射及接受端的脉冲波形,实现红外数据的接收解码与动态显示。
以下为发射程序,接收见附件。信号波形解码显示都没问题,LED灯和蜂鸣器设计是有点问题的,可以删掉不用不影响。
自动的是压缩包里第二个文件的程序,其他包里有额外的参考资料,可借鉴。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


红外波形图:


单片机源程序如下:
  1. #include <REG51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. #define SBM   0xFF                //用户识别码

  6. #define m9    (65536-9000)               //约9mS
  7. #define m4_5  (65536-4500)               //约4.5mS
  8. #define m1_6  (65536-1630)               //约1.65mS
  9. #define m_65  (65536-580)               //约0.65mS
  10. #define m_56  (65536-560)               //约0.56mS
  11. #define m40   (65536-40000)       //约40mS
  12. #define m56   (65536-56000)       //56mS
  13. #define m2_25 (65536-2250)        //约2.25mS

  14. sbit IR  = P3^6;                                  //定义发射引脚(接PNP三极管基极)
  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. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  23. 函数功能:主函数
  24. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  25. void main(void)
  26. {

  27.   TMOD = 0x01;         //T0 16位工作方式
  28.   IR=1;                                   //发射端口常态为高电平

  29.   while(1)
  30.   {
  31.    SanZhuan();
  32.   }
  33. }
  34. /***************************************************************
  35. 函数功能:             4×4矩阵键盘
  36.                            键值                    
  37. P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
  38. │     │    │    │    │    │    │    │    ┃
  39. │     │    │    └────13   14   15   16   ┃   
  40. │     │    └─────────9    10   11   12   ┃   
  41. │     └──────────────5    6    7    8    ┃   
  42. └────────────────────1    2    3    4    ┃  
  43. ***************************************************************/
  44. uchar KEY(void)
  45. {
  46. uchar H,L;            //行值,列值
  47. H=0;
  48. L=0;
  49. P1 = 0xf0;            //将键盘端口行值设为1,列值设为0
  50. if(P1!= 0xf0)         //检测是否有按键按下,如果有则hangval必不为0x0f
  51.    {
  52.     YS(10);            //按键去抖动,延时10毫秒
  53.     if(P1!=0xf0)       //确实有按键按下
  54.       {
  55.        H  = P1&0xf0;   //按键后得到按键的行标志位,将行标志位赋值给hangval
  56.        P1 = 0x0f;      //翻转键盘接口输出
  57.        L  = P1&0x0f;   //得到列标志位
  58.       }
  59.         return (H+L);
  60.    }
  61.   return 0;
  62. }
  63. /***************************************************************
  64. 函数功能:散转程序
  65. ***************************************************************/
  66. void SanZhuan(void)
  67. {
  68. uchar v;
  69. v = KEY();

  70. switch(v)
  71. {
  72.   case 0x77:ZZ(0x01);v=0;break;                //"  "
  73.   case 0xb7:ZZ(0x02);v=0;break;                //"  "
  74.   case 0xd7:ZZ(0x03);v=0;break;                //"  "
  75.   case 0xe7:ZZ(0x04);v=0;break;                //"  "
  76.   case 0x7b:ZZ(0x05);v=0;break;                //"  "
  77.   case 0xbb:ZZ(0x06);v=0;break;                //"  "
  78.   case 0xdb:ZZ(0x07);v=0;break;                //"  "
  79.   case 0xeb:ZZ(0x08);v=0;break;                //"  "
  80.   case 0x7d:ZZ(0x09);v=0;break;                //"  "
  81.   case 0xbd:ZZ(0x10);v=0;break;                //"  "
  82.   case 0xdd:ZZ(0x11);v=0;break;                //"  "
  83.   case 0xed:ZZ(0x12);v=0;break;                //"  "
  84.   case 0x7e:ZZ(0x13);v=0;break;                //"  "
  85.   case 0xbe:ZZ(0x14);v=0;break;                //"  "
  86.   case 0xde:ZZ(0x15);v=0;break;                //"  "
  87.   case 0xee:ZZ(0x16);v=0;break;                //"  "
  88.   default:v=0;
  89. }
  90. }
  91. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  92. 函数功能:发送主程序
  93. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  94. void ZZ(uchar x)
  95. {
  96.   TT0(1,m9);                   //高电平9mS
  97.   TT0(0,m4_5);               //低电平4.5mS

  98.   /*┈ 发送4帧数据 ┈*/
  99.   Z0(SBM);                                                                                                                                       
  100.   Z0(~SBM);
  101.   Z0(x);
  102.   Z0(~x);

  103.   /*┈┈ 结束码 ┈┈*/
  104.   TT0(1,m_65);
  105.   TT0(0,m40);

  106.   /*┈┈ 重复码 ┈┈*/
  107.   while(KEY())
  108.    {
  109.         TT0(1,m9);
  110.         TT0(0,m2_25);

  111.         TT0(1,m_56);
  112.         TT0(0,m40);
  113.                 TT0(0,m56);
  114.                                                          
  115.     }                  
  116. }
  117. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  118. 函数功能:单帧发送程序
  119. 入口参数:1帧数据
  120. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  121. void Z0(uchar temp)
  122. {
  123.   uchar v;
  124.   for (v=0;v<8;v++)                     //循环8次移位
  125.        {     
  126.                  TT0(1,m_65);                        //高电平0.65mS         
  127.                          if(temp&0x01) TT0(0,m1_6); //发送最低位
  128.                          else          TT0(0,m_56);     
  129.                          temp >>= 1;                //右移一位
  130.         }   
  131. }

  132. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  133. 函数功能:38KHz脉冲发射 + 延时程序
  134. 入口参数:(是否发射脉冲,延时约 x (uS))
  135. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  136. void TT0(bit BT,uint x)
  137. {
  138.   TH0 = x>>8;                    //输入T0初始值
  139.   TL0 = x;
  140.   TF0=0;                                //清0
  141.   TR0=1;                                //启动定时器0
  142.   if(BT == 0) while(!TF0);        //BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时;
  143.   else while(1)                            //38KHz脉冲,占空比5:26
  144.          {
  145.                   IR = 0;
  146.                   if(TF0)break;
  147.                if(TF0)break;
  148.                   IR = 1;
  149.                 if(TF0)break;
  150.                  if(TF0)break;
  151.                  if(TF0)break;
  152.                   if(TF0)break;
  153.                  if(TF0)break;
  154.                  if(TF0)break;
  155.                  if(TF0)break;
  156.                  if(TF0)break;
  157.                  if(TF0)break;
  158.                   if(TF0)break;
  159.                  }
  160.   TR0=0;                                //关闭定时器0
  161.   TF0=0;                                //标志位溢出则清0
  162.   IR =1;                                //脉冲停止后,发射端口常态为高电平
  163. }
  164. /***************************************************************
  165. 函数功能:按键消抖    延时程序
  166. 入口参数:1ms×time       (晶振=12MHz)
  167. ***************************************************************/
  168. void YS(uchar time)
  169. {
  170.      uchar i,j;
  171.          for(i=0; i<time; i++)
  172.      for(j=0; j<247; j++)_nop_();
  173. }
复制代码




全部资料51hei下载地址:
红外遥控带原理图.rar (2.78 MB, 下载次数: 193)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:194006 发表于 2021-8-1 11:45 | 只看该作者
这个不错,要是38K的载波用了轮循方式,如果单片机时序不一样就要重新调.

用中断方式应该更加精准.
回复

使用道具 举报

板凳
ID:959166 发表于 2021-8-6 15:21 | 只看该作者
模拟时无论按那个按钮波形都没有变化
回复

使用道具 举报

地板
ID:943047 发表于 2021-8-6 16:54 | 只看该作者
本帖最后由 fengshakalaka 于 2021-8-6 17:01 编辑

楼主proteus用的哪个版本啊
回复

使用道具 举报

5#
ID:328014 发表于 2021-8-6 17:40 | 只看该作者
我用Proteus7.5打开的,模拟效果如下:

51hei.png (22.37 KB, 下载次数: 23)

51hei.png
回复

使用道具 举报

6#
ID:585365 发表于 2021-8-10 16:57 | 只看该作者
还是看的不是很明白。还得加强学习啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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