我是一新手,從網(wǎng)上找到一程序,如下: - [br]1 /*------------------------------------------------------------*- [br]2 紅外收發(fā).C [br]3 ------------------------------------------------------------ [br]4 遙控器測(cè)試 [br]5 -*------------------------------------------------------------*/ [br]6 [br]7 #include <reg52.h> [br]8 [br]9 // --- 紅外接收一體化輸出口 ---------------------------------- [br]10 sbit IR_Out = P3^2; [br]11 bit START_Flag = 0; [br]12 bit BOOT_REPEATING_CODE_Flag = 0; [br]13 unsigned char DATA[4] = {0}; [br]14 bdata unsigned char TEMP_BIT; [br]15 [br]16 sbit B0 = TEMP_BIT^0; [br]17 sbit B1 = TEMP_BIT^1; [br]18 sbit B2 = TEMP_BIT^2; [br]19 sbit B3 = TEMP_BIT^3; [br]20 sbit B4 = TEMP_BIT^4; [br]21 sbit B5 = TEMP_BIT^5; [br]22 sbit B6 = TEMP_BIT^6; [br]23 sbit B7 = TEMP_BIT^7; [br]24 [br]25 // --- 有無(wú)遙控信號(hào)判斷函數(shù) ---------------------------------- [br]26 bit START_Judge(); [br]27 [br]28 // --- 連發(fā)碼判斷函數(shù) ---------------------------------------- [br]29 bit BOOT_REPEATING_CODE_Judge(); [br]30 [br]31 // --- "0"和"1"識(shí)別 ------------------------------------------ [br]32 bit H_L_LEVEL_Judge(); [br]33 [br]34 // --- 串口初始化 -------------------------------------------- [br]35 void UART_Initial(); [br]36 [br]37 void DELAY_Us(unsigned int Us) [br]38 { [br]39 unsigned int x; [br]40 for(x = 0; x <= (Us/200-1); x++); [br]41 } [br]42 void DELAY_Ms(unsigned int Ms) [br]43 { [br]44 unsigned int x,y; [br]45 for(x = 0; x <= (Ms-1); x++) [br]46 { [br]47 for(y = 0; y <= 120; y++); [br]48 } [br]49 } [br]50 [br]51 void main() [br]52 { [br]53 unsigned char i; [br]54 UART_Initial(); [br]55 IR_Out = 1; [br]56 [br]57 while(1) [br]58 { [br]59 START_Flag = START_Judge(); [br]60 BOOT_REPEATING_CODE_Flag = BOOT_REPEATING_CODE_Judge(); [br]61 if ( START_Flag && !BOOT_REPEATING_CODE_Flag ) [br]62 { [br]63 for(i =0;i <4; i++) [br]64 { [br]65 B0 = H_L_LEVEL_Judge(); [br]66 B1 = H_L_LEVEL_Judge(); [br]67 B2 = H_L_LEVEL_Judge(); [br]68 B3 = H_L_LEVEL_Judge(); [br]69 B4 = H_L_LEVEL_Judge(); [br]70 B5 = H_L_LEVEL_Judge(); [br]71 B6 = H_L_LEVEL_Judge(); [br]72 B7 = H_L_LEVEL_Judge(); [br]73 DATA[i] = TEMP_BIT; [br]74 } [br]75 for(i =0;i <4; i++) [br]76 { [br]77 SBUF = DATA[i]; [br]78 while( TI == 0 ); [br]79 TI = 0; [br]80 } [br]81 } [br]82 [br]83 } [br]84 } [br]85 [br]86 void UART_Initial() [br]87 { [br]88 SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收 [br]89 [br]90 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload [br]91 [br]92 TH1 = 0xFD; // TH1: reload value for 9600 baud @ [br]93 // 11.0592MHz [br]94 TR1 = 1; // TR1: timer 1 run [br]95 [br]96 EA = 0; // 關(guān)閉總中斷 [br]97 ES = 0; // 關(guān)閉串口中斷 [br]98 } [br]99 [br]100 [br]101 bit START_Judge() [br]102 { [br]103 bit TEMP_Flag = 1; [br]104 unsigned char i = 0; [br]105 [br]106 //在正常無(wú)遙控信號(hào)時(shí),一體化紅外接收頭輸出是高電平,程序一直在循環(huán)。 [br]107 while ( IR_Out == 1); [br]108 [br]109 //重復(fù)10次,目的是檢測(cè)在6876~8352微秒內(nèi)如果出現(xiàn)高電平就退出解碼程序 [br]110 for(i =0;i <9; i++) [br]111 { [br]112 DELAY_Us(800); // 測(cè)試實(shí)際延時(shí)約為764~928us [br]113 if ( IR_Out == 1 ) [br]114 { [br]115 TEMP_Flag = 0; [br]116 break; [br]117 } [br]118 } [br]119 [br]120 return TEMP_Flag; [br]121 } [br]122 [br]123 bit BOOT_REPEATING_CODE_Judge() [br]124 { [br]125 bit TEMP_Flag = 1; [br]126 while( IR_Out == 0 ) ; // 等待高電平避開(kāi)9毫秒低電平引導(dǎo)脈沖 [br]127 [br]128 DELAY_Ms(1); // 測(cè)試實(shí)際延時(shí)約為1.007ms [br]129 DELAY_Ms(1); // 測(cè)試實(shí)際延時(shí)約為1.007ms [br]130 DELAY_Us(200); // 0.086ms [br]131 DELAY_Us(200); // 0.086ms [br]132 DELAY_Us(200); // 0.086ms [br]133 // 共計(jì)2.272ms [br]134 [br]135 if( IR_Out == 0 ) [br]136 { [br]137 TEMP_Flag = 1; // 是連發(fā)碼 [br]138 } [br]139 else [br]140 { [br]141 TEMP_Flag = 0; // 不是連發(fā)碼,而是引導(dǎo)碼 [br]142 } [br]143 return TEMP_Flag; [br]144 } [br]145 bit H_L_LEVEL_Judge() [br]146 { [br]147 while( IR_Out == 0 ); // 等待地址碼第一位的高電平信號(hào) [br]148 DELAY_Us(800); // 測(cè)試實(shí)際延時(shí)約為764~928us [br]149 if ( IR_Out == 1) [br]150 { [br]151 DELAY_Ms(1); // 測(cè)試實(shí)際延時(shí)約為1.007ms [br]152 return 1; [br]153 } [br]154 else [br]155 { [br]156 return 0; [br]157 } [br]158 }
復(fù)制代碼
以上代碼能順利解出我手頭所有遙控器的遙控碼,且無(wú)重復(fù)值;
問(wèn)題是,我在什么地方加入代碼,只判斷第三字節(jié),且能實(shí)現(xiàn)如下功能:
第一次按一個(gè)鍵,代碼可以產(chǎn)生一個(gè)動(dòng)作;再按這個(gè)鍵,代碼可以產(chǎn)生另外的動(dòng)作。。。。。高手迅速指點(diǎn)
|