找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机遥控接收器 红外NEC协议 代码有详细注释

[复制链接]
跳转到指定楼层
楼主
51单片机,红外NEC协议,ds18b20温度传感器(P3.7),红外接收器7844s,三位一体共阴数码管(段码:P2,位码:P1.1,P1.2,P1.3),上拉电阻A102,接触器(5v)接P1.3,(程序已亲测,放心使用)


单片机源程序如下(源代码的注释非常详细):
  1. #include<reg52.h>
  2. #include"inf.h"
  3. #include"relay.h"
  4. #include"ds18b20.h"
  5. #include"dig.h"

  6. extern uchar IRCOM[5];          //用来存放读取到的红外值
  7. extern unsigned char DisplayData[3];
  8. extern uchar code DIG_CODE[10];
  9. extern uchar code  RecvData[];
  10. int time=2100;
  11. int SET_Flag=0;//0 是非设置状态  1 是设置状态

  12. /***********************************************函数声明**********************************************************/
  13. void TempDisplayTest(void);// DS18B20进行温度转换并进行读取,计算出来(并显示)
  14. extern void Contro_lrelay(uchar ConType,uint k);
  15. void key_scan();


  16. void main()
  17. {
  18.         int tempC=0,te,biao1=0,biao2=0;
  19.         uint ss=0;
  20.         InfInit();
  21.                
  22.         while(1)
  23.         {                         
  24.                  key_scan();
  25.                  
  26.                  //获取温度
  27.                  tempC=LcdDisplay(Ds18b20ReadTemp());
  28.                  
  29.                  //如果设置的温度值大于室内温度,继电器闭合
  30.                  te=tempC% 10000;
  31.                  if(biao1==1)

  32.                  goto end1;
  33.                  if(te>=time)
  34.                  {
  35.                          Contro_lrelay(16,1);        //继电器断开
  36.                           biao1=1;
  37.                           biao2=0;
  38.                  }
  39.                  end1:
  40.                  if(biao2==1)

  41.                  goto end2;
  42.                  if(te<time)
  43.                  {
  44.                          Contro_lrelay(15,1);        //继电器闭合
  45.                         biao2=1;
  46.                         biao1=0;
  47.                  }
  48.                  end2:
  49.                  //设置状态
  50.                  if(SET_Flag)
  51.                  {
  52.                          tempC=time;
  53.                         ss++;
  54.                  }
  55.                  //工作状态
  56.                  else
  57.                  {
  58.                          ss=0;
  59.                  }

  60.                  if(ss<=40)
  61.                  {
  62.                     //显示
  63.                          DigDisplay(tempC);
  64.                  }
  65.                  else if(ss<=60)
  66.                  {
  67.                          GPIO_DIG=0x00;
  68.                         if(ss==60)
  69.                         ss=0;
  70.                  }                 
  71.         }                                                       
  72. }

  73. /*******************************************************************************
  74. * 函 数 名         : key_scan()
  75. * 函数功能                   : 温度调节用
  76. * 输    入         : i
  77. * 输    出         : 无
  78. *******************************************************************************/
  79. void key_scan()
  80. {
  81.         int i=0;
  82.         int j=0;
  83.         uchar Keydate=0;
  84.         for(j=0;j<9;j++)                                   //循环进行键码解析
  85.         {
  86.                 if(IRCOM[2]==RecvData[j])                       //进行键位对应
  87.                 {
  88.                         Keydate=IRCOM[2];
  89.                         IRCOM[2]=0;
  90.                         break;
  91.                 }                                      
  92.         }               
  93.         switch(Keydate)
  94.         {
  95.                 case 0x07://-
  96.                 {
  97.                         time -=100;
  98.                         break;
  99.                 }
  100.                 case 0x15://+
  101.                 {
  102.                         time +=100;
  103.                         break;
  104.                 }
  105.                 case 0x09://Set
  106.                 {
  107.                         SET_Flag=~SET_Flag;
  108.                         break;
  109.                 }
  110.         }


  111. }
  112.           
