红外遥控切歌(好运来/天空之城)、红外模块的应用
目录
一、主函数
二、红外模块(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
红外遥控切歌(好运来/天空之城)、红外模块的应用相关推荐
- 基于红外遥控的门禁系统(红外遥控、步进电机)
基于红外遥控的门禁系统(红外遥控.步进电机) 闲来无事,用手头STM32做个项目. 成品功能: 功能说明 材料 STM32ZET6开发板 TFT显示屏(战舰有我用的2.7寸的) 红外接收器和遥控器 五 ...
- 嵌入式Linux红外遥控,一个简单的IAL分析(红外遥控)(转)
简单的IAL分析 一.程序说明 1.下面程序是基于一个红外的设备文件,从该设备中能接收到红外遥控的硬件编码. 2.两个文件需要覆盖掉libmingiui*/src/ial/中的两个文件编译时加上 -- ...
- 红外遥控c语言,HiFiBox DAC + RuneAudio 红外遥控方案(C语言实现)
之前在<HiFiBox DAC 自定义红外遥控配置教程>中介绍了树莓派上红外遥控的编码学习和使用,并且实现了遥控控制音乐播放的功能. 以上方案是基于 lirc 提供的软件实现.有树莓派玩家 ...
- linux红外遥控进程,46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1)...
内核版本 : Linux 3.10.14 rc红外接收类型: GPIO 类型的NEC红外编码 本章内容 1)rc体系结构分析 2) 分析红外platform_driver平台驱动框 ...
- html5红外遥控,做了个小的红外遥控装置
目的:早晨定时打开显示屏(电视),树莓派虽然省电,可以常开,但显示屏是耗电的. 材料:红外接收头(原来玩51开发板上带的,好久不用不知坏没坏).红外发射管(曾买过一个红外避障器上有个红外发射管).树莓 ...
- ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车红外遥控实验
在下载到开发板之前要选择好板和端口,具体参见: ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 -- Arduino相关设置 注意 红外遥控程序注意将IRremote 复制到ARDuino安装 ...
- 华为P30/P30 Pro细节再曝光:3.5mm耳机插孔和红外遥控各占其一
[TechWeb]华为将于3月26号在法国巴黎举行新品发布会,正式推出新一代旗舰P30系列机型.随着发布会时间的临近,近段时间以来关于P30系列新机的曝光消息也越来越多. 现在有最新消息,有外媒再次带 ...
- NEC红外协议编码,38K红外遥控编码,红外遥控发射接收电路选型设计
NEC为红外遥控最常用的编码,红外载波频率为38KHz,其协议小巧简单,非常适合家电设备的控制.其他的还有 Phillips(RCA)的RC-5和RC-6,但那只是IR协议的少数. 本篇博文参照国外博 ...
- AutoLeaders控制组——51单片机学习笔记(AD/DA、红外遥控)
本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...
- 红外遥控及Android手机红外遥控器开发
一.红外遥控 红外遥控技术是通过红外技术.红外通信技术和遥控技术的结合实现的一种无线控制技术.由于红外线的波长较短,对障碍物的衍射能力较差,无法穿透墙壁,所以红外遥控术更适合应用在短距离直线控制的场合 ...
最新文章
- 2020年中国知识图谱行业分析报告(附全文下载)
- HP-UX磁带备份错误收集
- 亚信科技笔试面试2019届
- 【计算机网络复习 物理层】2.3 物理层设备
- Java 算法 身份证排序
- 前端埋点的缺点_【埋点学习埋点质量】埋点的框架设计及其准确性
- CloudStack 4.4+KVM之通过ISO文件创建CentOS虚拟机
- 使用Box2D制作AS3游戏——2.1a版本——Hello World Box2D .
- PPT绘图保存为PDF的三种方式
- android中当内容超出一页,滚动条滚动到某一个位置的另一个思路
- 网站前端js-parseInt.html
- 计算机系统师 评标专家,昆明筑龙·昆明市计算机辅助评标系统.pptx
- Shell nohup 命令详解
- ODB++ 数据格式解析软件
- PRD:倒推迅游手游加速器APP-需求文档
- w7系统计算机更改用户名,Win7怎么更改用户名
- 1.1 异步复位的串联T触发器 ---- always中慎用 非阻塞
- volatility命令
- MyBatis一对多关系映射
- Python 樱花树