目录

一、主函数

二、红外模块(IR)

1.IR.c

2.IR.h


一、主函数

/*定时器1初始化*/
void Timer1Init()
{TMOD |= 0x10;TL1 = 0x18;TH1 = 0xFC;TR1 = 1;ET1 = 1;EA = 1;PT1 = 0;
}void main()
{IR_Init();Timer1Init();while(1){/*按键控制*/
//          if(k1==0)
//          {
//                  delay(100);
//                  if(k1==0)
//                  {
//                          falg = 1;
//                          TR1 = 0;
//                          MusicSelect = 0;
//                  }
//              while(!k1);
//          }
//
//          if(k2==0)
//          {
//                  delay(100);
//                  if(k2==0)
//                  {
//                          falg = 2;
//                          TR1 = 0;
//                          MusicSelect = 0;
//                  }
//              while(!k2);
//          }/*红外遥控*/if(IR_GetDataFlag()||IR_GetRepeatFlag())            //判断是否收到数据(IR_GetDataFlag()按一下|IR_GetRepeatFlag()长按){Command = IR_GetCommand();            //获取遥控器命令码if(Command==IR_PREVIOUS){falg = 1;TR1 = 0;MusicSelect = 0;} //判断建码一致  切第一首歌if(Command==IR_NEXT)  {falg = 2;TR1 = 0;MusicSelect = 0;}   //判断建码一致  切第二首歌}switch(falg){case 1:if(Music1[MusicSelect]!=0xFF)//判断是否等于终止标志位{FreqSelect = Music1[MusicSelect];//获取音符对应的频率MusicSelect++;           //MusicSelect++转换至音符长度delay(SPEED/4*Music1[MusicSelect]);//选择音符对应的时间长度(时值)MusicSelect++;         //MusicSelect++转换至下一个音符TR1 = 0;delay(5);                    //音符间短暂停顿TR1 = 1;}else                //如果是停止标识符清零重新播放{TR1 = 0;MusicSelect = 0;}         break;case 2:if(Music2[MusicSelect]!=0xFF)//判断是否等于终止标志位{FreqSelect = Music2[MusicSelect];//获取音符对应的频率MusicSelect++;          //MusicSelect++转换至音符长度delay(SPEED/4*Music2[MusicSelect]);//选择音符对应的时间长度(时值)MusicSelect++;        //MusicSelect++转换至下一个音符TR1 = 0;delay(5);                //音符间短暂停顿TR1 = 1;}else                  //如果是停止标识符清零重新播放{TR1 = 0;MusicSelect = 0;}          break;}         }}void Timer1_Routine() interrupt 3
{if(FreqSelect)   //判断是否为休止符{/*取对应频率值的重装载值到定时器*/TL1 = FreqTable_L[FreqSelect];   //设置定时器初值TH1 = FreqTable_H[FreqSelect];   //设置定时器初值Buzz = !Buzz;//翻转蜂鸣器IO口}
}

二、红外模块(IR)

1.IR.c

#include <REGX52.H>
#include "Timer0.h"
#include "Int0.h"unsigned int IR_Time;
unsigned char IR_State;unsigned char IR_Data[4];
unsigned char IR_pData;unsigned char IR_DataFlag;
unsigned char IR_RepeatFlag;
unsigned char IR_Address;
unsigned char IR_Command;/*** @brief  红外遥控初始化* @param  无* @retval 无*/
void IR_Init(void)
{Timer0_Init();Int0_Init();
}/*** @brief  红外遥控获取收到数据帧标志位* @param  无* @retval 是否收到数据帧,1为收到,0为未收到*/
unsigned char IR_GetDataFlag(void)
{if(IR_DataFlag){IR_DataFlag=0;return 1;}return 0;
}/*** @brief  红外遥控获取收到连发帧标志位* @param  无* @retval 是否收到连发帧,1为收到,0为未收到*/
unsigned char IR_GetRepeatFlag(void)
{if(IR_RepeatFlag){IR_RepeatFlag=0;return 1;}return 0;
}/*** @brief  红外遥控获取收到的地址数据* @param  无* @retval 收到的地址数据*/
unsigned char IR_GetAddress(void)
{return IR_Address;
}/*** @brief  红外遥控获取收到的命令数据* @param  无* @retval 收到的命令数据*/
unsigned char IR_GetCommand(void)
{return IR_Command;
}//外部中断0中断函数,下降沿触发执行
void Int0_Routine(void) interrupt 0
{if(IR_State==0)              //状态0,空闲状态{Timer0_SetCounter(0); //定时计数器清0Timer0_Run(1);         //定时器启动IR_State=1;             //置状态为1}else if(IR_State==1)      //状态1,等待Start信号或Repeat信号{IR_Time=Timer0_GetCounter();   //获取上一次中断到此次中断的时间Timer0_SetCounter(0);  //定时计数器清0//如果计时为13.5ms,则接收到了Start信号(判定值在12MHz晶振下为13500,在11.0592MHz晶振下为12442)if(IR_Time>12442-500 && IR_Time<12442+500){IR_State=2;          //置状态为2}//如果计时为11.25ms,则接收到了Repeat信号(判定值在12MHz晶振下为11250,在11.0592MHz晶振下为10368)else if(IR_Time>10368-500 && IR_Time<10368+500){IR_RepeatFlag=1;   //置收到连发帧标志位为1Timer0_Run(0);     //定时器停止IR_State=0;         //置状态为0}else                    //接收出错{IR_State=1;         //置状态为1}}else if(IR_State==2)     //状态2,接收数据{IR_Time=Timer0_GetCounter(); //获取上一次中断到此次中断的时间Timer0_SetCounter(0);  //定时计数器清0//如果计时为1120us,则接收到了数据0(判定值在12MHz晶振下为1120,在11.0592MHz晶振下为1032)if(IR_Time>1032-500 && IR_Time<1032+500){IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));    //数据对应位清0IR_pData++;          //数据位置指针自增}//如果计时为2250us,则接收到了数据1(判定值在12MHz晶振下为2250,在11.0592MHz晶振下为2074)else if(IR_Time>2074-500 && IR_Time<2074+500){IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));  //数据对应位置1IR_pData++;          //数据位置指针自增}else                 //接收出错{IR_pData=0;         //数据位置指针清0IR_State=1;          //置状态为1}if(IR_pData>=32)        //如果接收到了32位数据{IR_pData=0;          //数据位置指针清0if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3]))    //数据验证{IR_Address=IR_Data[0];  //转存数据IR_Command=IR_Data[2];IR_DataFlag=1;    //置收到连发帧标志位为1}Timer0_Run(0);        //定时器停止IR_State=0;         //置状态为0}}
}

2.IR.h

#ifndef __IR_H__
#define __IR_H__
/*红外遥控的键值*/
#define IR_POWER        0x45
#define IR_MODE         0x46
#define IR_MUTE         0x47
#define IR_START_STOP   0x44
#define IR_PREVIOUS     0x40
#define IR_NEXT         0x43
#define IR_EQ           0x07
#define IR_VOL_MINUS    0x15
#define IR_VOL_ADD      0x09
#define IR_0            0x16
#define IR_RPT          0x19
#define IR_USD          0x0D
#define IR_1            0x0C
#define IR_2            0x18
#define IR_3            0x5E
#define IR_4            0x08
#define IR_5            0x1C
#define IR_6            0x5A
#define IR_7            0x42
#define IR_8            0x52
#define IR_9            0x4Avoid IR_Init(void);
unsigned char IR_GetDataFlag(void);
unsigned char IR_GetRepeatFlag(void);
unsigned char IR_GetAddress(void);
unsigned char IR_GetCommand(void);#endif

红外遥控切歌(好运来/天空之城)、红外模块的应用相关推荐

  1. 基于红外遥控的门禁系统(红外遥控、步进电机)

    基于红外遥控的门禁系统(红外遥控.步进电机) 闲来无事,用手头STM32做个项目. 成品功能: 功能说明 材料 STM32ZET6开发板 TFT显示屏(战舰有我用的2.7寸的) 红外接收器和遥控器 五 ...

  2. 嵌入式Linux红外遥控,一个简单的IAL分析(红外遥控)(转)

    简单的IAL分析 一.程序说明 1.下面程序是基于一个红外的设备文件,从该设备中能接收到红外遥控的硬件编码. 2.两个文件需要覆盖掉libmingiui*/src/ial/中的两个文件编译时加上 -- ...

  3. 红外遥控c语言,HiFiBox DAC + RuneAudio 红外遥控方案(C语言实现)

    之前在<HiFiBox DAC 自定义红外遥控配置教程>中介绍了树莓派上红外遥控的编码学习和使用,并且实现了遥控控制音乐播放的功能. 以上方案是基于 lirc 提供的软件实现.有树莓派玩家 ...

  4. linux红外遥控进程,46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1)...

    内核版本         :  Linux 3.10.14 rc红外接收类型:  GPIO 类型的NEC红外编码 本章内容 1)rc体系结构分析 2) 分析红外platform_driver平台驱动框 ...

  5. html5红外遥控,做了个小的红外遥控装置

    目的:早晨定时打开显示屏(电视),树莓派虽然省电,可以常开,但显示屏是耗电的. 材料:红外接收头(原来玩51开发板上带的,好久不用不知坏没坏).红外发射管(曾买过一个红外避障器上有个红外发射管).树莓 ...

  6. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车红外遥控实验

    在下载到开发板之前要选择好板和端口,具体参见: ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 -- Arduino相关设置 注意 红外遥控程序注意将IRremote 复制到ARDuino安装 ...

  7. 华为P30/P30 Pro细节再曝光:3.5mm耳机插孔和红外遥控各占其一

    [TechWeb]华为将于3月26号在法国巴黎举行新品发布会,正式推出新一代旗舰P30系列机型.随着发布会时间的临近,近段时间以来关于P30系列新机的曝光消息也越来越多. 现在有最新消息,有外媒再次带 ...

  8. NEC红外协议编码,38K红外遥控编码,红外遥控发射接收电路选型设计

    NEC为红外遥控最常用的编码,红外载波频率为38KHz,其协议小巧简单,非常适合家电设备的控制.其他的还有 Phillips(RCA)的RC-5和RC-6,但那只是IR协议的少数. 本篇博文参照国外博 ...

  9. AutoLeaders控制组——51单片机学习笔记(AD/DA、红外遥控)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  10. 红外遥控及Android手机红外遥控器开发

    一.红外遥控 红外遥控技术是通过红外技术.红外通信技术和遥控技术的结合实现的一种无线控制技术.由于红外线的波长较短,对障碍物的衍射能力较差,无法穿透墙壁,所以红外遥控术更适合应用在短距离直线控制的场合 ...

