技术热线: 4007-888-234

红外线遥控读码机方案汇编改C

更新时间: 2019-03-23
阅读量:2779

十年专注单片机方案开发的方案公司英锐恩,分享红外线遥控读码机方案汇编改C。本例是一个红外线遥控接收解码程序,程序中数码管显示用的是定时器中断法的动态扫描

/*;红外线遥控读码机,用本实例配合本站套件可读出任何6121或6122(CD6121/CD6122/SC6121/SC6122)及其兼容芯片的红外线遥控器的用户码、键码。
;本例是一个红外线遥控接收解码程序,程序中数码管显示用的是定时器中断法的动态扫描
;动态显示二位数码管的方法,中断法,我们以3MS中断一次从而交换两位数码管轮流点亮。
;对准实验板红外线接收头轻按要测定的遥控器的待测按键一次,此时实验板的中间两位数码管将显示该键的键码,
;(显示为16进制的),轻触实验板的S10此时显示器切换为显示当前遥控器用户码的低8位, 轻触实验板的S11此时显示器切换为显示当前遥控器用户码的高8位,
;轻触实验板的S9此时显示再一次回到显示当前键的键码.
;注意:所有的显示均为16进制,'A'显示为'A','B'显示为'b','C'显示为'c','D'显示为'd','E'显示为'E','F'显示为'F'.
;注意6121的遥控器发射码依次为:同步头(引导码)+32位数据码(用户码低8位+用户码高8位+键码+键码的反码)
;引导码是由9MS的高电平加4.5MS的低电平构成,我们接收到的刚好反相为9MS的低电平加4.5MS的高电平.
;数据码'0'是由560US的高电平加560US的低电平构成,接收时反相为560US的低电平加560US的高电平构成.
;数据码'1'是由560US的高电平加1.69MS的高电平构成,接收时反相为560US的低电平加1.69MS的高电平构成.

#include
 
#define uchar  unsigned char
#define uint   unsigned int
//#define ulong unsigned long

//__CONFIG(XT&UNPROTECT&PWRTEN&BORDIS&WDTEN);

#define bitset(var,bitno)((var)|=1<<(bitno))
#define bitclr(var,bitno)((var)&=~(1<<(bitno)))
union {
      struct {
         unsigned b0:1;
         unsigned b1:1;
         unsigned b2:1;
         unsigned b3:1;
         unsigned b4:1;

unsigned b5:1;
         unsigned b6:1;
         unsigned b7:1;
         }oneBit;
        unsigned char allBits;
       } myFlag;
#define CNT2_1  myFlag.oneBit.b1
#define CNT2_2  myFlag.oneBit.b2 
#define CNT2_3  myFlag.oneBit.b3 
#define CNT2   myFlag .allBits
 
static bit FLAGS ;
static bit Bitin;
 
//  bit FLAGS3 ; 
       
union  Csr
     { unsigned  long i;
         unsigned  char  Csra[4];
     }myCsra;

#define  RMT   RA1       // ;遥控接收输入脚位地址(RA。1)
#define  BITIN  7        //遥控接收数据位位标志
uchar  CNT0, CNT3,CNT4; //用户临时寄存器1--4
uint   CNT1;

uchar  TABADD;         //数码管显示码取码用寄存器
//uchar  FLAGS;       //显示位选标志位
uchar  DISPBUF_H;     //显示器高位
uchar  DISPBUF_L;     //显示器低位
uchar  CSR0;          //;遥控键码反码寄存器
uchar  CSR1;          //;遥控器键码寄存器
uchar  CSR2;          //;遥控器用户码高8位寄存器
uchar  CSR3;          //;遥控器用户码低8位寄存器
uchar  FLAGS2;        //;临时寄存器
//uchar  CSR0A ;      //;遥控接收32位数据暂存寄存器
//uchar  CSR1A ;      //;遥控接收32位数据暂存寄存器
uchar  CSR2A ;        //遥控接收32位数据暂存寄存器
//uchar  CSR3A ;      //遥控接收32位数据暂存寄存器
 
const uchar table[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0a7,0x0a1,0x86,0x8e,};//0x00
                    // 0,     1,    2,   3,    4,   5,    6,   7,   8,   9,   a,   b,    c,   d,    e,    f,

//------------------中断-------------------------
void  interrupt TMR0SERV()
 {
   PORTC =0x0ff;//  先熄灭所有数码管以免闪烁
   RA4=1;
   RA5=1;
   RA0=1;
   RA2=1;
   RA3=1;
  if( FLAGS)
       {PORTC=table[ DISPBUF_L];RA2=0;} //;送RC口显示,位选通
  else {PORTC=table[ DISPBUF_H];RA3=0;}
    FLAGS= !FLAGS;
     TMR0=155;  //送定时器初值
     T0IF =0;   //清定时器0溢出中断标志位
}
//-------------系统初始化子程序------------------------------
void  initial (void)
{
        PORTA=0;
        PORTB=0;     //初始化IO口
        ADCON1=7;    // ;设置RA口全部为普通数字IO口
        TRISA=0x0c2; // 将RMT设置为输入,其它所有IO口设置为输出
        TRISB= 0x0FF;//;RB口全部为输入 
        TRISC=0;     // ;RC口全部为输出
        OPTION=4;    //预分频器分配给定时器0,分频比1:32;开启RB口弱上拉.
        TMR0=155;    //定时器送初值(255-155)*32US=3.2MS,每3.2MS一次中断
        PORTC=0xFF;  //先让数码管全部不显示
        DISPBUF_L=0; //数码管先显示00
        DISPBUF_H=0;
        T0IF=0;

    T0IE=1;     ///定时器0溢出中断允许
        GIE=1;      //总中断允许
}
//-------------将键码送显示---------------------------------------
void  KEY1(void)
{       
         CNT0 =0;        //消除键抖动
         CNT1 =100;
     while( CNT1--&& CNT0!=8)
            {
               if(RB1)    
               CNT0++;
               if(!RB1)

  CNT0=0;
            }
              if( CNT0!=8)
              {
               DISPBUF_H = CSR1>>4;       //;键码值高低位交换,先处理高位
                                         //;屏蔽掉高位 存入寄存器
               DISPBUF_L= CSR1&0x0f;     //;键码值低位处理
                                        //;屏蔽掉高位//;存入寄存器
                while(!RB1);           //;等待键释放
              }
}
//----------------将用户码低8位送显示-------------------------------
void  KEY2(void)
{                              
             CNT0 =0;        //消除键抖动
             CNT1 =100;
       while( CNT1--&& CNT0!=8)
         {
               if (RB2)    
                   CNT0++;
                if(!RB2)
                   CNT0=0;
          }
             if( CNT0!=8)
            {

DISPBUF_H=CSR3>>4;      //;用户码低8位 高低位交换,先处理高位
                                     //;屏蔽掉高位,存入寄存器
             DISPBUF_L=CSR3&0x0f;    //;用户码低8位 低位处理
                                     //;屏蔽掉高位,存入寄存器
                 while(!RB2);       //;等待键释放
            }

}
//---------------将用户码高8位送显示-------------------------------
void  KEY3(void)
{
           CNT0 =0;        //消除键抖动
           CNT1 =100; 
    while( CNT1--&& CNT0!=8)
         {
               if (RB3)    
                   CNT0++;
                if(!RB3)
                   CNT0=0;

 }
             if( CNT0!=8)
           {
             DISPBUF_H=CSR2>>4;      //;用户码低8位 高低位交换,先处理高位
                                     //;屏蔽掉高位,存入寄存器
             DISPBUF_L=CSR2&0x0f;    //;用户码低8位 低位处理
                                     //;屏蔽掉高位,存入寄存器
                 while(!RB3);       //;等待键释放
            }
        
}
//--------------------------------------------------------------------------------------------
void   RCV()
{
  if(!RMT)
  {  
             CNT1=640;  //4*256*10us  640*16=10。24ms
             CNT2=0;
       //RCV1
         do {           // ;先检测引导码的9MS低电平_____┏┓
                        // ;每一个循环16US
              if(RMT)
               CNT2=CNT2++;
              if(!RMT)
                CNT2=0;
              if(CNT2_2)      //高电平大于8*10US=80US则为有效高电平,
                break;        //否则是一些干扰信号16*4=64us
            } while (CNT1--); //低电平大于4*256*10US=10.24MS则是错误脉冲
             

 //RCV2
        if(CNT2_2&&(0<cnt1)&&(cnt1<320)) ;低电平小于2*256*10us="5.12MS┏┒____<br">          {                              //320*16=5。12ms则是错误脉冲
             CNT1=480;                   //;3*256*10us  480*16=7.68
             CNT2=0;
        
           //RCV3          //;每一个循环16US
                      
              do {     
                  if(!RMT)
                   CNT2=CNT2++;
                  if (RMT)
                    CNT2=0;
                  if(CNT2_2)       // 低电平大于8*10US=80US则为有效低电平,否则是一

些干扰信号
                    break;//RCV4   //否则是一些干扰信号16*4=64us
                                   // 高电平大于3*256*10US=7.68MS则是错误的              
                } while (CNT1--);

               //RCV4

                if(CNT2_2 && (0<cnt1)&&(cnt1<320)) 高电平小于1*256*10us="2.56MS则是错误的">                 {                                //480-320=160 *16= 2.56ms
                       CNT3 =32;                 //接收数据共32位,16位用户码,8位控制码加8位控制码的反码
                //RCV5    
                  do {  

 CNT2=0;
                         CNT0=86;   //低电平大于256-170=86*10US=860US错误 86*10 __┌┐
                         CNT4=200;  //高电平大于256-56=200*10US=2MS错误   200*10
                  //RCV5_HI           
                           do {        //;每一个循环10US
                                if(RMT)
                                  CNT2=CNT2++;
                                if(!RMT)
                                   CNT2=0;
                                if(CNT2_3)  //;高电平大于8*10US=80US则为有效高电平
                                   break;   //RCV6否则是一些干扰信号16*4=64us
                         
                                           //;低电平大于860US则是错误的
                               } while (CNT0--);
                   //CV6          
                      if((CNT0==0)||(CNT2_3==0))   break;

 CNT2=0;
                   //RCV6_LO             
                                    do {                    //┌┐__
                                         if(!RMT)
                                           CNT2=CNT2++;
                                          if(RMT)
                                           CNT2=0;
                                           if(CNT2_3) //低电平大于10*8US=80US则是有效低电平
                                            break ;   // COMPARE 否则是一些干扰信号16*4=64us
                                        } while (CNT4--);//高电平大于256-56=200*10US=2MS错误
                                  
                                  if((CNT4==0)||(CNT2_3==0))   break;
 

//OMPARE       
                                      CNT0=(86-CNT0)+(200-CNT4) ;
                                         //;减CNT0的值  等于实际低电平计数值
                                         // ;减CNT4的值  等于实际高电平计数值
                                         // ;将高低电平的计数加在一起并存入CNT0,通过比较高低电平总的时间来确定是1还是0
                                         // ;总的值大于255(即时间大于255*10US=2.55MS)则错误  255*10=2.55
                                         // ;总的时间小于70*10US=700US则是错误的            70*10=700
                                     if(( (70<cnt0)&&(cnt0<130))||((160<cnt0)&&(cnt0<230) ;130*10="1.3MS  ">        

if((70<cnt0)&&(cnt0<130))
                                                          //COMPARE_H   // ;时间大于1.3MS转去确定是否1
                                                         
                                                     Bitin=0;           //;时间在700US-1.3MS之间则是0
                                              else// if (160<cnt0<230)  ;小于160*10us="1.6MS,则错误  ">                                                                        //;大于230*10US=2.3MS,则错误 
                                                    Bitin=1;            // ;时间在1.6MS-2.3MS之间则是1 
                                            myCsra.i= myCsra.i>>1;      //;将每一位移入相应寄存器
                                             if(Bitin)
                                                      bitset (  myCsra. Csra[3],7); 

(文源网络,侵删)