上次從本壇安鑫老板那買了幾個遙控器,質量還不錯,昨天沒事干,研究了一下,做個接收的程序,暫時能解碼了undefined,也不知道對不對,發上來跟大伙共享一下,希望高手再改進改進
082132axtxjo7nn9czjdfn.jpg.thumb.jpg (89.75 KB, 下載次數: 131)
下載附件
2015-7-18 14:47 上傳
082122drzsysa6gjyau0xr.jpg.thumb.jpg (167.28 KB, 下載次數: 131)
下載附件
2015-7-18 14:47 上傳
082128j2ql8p6xs9hos27i.jpg.thumb.jpg (164.58 KB, 下載次數: 149)
下載附件
2015-7-18 14:47 上傳
- #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, 下載次數: 42)
2015-7-18 14:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|