资源简介
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频率预置 +显示
相关资源
- STC8951系列单片机中方指南
- proteus仿真 AT89C51输出各种波形
- 基于AT89C51的数据采集系统设计新方法
- C51单片机汇编指令查询、学习工具集
- 基于89c51的数字钟
- 基于单片机交通灯设计
- 基于89C51计算机锁定加密键盘设计
- 基于51单片机的计算器(C51编写,有
- STM32+TMC5160代码电路图.rar
- AT89C51+ADC0808 PROTEUS仿真
- 单片机原理及接口技术C51编程张毅刚
- 基于AT89C51的十字路口交通灯设计pro
- 单片机原理及接口技术C51编程
- at89c51单片机外文翻译
- 单片机原理及接口技术C51编程高清P
- 基于C51的电子琴设计
- keilc51源代码
- 在C51中变量的空间分配几个方法
- 初学C51的一些误区
- 单片机初学者学习C51时的一些误区和
- Philips 80C51MX
- 12bit流水线ADC电路整体电路原理图-c
- 0.96OLED_C51系列_IIC应答_例程
- 0-999计数器的C51程序
- [单片机原理与应用设计C51编程+Prote
- ESP8266AP模式控制51单片机亮灯.docx
- C51代码生成器(代码快速生成工具)
- 基于AT89C51单片机信号发生器设计.pd
- 89C51单片机最小系统PCB
- 基于AT89C51单片机的多功能函数信号发
评论
共有 条评论