资源简介
51单片机红外遥控程序,21按键遥控器,按键长按短按识别,
代码片段和文件信息
#include
#define uchar unsigned char
#define uint unsigned int
bit IRpro_okIRok;
uchar IRcord[4];
uchar IRdata[33];
sbit IRIN = P3^2;
uchar IRtime;
bit flag_mode;
uchar count_long_time;
/*红外遥控初始化函数*/
void Irin_initial()
{
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=1; //边沿触发
IRIN=1; //I/O口初始化
}
void int0() interrupt 0 //定义外部中断0
{
static uchar i; // 声明静态变量(在跳出函数后在回来执行的时候不会丢失数值)i用于把33次高电平的持续时间存入IRdata
static bit startflag; //开始储存脉宽标志位
if(startflag) //开始接收脉宽检测
{
if( (IRtime < 53) && (IRtime >= 47) ) /*判断是否是引导码,底电平9000us+高4500us
这个自己可以算我以11.0592来算了NEC协议的引导码低8000-10000+高4000-5000
如果已经接收了引导码那么i不会被置0就会开始依次存入脉宽*/
{
i = 0;
}
if(IRpro_ok==1)
{
if( (IRtime < 46) && (IRtime >= 41) )
{
count_long_time++;
IRpro_ok=0;
}
}
//如果是引导码那么执行i=0把他存到IRdata的第一个位
IRdata[i] = IRtime; //以T0的溢出次数来计算脉宽,把这个时间存到数组里面到后面判断
IRtime = 0; //计数清零,下一个下降沿的时候在存入脉宽
i++; //计数脉宽存入的次数
if(i == 33) //如果存入34次 数组的下标是从0开始i等于33表示执行了34次
{
IRok = 1; //那么表示脉宽检测完毕
i = 0; //把脉宽计数清零准备下次存入
}
}
else
{
IRtime = 0; //引导码开始进入把脉宽计数清零开始计数
startflag = 1; //开始处理标志位置1
}
}
void IRcordpro() //提取它的33次脉宽进行数据解码
{
uchar i j k cord value; /*i用于处理4个字节,j用于处理一个字节中每一位,k用于33次脉宽中的哪一位
cord用于取出脉宽的时间判断是否符合1的脉宽时间*/
k = 1; //从第一位脉宽开始取,丢弃引导码脉宽
for(i = 0; i < 4; i++)
{
for(j = 0; j < 8; j++)
{
cord = IRdata[k]; //把脉宽存入cord
if(cord > 5) //如果脉宽大于我11.0592的t0溢出率为约278us*5=1390那么判断为1
value = value | 0x80; /*接收的时候是先接收最低位,
把最低位先放到value的最高位在和0x08按位或一下
这样不会改变valua的其他位的数值只会让他最高位为1*/
if(j < 7)
{
value = value >> 1; //value位左移依次接收8位数据。
}
k++; //每执行一次脉宽位加1
}
IRcord[i] = value; //每处理完一个字节把它放入IRcord数组中。
value = 0; //清零value方便下次在存入数据
}
IRpro_ok = 1; //接收完4个字节后IRpro ok置1表示红外解码完成
if (IRcord[2]!=~IRcord[3])
{ EX0=1;
return; }
switch(IRcord[2])
{
case 0x16: RUN=0;break; //数字0-9
case 0x0C: RUN=1;break;
case 0x18: RUN=0;break;
case 0x5E: RUN=1;break;
case 0x08: RUN=0;break;
case 0x1C: RUN=1;break;
case 0x5A: RUN=0;break;
case 0x42: RUN=1;break;
case 0x52: RUN=0;break;
case 0x4A: RUN=1;break;
// case 0x07: flag_move=1; break; //左移
// case 0x09: flag_move=2; break; //右移
case 0x44: flag_mode=1;break; //mode 键
// // case 0x40: flag_dir=2;break; //右移
// // case 0x43: flag_play = 1;break;//play键
// case 0x46: flag_test =1;
// case 0x0D: flag_ok = 1;break;//EQ
// // case 0x00: flag_move = 0;flag_test=0;flag_mode=0;flag_ok=0;break;
}
for(i = 0; i< 31; i++) //清楚缓冲区数据
{
IRdata[i] = 0;
}
// IRcord[2]=0x00; //清楚缓冲区数据
}
void Timer0_Init(void) //278us@22.1184MHz
{
AUXR |= 0x80; //定时器适庇1T
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-12-02 09:09 红外遥控\
文件 85137 2017-11-27 08:25 红外遥控\123456.uvgui.Administrator
文件 4862 2017-11-27 08:25 红外遥控\123456.uvopt
文件 13898 2017-11-27 08:25 红外遥控\123456.uvproj
目录 0 2017-12-02 09:09 红外遥控\Listings\
文件 11238 2017-11-27 20:40 红外遥控\Listings\123456.m51
文件 14543 2017-11-27 20:40 红外遥控\Listings\STARTUP.lst
文件 7905 2017-11-27 20:40 红外遥控\Listings\main.lst
目录 0 2017-12-02 09:09 红外遥控\ob
文件 8854 2017-11-27 20:40 红外遥控\ob
文件 1030 2017-11-27 20:40 红外遥控\ob
文件 1101 2017-11-27 20:40 红外遥控\ob
文件 119 2017-11-27 20:40 红外遥控\ob
文件 819 2017-11-27 20:40 红外遥控\ob
文件 9170 2017-11-27 20:40 红外遥控\ob
文件 6376 2016-04-01 17:01 红外遥控\STARTUP.A51
文件 4037 2017-11-27 20:40 红外遥控\main.c
文件 322 2017-12-02 09:08 红外遥控\readme.txt
- 上一篇:sht20驱动程序51
- 下一篇:AD9859频率预置 +显示
相关资源
- sht20驱动程序51
- c51单片机数码管显示60s倒计时
- AT89C51单片机--CC1101无线接收程序经本
- XFS5152语音合成配套程序 C51 串口通信
- 基于AT89C51单片机的智能脉搏测试仪设
- Altium Designer 89c51原理图
- 基于51单片机电炉丝加热控制仿真ke
- C51完美OLED显示.zip
- 基于RFID技术的门禁系统-下位机C51(
- HC-SR04 超声波测距C51程序,精度2MM
- 单片机原理与应用及C51程序设计__杨加
- 51单片机篮球记分器的设计
- 三线制实时时钟的读写
- 基于单片机at89c51的电子琴proteus仿真
- 光立方Keil C51音乐频谱FFT处理源代码
- ILI9486TFT驱动程序C51
- 51+PCF8574+1602
- AT89C51控制超声波
- 单片机秒表课设
- 毕设程序89C51计算器程序+proteus仿真
- AT89c51元件库
- 基于89C51单片机开发的数字音乐盒 源
- C51智能反编译器将HEX 文件反编译成
- AT89C51数字时钟
- AT89C51单片机温度控制系统
- 基于单片机的照度计
- 水温水位控制器程序C51带仿真
- 基于89C51单片机的智能超声波流量检测
- 二进制、十进制、十六进制、C51十六
- 89C51 单片机IO 口模拟串行通信的实现
评论
共有 条评论