最新文章

  1. 2020年中国知识图谱行业分析报告(附全文下载)
  2. HP-UX磁带备份错误收集
  3. 亚信科技笔试面试2019届
  4. 【计算机网络复习 物理层】2.3 物理层设备
  5. Java 算法 身份证排序
  6. 前端埋点的缺点_【埋点学习埋点质量】埋点的框架设计及其准确性
  7. CloudStack 4.4+KVM之通过ISO文件创建CentOS虚拟机
  8. 使用Box2D制作AS3游戏——2.1a版本——Hello World Box2D .
  9. PPT绘图保存为PDF的三种方式
  10. android中当内容超出一页,滚动条滚动到某一个位置的另一个思路
  11. 网站前端js-parseInt.html
  12. 计算机系统师 评标专家,昆明筑龙·昆明市计算机辅助评标系统.pptx
  13. Shell nohup 命令详解
  14. ODB++ 数据格式解析软件
  15. PRD:倒推迅游手游加速器APP-需求文档
  16. w7系统计算机更改用户名,Win7怎么更改用户名
  17. 1.1 异步复位的串联T触发器 ---- always中慎用 非阻塞
  18. volatility命令
  19. MyBatis一对多关系映射
  20. Python 樱花树

热门文章

  1. 定性与定量的单变量正态性检验
  2. 吉林省专升本历年真题高频词汇
  3. 关于vmware无法访问互联网
  4. HCIP认证学习day2
  5. MATLAB数值分析学习笔记:黄金分割法
  6. Typora+picgo+gitee图片外链失效,Typora历史笔记无法显示图片
  7. python正则表达式【标准库—re】
  8. 中国志愿者服务器注册,如何注册成为志愿者?中国志愿服务网注册流程
  9. 10分钟教你阿里云环境下搭建iredmail邮件服务器
  10. 全面解析用友网络四位一体数字营销