| 
 
| #include<iom16.h> #include<intrinsics.h>
 #define uchar unsigned char
 #define uint unsigned int
 uchar     IRcode[4];   //定义一个4字节的数组用来存储代码
 uchar     CodeTemp;   //编码字节缓存变量
 uchar     i,j,k,l=0;    //延时用的循环变量
 /**************************延时0.9ms子程序**********************/
 void Delay0_9ms(void)
 {uint i;
 for(i=1;i<1125;i++)
 ;
 }
 /***************************延时1ms子程序**********************/
 void Delay1ms(void)
 {uint i;
 for(i=1;i<1247;i++)
 ;
 }
 /***************************延时4.5ms子程序**********************/
 void Delay4_5ms(void)
 {uint i;
 for(i=1;i<5626;i++)
 ;
 }
 /**************************** 延时子程序 ************************/
 void Delay(void)
 {uchar i,j,k;
 for(i=200;i>0;i--)
 for(j=200;j>0;j--)
 for(k=3;k>0;k--) ;
 }
 /************************中断0解码服务子程序**********************/
 //*****************************
 #pragma vector=INT1_vect
 __interrupt void int1_isr(void)
 { SREG=0x00;
 for(k=0;k<10;k++)
 {Delay0_9ms();
 if ((PIND&0x08)==0x00)         //如果0.9ms后IRsignal=1,说明不是引导码
 {k=10;break;}
 else if(k==9)           //如果持续了10×0.9ms=9ms的低电平,说明是引导码
 {while((PIND&0x08)==0x08);
 Delay4_5ms();        //跳过持续4.5ms的高电平
 for(i=0;i<4;i++)       //分别读取4个字节
 {for(j=1;j<=8;j++)      //每个字节8个bit的判断
 { while((PIND&0x08)==0x08);       //等待上升沿
 Delay0_9ms();      //从上升沿那一时刻开始延时0.9ms,再判断IRsignal
 if((PIND&0x08)==0x00)     //如果IRsignal是"1",则向右移入一位"1"
 {Delay1ms();
 CodeTemp=CodeTemp|0x80;
 if(j<8) CodeTemp=CodeTemp>>1;
 }
 else
 if(j<8)CodeTemp=CodeTemp>>1;//如果IRsignal是"0",则向右移一位,自动补"0"
 }
 IRcode[i]=CodeTemp;
 CodeTemp=0;
 }}
 }
 SREG=0x80;
 }
 /**************************主程序*************************/
 void main()
 {
 DDRB=0xff;
 PORTB=0xff;
 DDRD=0x02;
 PORTD=0xff;
 MCUCR = 0x08;
 GICR  = 0x80;
 SREG=0x80;
 CodeTemp=0;    //初始化红外编码字节缓存变量
 while(1)
 {
 if (IRcode[2]==0x10)
 {PORTB=0x00;
 Delay();
 }
 }
 }
 上面的程序是本人摘自网上的一段关于51单片机红外遥控解码程序改编而来,本人用的是AVR的M16单片机,可是调试怎么也不能成功,我的目的就是先调通,所以就是一旦遥控器1键发送数据,即0X10,就把PORTB口拉低.首先声明,我的延时子程序都很精确,误差不超过20US,其他基本都是按照原版本改编,为什么会不成功呢,高手指教.
 | 
 |