资源描述
红外解码程序: /*/*将从接收头出来的红外二进制脉冲信号先与取反再与标志位(P24)进行逻辑/*与,然后再输入到INT0(P3.2)引脚,经非门U6缓冲与P24的判断信号进行/*逻辑与,使得输入INT0的信号恰好是红外数据发射电路输出端P25的相反的/*相位信号,只要检测到INT0信号下降沿到上升沿的这段时间。只需要在同一/*个高(低)电平脉冲里,将低电平去掉(脉宽为0.565ms、间隔0.56ms、周期/*为1.125ms的组合表示二进制“0”中的脉宽为0.565ms去掉;以脉宽为/*0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”中的脉宽/*为0.565ms去掉)。在接收完控制指令后再接收校对数据以确认红外发射数据/*的正确性,脉冲电平的每一次下降沿跳变都会形成一次中断,在中断服务子程/*中即可实现一次性对一连串连续波形的测量,从而测出控制指令的功/*能。/*程序设置部分:/*TMOD=0X05 T1H=0 T1L=0 P24=0 EA=1/*定时器0工作方式1,在INT外部中断信号下降沿到来定时器开始计数/*sfr P0=0x80;sfr P3=0xb0;sbit P32=P32;Sbit P11=P1.1;Sbit P12=P1.2;Sbit P13=P1.3;Sbit T00=P34;Sbit T11=P35;unsigned char dm,i,j,k,dj1,dj2,dj3,ss,tt,ssc;Unsigned long int mmt;unsigned char data a80,h; /定义数组,用来存储代码与校验数据void ds0_9ms(void) unsigned char j,k;for(j=18;j0;j-)for(k=20;k0;k-) ;void ds1ms(void)unsigned char i,j;for(i=2;i0;i-) for(j=230;j0;j-) ;void ds4_5ms(void)unsigned char i,j; for(i=10;i0;i-) for(j=225;j0;j-) ;void ds2s(void)unsigned char i,j,k;for(i=200;i0;i-) for(j=200;j0;j-)for(k=10;k0;k-) ;Void ds10ms(void) Unsigned char sk,ms,hh;For(sk=20;sk0;sk-)For(ms=225;ms0;ms-);void t0(void) interrupt 1 using 1 /定时器T0中断While( ) For(i=13;i0;i-) /产生13us高电平脉冲 T00=1; /T0口连续输出脉冲电平 For(j=13;j0;j-) /产生13us低电平脉冲 T00=0; /*/*检验红外线的辐射区域内的设备是否被选项中/*dj1表示选择的是设备1,dj2 表示选择的是设备2,dj3 表示选择的是设备3/*设备的选择是通过djflag的值来进行判断/*void daji( unsigned char djflag) While( djflag!=0 ) If( djflag=1 ) /设备1选中 P11=1; ET1=1; /定时器1初始化 EX1=1; des1ms( ); ET1=0; EX1=0; If( djflag=2 ) /设备2选中 P12=1;EX1=1;ET1=1;des1ms( );ET1=0;EX1=0; If( djflag=3 ) 设备3选中 P13=1; ET1=1; EX1=1; des1ms( ); ET1=0; EX1=0; Void INT_0(void) interrupt 0 using 0 /时间间隔测量While( ) /调用jiji测时间间隔与判断 Jiji( );Void jiji(void) /用来根据INT_0测出的时间周期If(P32=0)ET1=1;EX1=1;Else ET1=0;EX1=0;Mmt=ssc*65536+tt*256+ss; /计算脉冲时间的宽度If(mmt=565)/时间为0.565ms时不记Mmt=0;If(mmt=560)ah+=0; /将测得的0和1的值存放在a数组里If(mmt=1685)Ah+=1;void T1(void) interrupt 2 using 2Ss+; /每个机器周期加1If(ss=256)/每256个机器周期清零 ss=0; Tt+; If(tt=256) /256*2566个机器周期清零 Tt=0;Ssc+; /最大值256*256*256If(ssc256)Ss=0; /清零实际值达不到最大值Tt=0;Ssc=0;
展开阅读全文