/************************************************************************* * * * 51單片機(jī)綜合學(xué)習(xí)系統(tǒng)演示程序 - 紅外遙控器鍵值顯示 * * * * 功能:紅外編碼值通過2位數(shù)碼管顯示 * * 版本: V1.0 (2009/05/25) * * 網(wǎng)站: www.hificat.com www.kincony.com * * * 來源: 杭州晶控電子有限公司 HANGZHOU KinCony ELECTRONICS CO.,LTD * *【版權(quán)】Copyright(C) 杭州晶控電子 www.hificat.com All Rights Reserved * *【聲明】此程序僅用于學(xué)習(xí)與參考,引用請注明版權(quán)和作者信息! * * * *************************************************************************/ #include #include sbit IRIN = P3 ^ 2; //紅外接收器數(shù)據(jù)線 sbit BEEP = P3 ^ 7; //蜂鳴器驅(qū)動線 sbit RELAY = P1 ^ 3; //繼電器驅(qū)動線 unsigned char IRCOM[] = { 0x00, 0x00, 0x00, 0x00, 0x10, 0x10 }; unsigned char code table[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, //0,1,2,3,4,5,6,7 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xbf //8,9,A,B,C,D,E,F,- }; char code reserve[3]_at_ 0x3b; //保留0x3b開始的3個字節(jié) /********************************************************** ms延時子函數(shù) **********************************************************/ void delayms(unsigned int ms) { unsigned char k; while (ms--) { for (k = 0; k < 114; k++) ; } } /********************************************************** us延時子函數(shù) **********************************************************/ void delay(unsigned char x) //x*0.14MS { unsigned char i; while (x--) { for (i = 0; i < 14; i++) ; } } /********************************************************** 蜂鳴器驅(qū)動子函數(shù) **********************************************************/ void beep() { unsigned char i; for (i = 0; i < 100; i++) { BEEP = !BEEP; //BEEP取反 delay(6); } BEEP = 1; //關(guān)閉蜂鳴器 } /********************************************************** 顯示函數(shù) **********************************************************/ void play() { P0 = (table[IRCOM[4]]); //個位 P2 = 0xfe; delayms(1); P0 = (table[IRCOM[5]]); //十位 P2 = 0xfd; delayms(1); P2 = 0xff; //關(guān)閉顯示 delayms(1); } /********************************************************** 主函數(shù) **********************************************************/ void main(void) { P0 = 0xff; //I/O口初始化 P2 = 0xff; IRIN = 1; BEEP = 1; RELAY = 1; IE = 0x81; //允許總中斷中斷,使能 INT0 外部中斷 TCON = 0x01; //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā) play(); while (1) { if (IRCOM[2] == 0x1d) //UP鍵 RELAY = 0; //繼電器吸合 if (IRCOM[2] == 0x12) //DOWN鍵 RELAY = 1; //繼電器關(guān)閉 play(); //顯示 } } /********************************************************** INT0 中斷服務(wù)子函數(shù) **********************************************************/ void IR_IN()interrupt 0 { unsigned char j, k, Num = 0; EX0 = 0; //關(guān)閉INT0中斷 delay(15); //延時 if (IRIN == 1) //再確認(rèn)IR信號是否出現(xiàn) { EX0 = 1; //開INT0中斷 return ; //退出 } while (!IRIN) //等IR變?yōu)楦唠娖剑^9ms的前導(dǎo)低電平信號。 { delay(1); } while (IRIN) //等IR變?yōu)榈碗娖剑^4.5ms的前導(dǎo)高電平信號。 { delay(1); } for (j = 0; j < 4; j++) //收集四組數(shù)據(jù) { for (k = 0; k < 8; k++) //每組數(shù)據(jù)有8位 { while (IRIN) //等 IR 變?yōu)榈碗娖?br /> { delay(1); } while (!IRIN) //等 IR 變?yōu)楦唠娖?br /> { delay(1); } while (IRIN) //計(jì)算IR高電平時長 { delay(1); Num++; if (Num >= 15) { EX0 = 1; //0.14ms計(jì)數(shù)過長自動離開。 return ; } } //高電平計(jì)數(shù)完畢 IRCOM[j] = IRCOM[j] >> 1; //數(shù)據(jù)最高位補(bǔ)“0” if (Num >= 8) IRCOM[j] = IRCOM[j] | 0x80; //數(shù)據(jù)最高位補(bǔ)“1” Num = 0; } //end for k } //end for j if (IRCOM[0] != 0x00) //比較用戶碼 { EX0 = 1; //開INT0中斷 return ; //退出 } if (IRCOM[2] != ~IRCOM[3]) //接收數(shù)據(jù)是否正確 { EX0 = 1; //開INT0中斷 return ; //退出 } IRCOM[4] = IRCOM[2] &0x0F; //取鍵碼的低四位 IRCOM[5] = IRCOM[2] >> 4; //右移4次,高四位變?yōu)榈退奈?br /> play(); //顯示鍵碼 beep(); //蜂鳴器響一聲 EX0 = 1; //重新開INT0中斷 } /********************************************************** ;================================ ;6121碼 遙控器(晶控電子) ;****** 紅外遙控器鍵值表 ****** 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B ;================================ IRCOM[0] --- 存放用戶碼 00H IRCOM[1] --- 存放用戶反碼 ffH IRCOM[2] --- 存放數(shù)據(jù)碼 IRCOM[3] --- 存放數(shù)據(jù)反碼 *********************************************************/ |