上次从本坛安鑫老板那买了几个遥控器,质量还不错,昨天没事干,研究了一下,做个接收的程序,暂时能解码了undefined,也不知道对不对,发上来跟大伙共享一下,希望高手再改进改进
- #ifndef _IR_H_
- #define _IR_H_
- unsigned char IRkeylong;//遥控按键长按标识
- unsigned char IRtime;//红外时间
- unsigned char IRrec;//红外接收
- unsigned char IRdata[17];//接收到的红外数据(二进制)
- unsigned char IRdatabit;//红外数据的位
- unsigned char IRrecok;//红外接收完毕标识
- unsigned char IRkeycode[2];//红外按键键值(16进制)
- unsigned char IRchangeok;//红外码转换完毕标识(二进制转十六进制)
- void init_timer0()//初使化定时器0
- {
- EA=1;//开总中断
- TMOD=0x02;//定时器工作模式为2(8位初值自动重装的8位定时器)
- TH0=0x00;//赋初值
- TL0=0x00;//赋初值
- ET0=1;//开定时器0中断
- TR0=1;//打开定时器
- }
- void init_int0()//外部中断0初使化
- {
- EA=1;//开总中断
- EX0=1;//开外部中断0中断
- IT0=1;//负跳沿触发方式
- }
- void IRchange()//红外转换函数(二进制转十六进制)
- {
- unsigned char x,y,IRdatabit;
- unsigned char value;//值,用于暂存红外键值用
- IRdatabit=1;//红外数据第0位为引导码(检测用)从第1位开始才是有用的红外码
- if(IRrecok)//开始进行红外转换
- {
- for(x=0;x<2;x++)//得到2个8位键值码(16进制码)
- {
- for(y=0;y<8;y++)//转换二进制的0 和1
- {
- value=value>>1;//右移一次,使最高位为0;
- if(IRdata[IRdatabit]>5)//当红外数据数组中的'位'大于1ms时
- {
- value=value|0x80;//得到最高位
- }
- IRdatabit++;//数组中的'位'自加1
- }
- IRkeycode[x]=value;//将得到值保存到红外键值的数组中
- }
- IRchangeok=1;//相反转换标识为1
- IRrecok=0;//接收标识置0,等待下一次接收
- }
- }
- void timer0() interrupt 1//定时器中断函数
- {
- IRtime++;//红外时间自加1;
- }
- void int0() interrupt 0//外部中断函数
- {
- if(IRrec)//开始接收
- {
- if(IRtime>10) //检测引导码
- {
- IRdatabit=0;
- IRkeylong=1;//用于检测按键是否长按下
- }
- IRdata[IRdatabit]=IRtime;//将得到的红外时间保存到红外数据数组中
- IRtime=0;//红外时间清0
- IRdatabit++;//'位'自加1
- if(IRdatabit==17)//接收完成
- {
- IRdatabit=0;//将线外数据中的位清0
- IRrecok=1;//红外码接收完成标识
- IRrec=0;//将红外接收置0,准备下次接收
- }
- }
- else//起始状态
- {
- IRrec=1;
- IRtime=0;
- }
- }
- #endif
复制代码- #include
- #include
- #include
- #define uint unsigned int//宏定义
- #define uchar unsigned char//宏定义
- sbit SPEAK=P3^7;
- uchar code num[]={"0123456789abcdef"};
- void delay_ms(uint z)//延时毫秒
- {
- uint x;uchar y;
- for(x=z;x>0;x--)
- for(y=114;y>0;y--);
- }
- /*****延时微秒*****/
- void delay_us(uint x)
- {
- while(x--);
- }
- /*****蜂鸣提示*****/
- void beep(uchar YD,YC) //YD为音调,YC为音长
- {
- uchar x;
- for(x=0;x<yc;x++)
- {
- SPEAK=~SPEAK;
- delay_us(YD);//音调
- }
- SPEAK=1;
- }
- /*****主程序*****/
- void main()
- {
- uchar clr=1;//清屏用
- init_timer0();//初使化定时器0
- init_int0();//初使化外部中断0
- init12();//初使化12864液晶
- w12_com(0x01);
- dis_str(0x80,"IR解码 By: ain365 ",20);
- dis_str(0x90,"- ^ ^ - 按任意键开始",20);
- while(1)
- {
- IRchange();
- if(IRchangeok)
- {
- while(clr)//清屏一次
- {
- w12_com(0x01);
- clr=0;
- }
- beep(50,100);//声音提示
- dis_str(0x80," 前 8位码 -- -- ",20);
- dis_str(0x90," 后 8位码 -- -- ",20);
- w12_word(0x87,num[IRkeycode[0]/16],num[IRkeycode[0]%16]);
- w12_word(0x97,num[IRkeycode[1]/16],num[IRkeycode[1]%16]);
-
- IRchangeok=0;
- IRkeylong=0;
- }
- delay_ms(500);
- IRchange();
- if(IRkeylong)
- {
- beep(50,100);
- IRkeylong=0;
- }
- }
- }
复制代码
12864中断方式.rar
(44.39 KB, 下载次数: 41)
|