由于我剛開始學紅外的時候,什么都不懂,在網上到處找資料,可是在這些找到的資料中,很多都是沒有用的,找到的程序,大多都是拷貝的某某公司提供的示例源程序,大多都是千篇一律,看過很多的百度提問,可是基本上都沒有從根本上解決問題,也上過豆丁之類的,看看東西還要積分,我郁悶了,當時我就立志等我學會紅外紅一定做個紅外的專題,免費的分享給大家,以方便苦苦探索的莘莘學子。 苦惱了好一陣后,幸好認識一位嵌入的大哥,給我了幫助,給我資料,功夫不負有心人,今天我終于學了紅外的一些知識,為了謝謝幫助過我的大哥,我只能將他交給我的分享給大家,以此回報他,因此在這里將我所學到的免費的分享給大家,供大家交流學習。 至于程序,它是靈活多變,大家不要習慣性的CTRl+A,CTRL+C,要讀懂它的意思,根據程序的思想,然后自己發揮,從而真正掌握它的原理。 大家如有疑問的可以和我交流,我的QQ:925171906,在此祝福所有在學習道路上孜孜不倦的可敬可佩的學子們,學業大成!對于經濟窘迫的我來說,習慣了拿不收費的資料,并對變相收費有一種深惡痛絕的感覺;讓更多的人來(更容易)了解紅外,貢獻自己的一點力 量。也希望大家有好資料的多分享一下,不要那么小氣,還要什么積分什么的。 1硬件連接:P0口為數碼管的段選段,P2口的高四位為數碼管的位選端,紅外接連在P3.2端,即連接在外部中斷0處
2.主要功能:用數碼管顯示接收到的紅外按鍵的鍵碼 3.程序如下: //硬件連接 #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit hongwai = P3^2;//此表為 數碼管的字模, 共陰數碼管 0-9 - uchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; uchar recieve[3];//儲存用戶碼、用戶反碼與鍵數據碼、鍵數據反碼 uchar a[]={0,0,0,0}; void delay(uint i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); } void IRdelay(uchar x) //x*0.14MS { uchar i; while(x--) { for (i = 0; i<13; i++); } } void display(uchar keyno) { uchar i,j; a[0]=keyno%10000/1000; a[1]=keyno%1000/100; a[2]=keyno%100/10; //十位 a[3]=keyno%10; //個位 j=0xfe; //對數碼管進行逐位掃描顯示 for(i=0; i<=3; i++) { j=_cror_(j,1); P2=j; P0 = table[a]; delay(50); } P0 = 0; } void IR_IN(void) interrupt 0 //外部中斷0,即紅外接收P3.2 { uchar j,k,count=0; EX0 = 0; //關閉外部中斷0,即停止接收紅外 IRdelay(5); if (hongwai==1) { EX0 =1; return; } //確認IR信號出現 while (!hongwai) //等IR變為高電平,跳過9ms的前導低電平信號。 { IRdelay(1); } for (j=0;j<4;j++) //收集四組數據 { for (k=0;k<8;k++) //每組數據有8位 { while (hongwai) //等 IR 變為低電平,跳過4.5ms的前導高電平 信號。 { IRdelay(1); } while (!hongwai) //等 IR 變為高電平 { IRdelay(1); } while (hongwai) //計算IR高電平時長 { IRdelay(1); count++; if (count>=30) { EX0=1; return; } //0.14ms計數過長自動離開。 } //高電平計數完畢 recieve [j]= recieve [j] >> 1; //數據最高位補"0" if (count>=8) { recieve [j] = recieve [j] | 0x80; } //數據最高位補"1" count=0; }//end for k }//end for j if (recieve [2]!=~ recieve [3])//校驗鍵值碼與鍵值反碼的值, { EX0=1; //如果鍵值碼與鍵值反碼取反后相等,則開外部中斷中斷0,開始接收下一個紅外信號 return; } EX0 = 1; } void main() { EA=1;//開放全局中斷 EX0=1;//開外部中斷0 IT0=1;//觸發方式為脈沖負邊沿觸發 hongwai=1; while(1) { //顯示紅外鍵碼 display(recieve [2]); } } 2 主要功能:當遙控器上的數字鍵被按下時,讓八個數碼管同時顯示按下的數字 硬件連接:P0口為數碼管的段選段,P2口為數碼管的位選端,默認位選端全部開放0x00,P3.2接紅外接收頭 程序如下: #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit hongwai = P3^2; uchar code table[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77, 0x7C,0x39,0x5E,0x79,0x71}; uchar recieve[3];//儲存用戶碼、用戶反碼與鍵數據碼、鍵數據反碼 uchar a[]={0,0,0,0}; void IRdelay(uchar x) //x*0.14MS { uchar i; while(x--) { for (i = 0; i<13; i++); } } void main() { EA=1;//開放全局中斷 EX0=1;//開外部中斷0 IT0=1;//觸發方式為脈沖負邊沿觸發 hongwai=1; while(1) { P2=0x00; switch(recieve[2]) { case 22:P0=table[0];break;//不同的遙控器可能鍵值不一樣,可以根據程序1測出鍵值,在修改case后面的值即可 case 12:P0=table[1];break; case 24:P0=table[2];break; case 94:P0=table[3];break; case 8:P0=table[4];break; case 28:P0=table[5];break; case 90:P0=table[6];break; case 66:P0=table[7];break; case 82:P0=table[8];break; case 74:P0=table[9];break; case 68:P2=0xff;P0=0x00;break; } } } void IR_IN(void) interrupt 0 //外部中斷0,即紅外接收P3.2 { uchar j,k,count=0; EX0 = 0; //關閉外部中斷0,即停止接收紅外 IRdelay(5); if (hongwai==1) { EX0 =1; return; } //確認紅外信號出現 while (!hongwai) //等紅外變為高電平,跳過9ms的前導低電平信號。 { IRdelay(1); } for (j=0;j<4;j++) //收集四組數據 { for (k=0;k<8;k++) //每組數據有8位 { while (hongwai) //等 IR 變為低電平,跳過4.5ms的前導高電平信號。 { IRdelay(1); } while (!hongwai) //等 IR 變為高電平 { IRdelay(1); } while (hongwai) //計算IR高電平時長 { IRdelay(1); count++; if (count>=30) { EX0=1;//高電平時間過長則開外部中斷,并返回 return; } //0.14ms計數過長自動離開。 } //高電平計數完畢 recieve[j]=recieve[j] >> 1; //各數據位右移一位,因為先讀出的是高位數據 if (count>=8) //如果是高電平則將高位變為1,反之則為0,不做修改 { recieve[j] = recieve[j] | 0x80; } count=0; } } if (recieve[2]!=~recieve[3])//校驗鍵值碼與鍵值反碼的值, { EX0=1; //如果鍵值碼與鍵值反碼取反后相等,則開外部中斷中斷0,開始接收下一個紅外信號 return; } EX0 = 1; } 3.紅外控制蜂鳴器,硬件連接很簡單,P3.2接紅外接收頭,蜂鳴器接在P1.5端 #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit hongwai = P3^2; sbit beep=P1^5; uchar recieve[3];//儲存用戶碼、用戶反碼與鍵數據碼、鍵數據反碼 uchar a[]={0,0,0,0}; void delay(uchar x) //x*0.14MS { uchar i; while(x--) { for (i = 0; i<13; i++); } } void main() { EA=1;//開放全局中斷 EX0=1;//開外部中斷0 IT0=1;//觸發方式為脈沖負邊沿觸發 hongwai=1; beep=1; while(1) { if(recieve[2]==69) { beep=~beep;recieve[2]=98; } } } void hongwaizhongduan(void) interrupt 0 //外部中斷0,即紅外接收P3.2 { uchar j,k,count=0; EX0 = 0; //關閉外部中斷0,即停止接收紅外 delay(5); if (hongwai==1) { EX0 =1; return; } //確認紅外信號出現 while (!hongwai) //等紅外變為高電平,跳過9ms的前導低電平信號。 { delay(1); } for (j=0;j<4;j++) //收集四組數據 { for (k=0;k<8;k++) //每組數據有8位 { while (hongwai) //等 紅外 變為低電平,跳過4.5ms的前導高電平信號。 { delay(1); } while (!hongwai) //等 紅外 變為高電平 { delay(1); } while (hongwai) //計算紅外高電平時長 { delay(1); count++; if (count>=30) { EX0=1;//高電平時間過長則開外部中斷,并返回 return; } //0.14ms計數過長自動離開。 } //高電平計數完畢 recieve[j]=recieve[j] >> 1; //各數據位右移一位,因為先讀出的是高位數據 if (count>=8) //如果是高電平則將高位變為1,反之則為0,不做修改 { recieve[j] = recieve[j] | 0x80;
…………限于本文篇幅 余下代碼請從51黑下載附件…………
所有資料下載:
紅外線.rar
(2.53 MB, 下載次數: 108)
2017-5-9 18:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|