标签:
1 #include <REG52.H> 2 //#include "红外.h" 3 #include <intrins.h> 4 //extern unsigned char flag,MODEL,gears,c,rev,set_temperature; 5 #define uchar unsigned char 6 void delay(unsigned int x); //x*0.14MS 7 sbit IN1 = P2^0; //电机方向 8 sbit IN2 = P2^1; //电机方向 9 sbit IN3 = P2^2; //电机方向 10 sbit IN4 = P2^3; //电机方向 11 12 sbit IRIN = P3^2; //红外接收器数据线 13 sbit v = P2^0; 14 uchar IRCOM[7]; 15 void IR_IN() interrupt 0 using 0 16 { 17 unsigned char j,k,N=0; 18 19 EX0 = 0; //关掉外部中断防止中断的再次发生进入检测引导码阶段(9ms的低电平4.5ms的高电平) 20 delay(15); 21 if (IRIN==1) 22 { EX0 =1; 23 return; 24 } 25 //确认IR信号出现 26 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 27 {delay(1);} 28 29 for (j=0;j<4;j++) //收集四组数据 30 { 31 for (k=0;k<8;k++) //每组数据有8位 32 { 33 while (IRIN) //等 IR 变为低电平,跳过4.5ms的引导高电平信号。 34 {delay(1);} 35 while (!IRIN) //等 IR 变为高电平 36 {delay(1);} 37 while (IRIN) 38 { 39 delay(1); 40 N++; 41 if (N>=30) 42 { 43 EX0=1; 44 return; 45 } 46 } 47 IRCOM[j]=IRCOM[j] >> 1; 48 if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} 49 N=0; 50 }//end for k 51 }//end for j 52 53 if (IRCOM[2]!=~IRCOM[3]) // 判断有没有误码(有责放弃没有判断键码) 54 { EX0=1; 55 return; 56 } 57 switch(IRCOM[2]) 58 { // 显示遥控上的字符按键 59 case 0x45: break; // 按下switch开关键后显示功能数组的第一个功能项 60 case 0x46: break; // 用来选择1602显示功能的函数 61 case 0x47: break; // quiet用于控制声音的有无 62 case 0x44: // 后退 63 IN1=0; 64 IN2=1; 65 IN3=1; 66 IN4=0; 67 break; 68 case 0x40: // 前进 69 IN1=1; 70 IN2=0; 71 IN3=0; 72 IN4=1; 73 break; 74 case 0x43: // 制动 75 IN1=0; 76 IN2=0; 77 IN3=0; 78 IN4=0; 79 break; 80 case 0x07: break; // eq为返回键,返回后回到第一个功能 81 case 0x15: break; 82 case 0x09: break; 83 case 0x16: break; 84 case 0x19: break; 85 case 0x0d: break; 86 case 0x0c: break; 87 case 0x18: break; 88 case 0x5e: break; 89 case 0x08: break; 90 case 0x1c: break; 91 case 0x5a: break; 92 case 0x42: break; 93 case 0x52: break; 94 case 0x4a: break; 95 } 96 EX0 = 1; 97 98 } 99 100 /**********************************************************/ 101 void delay(unsigned int x) //x*0.14MS 102 { 103 unsigned char i; 104 while(x--) 105 { 106 for (i = 0; i<13; i++) {} 107 } 108 } 109 110 void INTN_0()//红外中断初始化 111 { 112 IRIN=1; //I/O口初始化 113 IE |= 0x81; //允许总中断中断,使能 INT0 外部中断 114 TCON |= 0x01; //触发方式为脉冲负边沿触发 115 IP=0x20; 116 } 117 118 void main() 119 { 120 121 INTN_0(); 122 123 while(1); 124 125 }
标签:
原文地址:http://www.cnblogs.com/yuwl26/p/4246185.html