天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術熱線: 4007-888-234

技術支持

紅外線遙控讀碼機方案匯編改C

更新時間: 2019-03-23

十年專注單片機方案開發的方案公司英銳恩,分享紅外線遙控讀碼機方案匯編改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); 

(文源網絡,侵刪)

404
返回首頁 |  返回上一頁
联系我们: 铁岭市| 安化县| 治多县| 安溪县| 长沙市| 昭通市| 娱乐| 屯留县| 安阳市| 闵行区| 开平市| 瑞昌市| 外汇| 鄂托克前旗| 肃北| 宜章县| 沅陵县| 潜江市| 夹江县| 友谊县| 通海县| 民乐县| 涪陵区| 高密市| 泗阳县| 平和县| 祁门县| 霍山县| 师宗县| 罗甸县| 克东县| 古丈县| 花垣县| 临沭县| 永仁县| 北安市| 康乐县| 天柱县| 瑞安市| 黑水县| 汉中市|