复制代码
  1. #include"inf.h"
  2. #include"relay.h"
  3. uchar IRCOM[5];          //用来存放读取到的红外值 (IrValue[4])
  4. sbit IRIN=P3^2;   //红外接收器数据接口

  5. //存放按键键值(NEC红外协议)
  6. uchar code  RecvData[]={0x07,0x15,0x09,0x43,0x47,0x0d,0x44,0x40,0x0D,0x0E};


  7. /***********************************************************
  8. *函 数 名        :InfInit
  9. *函数功能  :为外部中断0,做初始化
  10. *函数参数  :x
  11. *返 回 值        :无
  12. ************************************************************/
  13. void InfInit()
  14. {
  15.         IT0=1;//下降沿触发
  16.         EX0=1;//打开中断0允许
  17.         EA=1;        //打开总中断
  18.         IRIN=1;//初始化端口
  19. }


  20. /***********************************************************
  21. *函 数 名        :delayms
  22. *函数功能  :延时0.14ms
  23. *函数参数  :x
  24. *返 回 值        :无
  25. ************************************************************/
  26. static void delayms(unsigned char x)                         //0.14mS延时程序
  27. {
  28.   unsigned char i;                                    //定义临时变量
  29.   while(x--)                                          //延时时间循环
  30.   {
  31.     for (i = 0; i<13; i++) {}                         //14mS延时
  32.   }
  33. }


  34. /***********************************************************
  35. *函 数 名        :IR_IN
  36. *函数功能  :外部中断0
  37. *函数参数  :无
  38. *返 回 值        :无
  39. ************************************************************/
  40. void IR_IN() interrupt 0// using 0                      //定义INT2外部中断函数
  41. {
  42.   unsigned char j,k,N=0;                              //定义临时接收变量
  43.    
  44.   EX0 = 0;                                            //关闭外部中断,防止再有信号到达   
  45.   delayms(15);                                        //延时时间,进行红外消抖
  46.   if (IRIN==1)                                        //判断红外信号是否消失
  47.   {  
  48.      EX0 =1;                                          //外部中断开
  49.          return;                                          //返回
  50.   }
  51.                            
  52.   while (!IRIN)                                       //等IR变为高电平,跳过9ms的前导低电平信号。
  53.   {
  54.       delayms(1);                                     //延时等待
  55.   }

  56.   for (j=0;j<4;j++)                                   //采集红外遥控器数据
  57.   {
  58.     for (k=0;k<8;k++)                                 //分次采集8位数据
  59.     {
  60.        while (IRIN)                                   //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  61.        {
  62.          delayms(1);                                  //延时等待
  63.        }
  64.       
  65.        while (!IRIN)                                  //等 IR 变为高电平
  66.        {
  67.          delayms(1);                                  //延时等待
  68.        }
  69.    
  70.        while (IRIN)                                   //计算IR高电平时长
  71.        {
  72.          delayms(1);                                  //延时等待
  73.          N++;                                         //计数器加加
  74.          if (N>=30)                                   //判断计数器累加值
  75.              {
  76.            EX0=1;                                     //打开外部中断功能
  77.                return;                                    //返回
  78.          }                  
  79.        }
  80.                                        
  81.       IRCOM[j]=IRCOM[j] >> 1;                         //进行数据位移操作并自动补零
  82.      
  83.       if (N>=8)                                       //判断数据长度
  84.       {
  85.          IRCOM[j] = IRCOM[j] | 0x80;                  //数据最高位补1
  86.       }
  87.       N=0;                                            //清零位数计录器
  88.     }
  89.   }
  90.    
  91.   if (IRCOM[2]!=~IRCOM[3])                            //判断地址码是否相同
  92.   {
  93.      EX0=1;                                           //打开外部中断
  94.      return;                                          //返回
  95. ……………………

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

所有资料51hei提供下载:
遥控控制、温度显示 (最终程序).zip (76.46 KB, 下载次数: 73)


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

使用道具 举报

沙发
ID:281938 发表于 2018-3-9 19:49 | 只看该作者
请问你知道如何使用遥控功能吗?自动的比如循迹小车我会做,但是遥控功能的却不会
回复

使用道具 举报

板凳
ID:289186 发表于 2018-3-31 10:23 | 只看该作者
haogege1014 发表于 2018-3-9 19:49
请问你知道如何使用遥控功能吗?自动的比如循迹小车我会做,但是遥控功能的却不会

遥控的需要用一个红外接收器、和红外遥控(NEC协议),就可以实现的
回复

使用道具 举报

地板
ID:61973 发表于 2018-7-29 21:17 来自手机 | 只看该作者
haogege1014 发表于 2018-3-9 19:49
请问你知道如何使用遥控功能吗?自动的比如循迹小车我会做,但是遥控功能的却不会

那只能说明循迹小车也是抄的
回复

使用道具 举报

5#
ID:618124 发表于 2019-9-30 08:24 | 只看该作者
罗文杰 发表于 2018-7-29 21:17
那只能说明循迹小车也是抄的

有轮子何必再造
回复

使用道具 举报

6#
ID:618689 发表于 2019-10-1 23:46 | 只看该作者
nec协议相对简单一点,实现起来比较容易,可以用IO中断来处理
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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