找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11753|回复: 11
收起左侧

单片机红外遥控花样流水灯(含代码)仿真电路图

  [复制链接]
ID:351580 发表于 2018-6-14 09:09 | 显示全部楼层 |阅读模式
花样流水灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)由于红外是无法仿真的按键代替的红外遥控
0.png 0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit IR=P3^2;           //将IR位定义为P3.2引脚
  5. sbit key1=P2^0;
  6. sbit key2=P2^1;
  7. sbit key3=P2^2;
  8. sbit key4=P2^3;
  9. sbit key5=P2^4;
  10. sbit key6=P2^5;
  11. sbit key7=P2^6;
  12. sbit key8=P2^7;
  13. unsigned char a[4];    //储存用户码、用户反码与键数据码、键数据反码
  14. unsigned int LowTime,HighTime; //储存高、低电平的宽度
  15. unsigned char IrValue[6];
  16. unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  17. uchar code Pattern_P0[]=
  18. {
  19. 0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,
  20. 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,
  21. 0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,
  22. 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
  23. 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,
  24. 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,
  25. 0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,
  26. 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
  27. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  28. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  29. 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
  30. 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
  31. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  32. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  33. 0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,
  34. 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff
  35. };

  36. uint k=0;
  37. int Time=0;
  38. //延时
  39. /************************************************************
  40. 函数功能:对4个字节的用户码和键数据码进行解码
  41. 说明:解码正确,返回1,否则返回0
  42. 出口参数:dat
  43. *************************************************************/
  44. bit DeCode(void)        
  45. {
  46.    
  47.    unsigned char  i,j;
  48.         unsigned char temp;    //储存解码出的数据
  49.         for(i=0;i<4;i++)      //连续读取4个用户码和键数据码
  50.           {
  51.                  for(j=0;j<8;j++)  //每个码有8位数字
  52.                          {
  53.                  temp=temp>>1;  //temp中的各数据位右移一位,因为先读出的是高位数据                                                                        
  54.                            TH0=0;         //定时器清0
  55.                            TL0=0;         //定时器清0
  56.                            TR0=1;         //开启定时器T0
  57.                       while(IR==0)   //如果是低电平就等待
  58.                        ;              //低电平计时
  59.                              TR0=0;         //关闭定时器T0
  60.                            LowTime=TH0*256+TL0;    //保存低电平宽度
  61.                            TH0=0;         //定时器清0
  62.                            TL0=0;         //定时器清0
  63.                            TR0=1;         //开启定时器T0
  64.                            while(IR==1)   //如果是高电平就等待
  65.                                ;                           
  66.                            TR0=0;        //关闭定时器T0
  67.                            HighTime=TH0*256+TL0;   //保存高电平宽度
  68.                            if((LowTime<370)||(LowTime>640))
  69.                                               return 0;        //如果低电平长度不在合理范围,则认为出错,停止解码                        
  70.                            if((HighTime>420)&&(HighTime<620))   //如果高电平时间在560微秒左右,即计数560/1.085=516次
  71.                                    temp=temp&0x7f;       //(520-100=420, 520+100=620),则该位是0
  72.                            if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
  73.                                    temp=temp|0x80;       //(1550-250=1300,1550+250=1800),则该位是1
  74.                      }                                      
  75.            a[i]=temp;        //将解码出的字节值储存在a[i]                                                                                                                                                                        
  76.     }                                                   
  77.   if(a[2]=~a[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码
  78.          return 1;     //解码正确,返回1
  79. }
  80. void delay(uint t)
  81. {
  82.         uint i;
  83.         while(t--)
  84.         for(i=0;i<120;i++);
  85. }
  86. /************************************************************
  87. 函数功能:执行遥控功能
  88. *************************************************************/
  89. void Function(void)
  90. {
  91.    if(a[2]==0x40)
  92.    {
  93.              k=k+1;
  94.           if(k>=8)k=0;
  95.           a[2]=0;
  96.    }   //对P1.3引脚取反,控制继电器的吸合、释放
  97.   
  98. }
  99. void keyscan()
  100. {
  101. if(key1==0)
  102. {
  103.          delay(1);
  104.         if(key1==0)
  105.         {
  106.                 k=0;
  107.                 while(!key1);
  108.         }
  109. }
  110.   if(key2==0)
  111. {
  112.          delay(1);
  113.         if(key2==0)
  114.         {
  115.                 k=1;
  116.                 while(!key2);
  117.         }
  118. }
  119.   if(key3==0)
  120. {
  121.          delay(1);
  122.         if(key3==0)
  123.         {
  124.                 k=2;
  125.                 while(!key3);
  126.         }
  127. }
  128.   if(key4==0)
  129. {
  130.          delay(1);
  131.         if(key4==0)
  132.         {
  133.                 k=3;
  134.                 while(!key4);
  135.         }
  136. }
  137.   if(key5==0)
  138. {
  139.          delay(1);
  140.         if(key5==0)
  141.         {
  142.                 k=4;
  143.                 while(!key5);
  144.         }
  145. }
  146.   if(key6==0)
  147. {
  148.          delay(1);
  149.         if(key6==0)
  150.         {
  151.                 k=5;
  152.                 while(!key6);
  153.         }
  154. }
  155.   if(key7==0)
  156. {
  157.          delay(1);
  158.         if(key7==0)
  159.         {
  160.                 k=6;
  161.                 while(!key7);
  162.         }
  163. }
  164.   if(key8==0)
  165. {
  166.          delay(1);
  167.         if(key8==0)
  168.         {
  169.                 k=7;
  170.                 while(!key8);
  171.         }
  172. }
  173. }


  174. //主程序
  175. void main()
  176. {
  177.    uchar i;
  178.    EA=1;        //开启总中断
  179.    EX0=1;       //开外中断0
  180.    ET0=1;       //定时器T0中断允许
  181.    IT0=1;       //外中断的下降沿触发  
  182.         TMOD=0x01;   //使用定时器T0的模式1
  183.         TR0=0;       //定时器T0关闭
  184.         while(1)
  185.         {        //从数组中读取数据送至P0和P2口显示
  186.                
  187.                 for(i=k*8;i<k*8+8;i++)
  188.                 {        
  189.                  keyscan();
  190.                         P0=Pattern_P0[i];
  191.                         P1=Tab[k+1];
  192.                         delay(100);
  193.                 }
  194.         }
  195. }
  196. /************************************************************
  197. 函数功能:红外线触发的外中断处理函数
  198. *************************************************************/
  199. void Int0(void) interrupt 0 using 0
  200.   {
  201.      EX0=0;      //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
  202.           TH0=0;      //定时器T0的高8位清0
  203.           TL0=0;      //定时器T0的低8位清0
  204.           TR0=1;            //开启定时器T0         
  205.           while(IR==0)          //如果是低电平就等待,给引导码低电平计时
  206.                ;     
  207.           TR0=0;                //关闭定时器T0     
  208.           LowTime=TH0*256+TL0;  //保存低电平时间
  209.           TH0=0;      //定时器T0的高8位清0
  210.           TL0=0;      //定时器T0的低8位清0
  211.           TR0=1;            //开启定时器T0
  212.           while(IR==1)  //如果是高电平就等待,给引导码高电平计时
  213.             ;
  214.           TR0=0;        //关闭定时器T0
  215.           HighTime=TH0*256+TL0;        //保存引导码的高电平长度
  216.      if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
  217.                  {
  218.                     //如果是引导码,就开始解码,否则放弃,引导码的低电平计时
  219.                //次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
  220.                if(DeCode()==1)        
  221.                      Function();           //如果满足条件,执行遥控功能
  222.                  }
  223.           EX0=1;   //开启外中断EX0
  224.   }
复制代码

所有资料51hei提供下载:
花样流水灯.zip (73.9 KB, 下载次数: 133)
回复

使用道具 举报

ID:112386 发表于 2018-6-21 10:18 | 显示全部楼层
受教了
回复

使用道具 举报

ID:363249 发表于 2018-7-4 16:05 | 显示全部楼层
你好,问什么进行红外遥控的时候,按键并没有反应。仿真倒是没问题
回复

使用道具 举报

ID:363249 发表于 2018-7-4 16:06 | 显示全部楼层

你好,你能进行红外遥控吗
回复

使用道具 举报

ID:89286 发表于 2018-7-4 20:51 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:251357 发表于 2018-9-26 10:03 | 显示全部楼层
看看学习了,还在为论文的事发愁呢
回复

使用道具 举报

ID:455251 发表于 2018-12-28 16:38 | 显示全部楼层
谢谢分享,能再叙述一下如何用红外遥控器调试吗?
回复

使用道具 举报

ID:454543 发表于 2018-12-29 10:45 | 显示全部楼层
你好,进行了仿真实验,在单片机上也可以进行按键操作,为什么无法用红外遥控操作
回复

使用道具 举报

ID:462953 发表于 2019-1-6 12:40 | 显示全部楼层
的和客观环境 发表于 2018-12-29 10:45
你好,进行了仿真实验,在单片机上也可以进行按键操作,为什么无法用红外遥控操作

你好 能不能发一份压缩包呢 谢谢 1752519246@q.com
回复

使用道具 举报

ID:468666 发表于 2019-1-15 17:20 | 显示全部楼层
设计抽到单片机,学习
回复

使用道具 举报

ID:511591 发表于 2019-4-13 23:38 | 显示全部楼层
学习中,值得学习
回复

使用道具 举报

ID:541423 发表于 2019-5-18 15:20 | 显示全部楼层
这个有两处错误诶
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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