找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7625|回复: 6
收起左侧

单片机红外线遥控开关实验 Proteus仿真加源程序

[复制链接]
ID:175881 发表于 2017-3-29 23:08 | 显示全部楼层 |阅读模式
单片机用红外线来遥控一个开关实验的仿真原理图(proteus工程文件可到本帖附件下载):
0.png

单片机源程序:


  1. //----------------------------------------------------------------------------------------------------------------------------------
  2. //程序名:  HW6-3.c
  3. //程序功能:红外线遥控开关程序
  4. // --------------------------------------------------------------------------------------------------------------------------------

  5. #include<reg51.h>                                                   //头文件
  6. sbit IRIN=P3^2;                                                       //定义红外IR信号输入位
  7. sbit SPK=P0^0;                                     //定义蜂鸣器接口
  8. sbit RELAY=P2^7;                                   //定义继电器接口
  9. unsigned char IRDATA[7];                                   //定义数组,存储红外接收到的数据
  10. void delay(unsigned char x);
  11. void fs_d ( );       
  12. //-------------------------------------- 主函数 --------------------------------------
  13. void main()
  14. {
  15.         EA=1;                                          // 允许总中断
  16.     EX0=1;                                         // 允许外部中断INT0中断
  17.         IT0=1;                                         // 外部中断INT0采用脉冲触发方式
  18.         SPK=1;                                         // 设置SPK初始值
  19.         IRIN=1;                                        // IR 输入位设置为高电平
  20.         while(1);                                      // 无限循环
  21. }

  22. //--------------------------------------- 延时函数  ------------------------------------

  23. void delay(unsigned char x)                               //延时约x*0.1ms  
  24. {                                                                                         
  25.         unsigned char i;                                                                
  26.         while(x--)                                                           
  27.         {for(i=0;i<10;i++){}}                                
  28. }

  29. //-------------------------------------  发声函数  -------------------------------------

  30. void fs_d ( )                                                  
  31. {                                                                                                                   
  32.         unsigned char i;                                               
  33.         for(i=0;i<100;i++)
  34.          {
  35.            delay(4);                                                     
  36.            SPK=~SPK;
  37.          }                                                                        
  38.         SPK=1;
  39. }

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


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

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

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

0.png


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

本例程下载(含proteus仿真工程文件与源码):
6-3单片机红外线遥控开关实验.rar (74.52 KB, 下载次数: 105)
回复

使用道具 举报

ID:197189 发表于 2017-5-6 09:44 | 显示全部楼层
好资料。
回复

使用道具 举报

ID:225259 发表于 2017-8-6 18:16 | 显示全部楼层
呵呵,怎么没人顶!看不懂叫喔!
回复

使用道具 举报

ID:440585 发表于 2019-12-9 10:03 | 显示全部楼层
谢谢楼主分享  正需要一个遥控开关程序   
回复

使用道具 举报

ID:440585 发表于 2019-12-10 08:20 | 显示全部楼层
楼主忽悠人呀 ,没有发射程序  ,接收程序也不全  能真诚点不
回复

使用道具 举报

ID:540262 发表于 2019-12-10 09:39 来自手机 | 显示全部楼层
不错不错 要是可以直接下载就好啦
回复

使用道具 举报

ID:728172 发表于 2020-4-24 11:03 | 显示全部楼层
多向前辈学习,这么好的资料!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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