89系列的单片机可以用的红外解码在stc12系列却不能用
[复制链接]
#include #include #include"1602.h" #define NOP() _nop_() /* 定义空指令 */ #define uchar unsignedchar #define uint unsigned int #define delayNOP();{_nop_();_nop_();_nop_();_nop_();}; void delay(uchar x); //x*0.14MS void delay1(int ms); void beep(void); sbit IRIN = P3^3; //红外接收器数据线 sbit RELAY= P1^0; //继电器驱动线 sbit BEEP = P1^1; //蜂鸣器驱动线 uchar IRCOM[7]; ucharcdis1[] = {" REMOTE CONTROL "}; ucharcdis2[] = {" IR-CODE: ----H"}; unsigned char Y0; /*******************************************************************/ main() { uchar m; IE =0x84; //允许总中断中断,使能 INT1外部中断 TCON =0x01; //触发方式为脉冲负边沿触发 IRIN=1; //I/O口初始化 BEEP=1; RELAY=1; delay1(10); //延时 lcd_init(); //初始化LCD lcd_pos(0); //设置显示位置为第一行的第1个字符 m= 0; while(cdis1[m] != '\0') { //显示字符 lcd_wdat(cdis1[m]); m++; } lcd_pos(0x40); //设置显示位置为第二行第1个字符 m= 0; while(cdis2[m] != '\0') { lcd_wdat(cdis2[m]); //显示字符 m++; } while(1); } //end main /**********************************************************/ void IR_IN(void)interrupt 1 //外部中断服务程序 { unsigned charj,k,N=0; EX1 = 0; delay(15); if (IRIN==1) {EX1 =1; return; } //确认IR信号出现 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 {delay(1);} for(j=0;j<4;j++) //收集四组数据 { for(k=0;k<8;k++) //每组数据有8位 { while(IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 {delay(1);} while(!IRIN) //等 IR 变为高电平 {delay(1);} while (IRIN) //计算IR高电平时长 { delay(1); N++; if(N>=30) { EX1=1; return;} //0.14ms计数过长自动离开。 } //高电平计数完毕 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0” if(N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1” N=0; }//end for k }//end for j if(IRCOM[2]!=~IRCOM[3]) { EX1=1; return; } IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位 IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位 if(IRCOM[5]>9) {IRCOM[5]=IRCOM[5]+0x37;} else IRCOM[5]=IRCOM[5]+0x30; if(IRCOM[6]>9) {IRCOM[6]=IRCOM[6]+0x37;} else IRCOM[6]=IRCOM[6]+0x30; lcd_pos(0x4b); lcd_wdat(IRCOM[6]); //第一位数显示 lcd_pos(0x4c); lcd_wdat(IRCOM[5]); //第二位数显示 Y0=0; switch(IRCOM[2]) { case 0x09:Y0=0x01; break; case 0x1D:Y0=0x02; break; case 0x1F: Y0=0x03; break; case 0x0D:Y0=0x04; break; case 0x19:Y0=0x05; break; case 0x1B:Y0=0x06; break; case 0x11:Y0=0x07; break; case 0x15:Y0=0x08; break; case 0x17:Y0=0x09; break; case 0x13:RELAY=1; break; case 0x14:RELAY=1; break; case 0x51:RELAY=0; break; } if(Y0&0x01)RELAY=0;//打开继电器 elseRELAY=1; //关闭继电器 beep(); EX1 =1; } /**********************************************************/ void beep(void) { unsigned chari; for(i=0;i<100;i++) { delay(4); BEEP=!BEEP; //BEEP取反 } BEEP=1; //关闭蜂鸣器 } /**********************************************************/ void delay(unsignedchar x) //x*0.14MS { unsigned int i; while(x--) { for (i = 0;i<130; i++) {} } } 晶振用的是11.0592M的,单片机stc12le5A60S2,用的是外部中断1,上面程序在89系列里可以运行(i=13),在12系列就不可以望大虾指导。
|