单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 294|回复: 0
收起左侧

DMAVR-L的红外遥控器解码通信实验源程序,采用一体化红外接收头进行信号接收,查询方式

[复制链接]
1804181935 发表于 2019-7-24 20:21 | 显示全部楼层 |阅读模式
//DMAVR-L的红外遥控器解码通信实验源程序,采用一体化红外接收头进行信号接收,查询方式
//按键值直接反应到LED灯上,比如按0键,键值为0,送入LED灯,8个全亮,按键1,亮7个,D1不亮,以此类推
//硬件相关的配置文件在Config.h里,自己建立项目时,需要复制到项目文件夹下
//系统时钟16MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms
//编译环境 AVR Studio 4.19/AVR ToolChain V3.4

  1. //***********************************************************************
  2. //                包含文件
  3. //***********************************************************************
  4. #include <string.h>
  5. #include <stdio.h>
  6. #define         F_CPU        16000000                                // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行
  7. #include <util/delay.h>
  8. #include <avr/io.h>
  9. #include <avr/iom128.h>
  10. #include <avr/interrupt.h>                           //中断信号头文件
  11. #include  <avr/pgmspace.h>                          //须增加的头文件,用来将数据存放在flash中
  12. #include "Config.h"                         //配置头文件,与硬件相关的配置在这里更改

  13. //***********************************************************************
  14. //                        定义变量区
  15. //***********************************************************************
  16. uchar key;
  17. uint temp_value;
  18. uint temp,A;                                           //定义的变量,显示数据处理
  19. uchar code_value=0;
  20. uchar key_code[4];
  21. uint l,p;

  22. //***********************************************************************
  23. //                        遥控器键码
  24. //***********************************************************************

  25. #define KEY_0     0x16                 //键0
  26. #define KEY_1     0x0C                 //键1
  27. #define KEY_2     0x18                 //键2
  28. #define KEY_3     0x5E                 //键3
  29. #define KEY_4     0x08                 //键4
  30. #define KEY_5     0x1C                 //键5
  31. #define KEY_6     0x5A                 //键6
  32. #define KEY_7     0x42                 //键7
  33. #define KEY_8     0x52                 //键8
  34. #define KEY_9     0x4A                 //键9
  35. #define KEY_POWER 0x45                 //电源
  36. #define KEY_MODE  0x46                 //模式
  37. #define KEY_SOUND 0x47                 //静音


  38. //***********************************************************************
  39. //                        IO端口初始化
  40. //***********************************************************************

  41. void system_init()
  42. {

  43.         LED = 0xFF;               //关LED
  44.         LEDDDR = 0xFF;

  45.     RED_SET;
  46.         RED_IN;
  47. }

  48. //*************************************************************************
  49. //            显示采集到的数据到LED灯
  50. //*************************************************************************

  51. void Display_Key(uint data_KEY)
  52. {   
  53.     LED = data_KEY;      //键值显示到LED灯上,二进制的形式显示,只识别0~9
  54. }

  55. //*************************************************************************
  56. //                        遥控器键值赋功能值子程序
  57. //*************************************************************************
  58. void Key_Icode(void)
  59. {
  60.    switch(key_code[2])
  61.    {
  62.     case KEY_0:key=0;break;
  63.         case KEY_1:key=1;break;
  64.         case KEY_2:key=2;break;
  65.         case KEY_3:key=3;break;
  66.         case KEY_4:key=4;break;
  67.         case KEY_5:key=5;break;
  68.         case KEY_6:key=6;break;
  69.         case KEY_7:key=7;break;
  70.         case KEY_8:key=8;break;
  71.         case KEY_9:key=9;break;
  72.         default:key=10;break;
  73.    }
  74. }

  75. //*************************************************************************
  76. //                        遥控器解码子程序
  77. //*************************************************************************

  78. void Red_Code()
  79. {
  80. uchar i,j,k = 0;

  81. for(i = 0;i < 19;i++)
  82. {
  83.   delay_us(400);           //延时400us
  84.   if(RED_R)                //9ms内有高电平,则判断为干扰,退出处理程序
  85.   {
  86.       return;
  87.   }
  88. }

  89. while(!RED_R);            //等待9ms低电平过去



  90. for(i=0;i<5;i++)          //是否连发码
  91. {
  92.   delay_us(500);
  93.   if(!RED_R)
  94.    {
  95.      return;
  96.    }
  97. }


  98. while(RED_R);               //等待4.5ms高电平过去

  99. for(i = 0;i < 4;i++)        //接收4个字节的数据
  100. {
  101.   for(j = 0;j < 8;j++)      //每个字节的数据8位
  102.   {


  103.    while(!RED_R);         //等待变高电平
  104.    while(RED_R)           //计算高电平时间
  105.    {
  106.     delay_us(100);
  107.     k++;
  108.     if(k >= 22)           //高电平时间过长,则退出处理程序
  109.     {
  110.      return;              //
  111.     }

  112.    }

  113.    code_value>>=1;        //接受一位数据
  114.    if(k >= 8)
  115.    {
  116.     code_value|=0x80;           //高电平时间大于0.56,则为数据1
  117.    }
  118.    k = 0;                  //计时清零
  119.   }
  120.   key_code[i]=code_value;  //四个字节的数据
  121. }

  122.   Key_Icode();             //调用赋值函数

  123.   Display_Key(key);        //显示按键值

  124. }


  125. //*************************************************************************
  126. //                        主程序
  127. //*************************************************************************
  128. int main(void)
  129. {
  130.   system_init();         //系统初始化
  131.   while(1)
  132. {
  133.     Red_Code();          //调用遥控器解码子程序

  134. }

  135. }
复制代码


iRED.zip

22.75 KB, 下载次数: 0, 下载积分: 黑币 -5

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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