找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红外线遥控七色小灯 Proteus仿真加源程序

  [复制链接]
跳转到指定楼层
楼主
这种调光效果如果51黑电子论坛的朋友们有机会做成实物的话效果一定很酷炫.
51单片机做的红外线遥控七色小灯的仿真原理图(proteus工程文件可到本帖附件下载):


单片机源程序:

  1. //----------------------------------------------------------------------------------------------------------------------------------
  2. //程序名:IRKD6-3
  3. //程序功能:红外线遥控七色小灯
  4. // --------------------------------------------------------------------------------------------------------------------------------
  5. #include<reg51.h>                                             //头文件
  6. sbit IRIN=P3^2;                                                 //定义红外IR信号输入位
  7. sbit R_LED=P0^0;                             //定义发红光LED控制引脚        
  8. sbit G_LED=P0^1;                             //定义发绿光LED控制引脚
  9. sbit B_LED=P0^2;                             //定义发蓝光LED控制引脚
  10. sbit SPK=P2^7;                               //定义压电喇叭信号输入位
  11. unsigned char IRDATA[7];                             //定义数组,存储红外接收到的数据
  12. void delay(unsigned char x);                 //延时约x*0.1ms 函数
  13. void fs_d ( );                               //发声函数
  14. void IR_ZX();                                //遥控执行函数

  15. //-------------------------------------- 主函数 --------------------------------------

  16. void main()                                   //主函数
  17. {
  18.         EA=1;                                     //允许总中断
  19.     EX0=1;                                    //允许外部中断INT0中断
  20.         IT0=1;                                    //外部中断INT0采用脉冲触发方式
  21.         fs_d ( );
  22.         {       
  23.           IRIN=1;                                 //IR 输入位设置为高电平
  24.           P0=0xff;
  25.              IR_ZX();  
  26.           while(1);                               //无限循环
  27.     }
  28. }

  29. //-------------------------------------- 延时函数  -----------------------------------

  30. void delay(unsigned char x)                           //延时约x*0.1ms  
  31. {                                                                                         
  32.         unsigned char i;                                                                
  33.         while(x--)                                                           
  34.         {for(i=0;i<10;i++){}}                                
  35. }

  36. //------------------------------------- 中断解码函数 ----------------------------------

  37. void IR_IN() interrupt 0 using 0                        //外部中断INT0函数
  38. {
  39. unsigned char j,k,n=0;                                            //定义变量,且n=0
  40.     EX0=0;                                                                            //暂时先关中断
  41.         delay(20);                                                        //延时0.10ms*20=2ms
  42.         if(IRIN==1)                                                //如果IRIN出现高电平,是干扰信号
  43.          {                                                                    
  44.            EX0=1;
  45.            return;                                  //返回                 
  46.          }
  47.         while(!IRIN){delay(1);}                                //避开9ms前导低电平信

  48.    for(j=0;j<4;j++)                                                    //一共有4组数据
  49.      {       
  50.           for(k=0;k<8;k++)                                            //每组数据有8位
  51.          {
  52.    while(IRIN){delay(1);}                            // 避开4.5ms高电平
  53.    while(!IRIN){delay(1);}                                 
  54. // 开始接收数据         
  55.    while(IRIN)                                                 
  56.          {
  57.            delay(1);                                             //延时0.1ms
  58.        n++;                                                             //每过0.1ms时n就加1
  59.            if(n>=30)                                         //如果超过30,放弃
  60.                 {                                                              
  61.                   EX0=1;
  62.                   return;}                               //返回
  63.                 }
  64.                   
  65.               IRDATA[j]=IRDATA[j]>>1;                //右移1位
  66.           if(n>=8){IRDATA[j]=IRDATA[j]|0x80;}                                                                   
  67.               n=0;                                         //n清0
  68.             }
  69.      }
  70. //检查接收的数据和数据反码是否相反          
  71.     if(IRDATA[2]!=~IRDATA[3])                         //判断数据码和数据反码是不是相反
  72.            {                                                                         //否则就放弃
  73.              EX0=1;
  74.              return;
  75.            }       
  76. //        遥控执行          
  77.      else   
  78.              EX0=1;                                  //开中断
  79.          fs_d ( );                               //调用发声函数       
  80.         }       


  81. //-------------------------------------  发声函数  -----------------------------------------
  82. void fs_d ( )                                                  
  83.   {                                                                                                                   
  84.         unsigned char i;                                               
  85.         for(i=0;i<100;i++)
  86.          {
  87.            delay(4);                                                     
  88.            SPK=~SPK;
  89.          }                                                                        
  90.            SPK=1;
  91. }
  92.             
  93. //------------------------------------  遥控执行函数 --------------------------------------

  94. void IR_ZX()                                       //遥控执行函数
  95.      {
  96.        while(1)
  97.         {
  98.                   switch(IRDATA[2])  
  99.             {
  100. //发红色光   
  101.                          case 0x01:                     
  102.                {
  103.                                  G_LED=1;                          //绿光LED熄灭
  104.                  B_LED=1;                          //蓝光LED熄灭
  105.                  R_LED=0;                          //红光LED亮
  106.                  break;
  107.                           }
  108. //发黄色光         
  109.              case 0x02:                     
  110.                {
  111.                              B_LED=1;                         //蓝光LED熄灭
  112.                  R_LED=0;                         //红光LED亮
  113.                  G_LED=0;                         //绿光LED亮
  114.                  break;
  115.                           }
  116.   //发绿色光               
  117.             case 0x03:                        
  118.                {
  119.                      B_LED=1;                         //蓝光LED熄灭
  120.                  R_LED=1;                         //红光LED灭
  121.                  G_LED=0;                         //绿光LED亮
  122.                  break;
  123.                           }
  124. //发青色光
  125.             case 0x04:                        
  126.                {
  127.                      R_LED=1;                          //红光LED熄灭
  128.                  G_LED=0;                          //绿光LED亮
  129.                  B_LED=0;                          //蓝光LED亮
  130.                  break;
  131.                           }
  132.   //发蓝色光        
  133.              case 0x05:                        
  134.                {
  135.                      R_LED=1;                          //红光LED熄灭
  136.                  G_LED=1;                          //绿光LED熄灭
  137.                  B_LED=0;                          //蓝光LED亮
  138.                  break;
  139.                           }   
  140.   //发紫色光
  141.              case 0x06:                        
  142.                {
  143.                      G_LED=1;                          //绿光LED熄灭
  144.                  R_LED=0;                          //红光LED亮                                   
  145.                  B_LED=0;                          //蓝光LED亮
  146.                  break;
  147.                           }
  148.   //发白色光
  149.              case 0x07:                          
  150.                {
  151.                  R_LED=0;                          //红光LED亮
  152.                  G_LED=0;                          //绿光LED亮
  153.                  B_LED=0;                          //蓝光LED亮
  154.                  break;
  155.                           }
  156.   //关闭彩灯            
  157.                     case 0x08:                           
  158.                {
  159.                      R_LED=1;                          //红光LED熄灭
  160.                  G_LED=1;                          //绿光LED熄灭
  161.                  B_LED=1;                          

  162. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码




该系列源码包含有很多非常经典,代码风格十分规范,而且注释详细的单片机例程,还带仿真,对于MCU学习特别是初学者是很有帮助的,全部源码下载(共25个项目):http://www.51hei.com/bbs/dpj-79328-1.html

本例程下载(含proteus仿真工程文件与源码):
单片机红外线遥控七色小灯.rar (51.55 KB, 下载次数: 166)




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

使用道具 举报

沙发
ID:193795 发表于 2017-4-29 09:50 | 只看该作者
仿真的时候,添加hex文件怎样添加
回复

使用道具 举报

板凳
ID:206106 发表于 2017-5-30 17:31 | 只看该作者
膜拜大佬
回复

使用道具 举报

地板
ID:251082 发表于 2017-12-22 13:00 | 只看该作者
谢谢大佬了拿去修改一下
回复

使用道具 举报

5#
ID:256057 发表于 2018-1-3 15:05 | 只看该作者
我试了一下,在proteus仿真的时候会出现“在U2 HP中丢失的接口模型AT89”这个问题,楼主求解
回复

使用道具 举报

6#
ID:410094 发表于 2018-10-16 19:27 | 只看该作者
有发射的源码吗
回复

使用道具 举报

7#
ID:416703 发表于 2018-10-28 14:35 | 只看该作者
是全部源码吗?图2个芯片啊
回复

使用道具 举报

8#
ID:417167 发表于 2018-10-29 14:03 | 只看该作者
毕设可以考虑
回复

使用道具 举报

9#
ID:526362 发表于 2019-5-3 21:32 | 只看该作者
有发送端的代码吗?
回复

使用道具 举报

10#
ID:728172 发表于 2020-4-28 14:34 | 只看该作者
感谢分享这么好的资源,楼主有福!
回复

使用道具 举报

11#
ID:739690 发表于 2020-4-28 15:37 | 只看该作者
你好,程序打不开是什么原因呢
回复

使用道具 举报

12#
ID:739690 发表于 2020-4-28 16:24 | 只看该作者
你好,我想问一下怎么样实现让LED灯亮起来呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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