|
楼主 |
发表于 2015-10-20 10:33:06
|
显示全部楼层
红外头文件- #ifndef _HW_H_
- #define _HW_H_
- #include "bell.h"
- #include "delay.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar key0,key1,key2,key3,key4,key5,key6,key7,key8,key9;
- uchar key_add,key_minish,key_manue,key_ok,key_up,key_down,key_alarm,key_voioff,key_voion;
- bit ala_flag=0; //闹钟使能标志位
- sbit IRIN = P3^2; //红外接收器数据线
- sbit K5 = P2^4; //按键K5-闹钟的打开与关闭
- uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
- /***************************************************************
- 外部中断0响应函数,完成对红外遥控的解码
- -------------------------协议--------------------------
- ----开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
- ----接着是26位前导脉冲,用于识别该型号的摇控。
- ----然后是发送8位数据的原码,接着又发送8位数据的反码.
- ----最后是一个长脉冲,和开始位一样,拉低9ms和一个4.5ms脉冲表示结束。
- ----每个按键不同这处只在于那8位数据的原码和反码,因些只须要识别
- ----8位原码就可以识别按键了
- ****************************************************************/
- void IR_IN() interrupt 0 //using 0
- {
- uchar j,k,N=0;
- EX0 = 0;
- delayA(15);
- if (IRIN==1)
- { EX0 =1;
- return;
- }
- //确认IR信号出现
- while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
- {delayA(1);}
- for (j=0;j<4;j++) //收集四组数据
- {
- for (k=0;k<8;k++) //每组数据有8位
- {
- while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
- {delayA(1);}//
- while (!IRIN) //等 IR 变为高电平
- {delayA(1);} //
- while (IRIN) //计算IR高电平时长
- {
- delayA(1);
- N++;
- if (N>=30)
- { EX0=1;
- return;} //0.14ms计数过长自动离开。
- } //高电平计数完毕
- IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“
- if (N>=8)
- {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
- N=0;
- }//end for k
- }//end for j
-
- if (IRCOM[2]!=~IRCOM[3]) //接收时间是否正确
- {
- EX0=1;
- return;
- }
- // EX0=1;
- /*================红外编码处理====================*/
- switch(IRCOM[2])
- {
- /* case 0x00: key0=1; break; //1
- case 0x01: key1=1; break; //2
- case 0x02: key2=1; break; //3
- case 0x03: key3=1; break; //4
- case 0x04: key4=1; break; //5
- case 0x05: key5=1; break; //6
- case 0x06: key6=1; break; //7
- case 0x07: key7=1; break; //8
- case 0x08: key8=1; break; //9
- case 0x09: key9=1; break; //0
- */
- /* case 0x13: key_minish=1; break; //-
- case 0x12: key_add=1; break; //+
- case 0x18: key_manue=1; break; //菜单
- case 0x19: key_ok=1; break; //OK
- case 0x15: key_alarm=1; break; //关闹钟的开与关*/
- case 0x07: key_minish=1; break; //-
- case 0x05: key_add=1; break; //+
- case 0x06: key_manue=1; break; //菜单
- case 0x02: key_ok=1; break; //OK
- case 0x0a: key_alarm=1; break; //关闹钟的开与关
- /*
- case 0x18: key_up=1; break; //上
- case 0x19: key_down=1; break; //下
-
- case 0x15: key_voioff=1; break; //静音
- case 0x17: key_voion=1; break; //声音
- */
- default: break; //别的键按下
- }
- if(K5==0||key_alarm==1)//闹钟的开与关的设置标志位
- {
- DelayM(20);
- if(K5==0||key_alarm==1)
- { beep();
- while(!K5);//松手检测
- key_alarm=0;
- ala_flag=~ala_flag;
- }
- while(!K5);//松手检测
- key_alarm=0;
- }
- EX0 = 1; //开中断
- }
- #endif
复制代码 |
|