• <tbody id="w8jhq"><dfn id="w8jhq"><pre id="w8jhq"></pre></dfn></tbody>
  • <fieldset id="w8jhq"><pre id="w8jhq"></pre></fieldset>

    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频|成人a站免费|日本黄色片|久久久久无码AV

    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频|成人a站免费|日本黄色片|久久久久无码AV

    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频|成人a站免费|日本黄色片|久久久久无码AV

    技術(shù)熱線: 4007-888-234
    設(shè)計(jì)開發(fā)

    專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

    開發(fā)工具

    提供開發(fā)工具、應(yīng)用測(cè)試 完善的開發(fā)代碼案例庫(kù)分享

    技術(shù)支持

    從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!

    新品推廣

    提供新的芯片及解決方案,提升客戶產(chǎn)品競(jìng)爭(zhēng)力

    新聞中心

    提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)

    紅外線遙控讀碼機(jī)方案匯編改C

    更新時(shí)間: 2019-03-23
    閱讀量:2959

    十年專注單片機(jī)方案開發(fā)的方案公司英銳恩,分享紅外線遙控讀碼機(jī)方案匯編改C。本例是一個(gè)紅外線遙控接收解碼程序,程序中數(shù)碼管顯示用的是定時(shí)器中斷法的動(dòng)態(tài)掃描

    /*;紅外線遙控讀碼機(jī),用本實(shí)例配合本站套件可讀出任何6121或6122(CD6121/CD6122/SC6121/SC6122)及其兼容芯片的紅外線遙控器的用戶碼、鍵碼。
    ;本例是一個(gè)紅外線遙控接收解碼程序,程序中數(shù)碼管顯示用的是定時(shí)器中斷法的動(dòng)態(tài)掃描
    ;動(dòng)態(tài)顯示二位數(shù)碼管的方法,中斷法,我們以3MS中斷一次從而交換兩位數(shù)碼管輪流點(diǎn)亮。
    ;對(duì)準(zhǔn)實(shí)驗(yàn)板紅外線接收頭輕按要測(cè)定的遙控器的待測(cè)按鍵一次,此時(shí)實(shí)驗(yàn)板的中間兩位數(shù)碼管將顯示該鍵的鍵碼,
    ;(顯示為16進(jìn)制的),輕觸實(shí)驗(yàn)板的S10此時(shí)顯示器切換為顯示當(dāng)前遙控器用戶碼的低8位, 輕觸實(shí)驗(yàn)板的S11此時(shí)顯示器切換為顯示當(dāng)前遙控器用戶碼的高8位,
    ;輕觸實(shí)驗(yàn)板的S9此時(shí)顯示再一次回到顯示當(dāng)前鍵的鍵碼.
    ;注意:所有的顯示均為16進(jìn)制,'A'顯示為'A','B'顯示為'b','C'顯示為'c','D'顯示為'd','E'顯示為'E','F'顯示為'F'.
    ;注意6121的遙控器發(fā)射碼依次為:同步頭(引導(dǎo)碼)+32位數(shù)據(jù)碼(用戶碼低8位+用戶碼高8位+鍵碼+鍵碼的反碼)
    ;引導(dǎo)碼是由9MS的高電平加4.5MS的低電平構(gòu)成,我們接收到的剛好反相為9MS的低電平加4.5MS的高電平.
    ;數(shù)據(jù)碼'0'是由560US的高電平加560US的低電平構(gòu)成,接收時(shí)反相為560US的低電平加560US的高電平構(gòu)成.
    ;數(shù)據(jù)碼'1'是由560US的高電平加1.69MS的高電平構(gòu)成,接收時(shí)反相為560US的低電平加1.69MS的高電平構(gòu)成.

    #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        //遙控接收數(shù)據(jù)位位標(biāo)志
    uchar  CNT0, CNT3,CNT4; //用戶臨時(shí)寄存器1--4
    uint   CNT1;

    uchar  TABADD;         //數(shù)碼管顯示碼取碼用寄存器
    //uchar  FLAGS;       //顯示位選標(biāo)志位
    uchar  DISPBUF_H;     //顯示器高位
    uchar  DISPBUF_L;     //顯示器低位
    uchar  CSR0;          //;遙控鍵碼反碼寄存器
    uchar  CSR1;          //;遙控器鍵碼寄存器
    uchar  CSR2;          //;遙控器用戶碼高8位寄存器
    uchar  CSR3;          //;遙控器用戶碼低8位寄存器
    uchar  FLAGS2;        //;臨時(shí)寄存器
    //uchar  CSR0A ;      //;遙控接收32位數(shù)據(jù)暫存寄存器
    //uchar  CSR1A ;      //;遙控接收32位數(shù)據(jù)暫存寄存器
    uchar  CSR2A ;        //遙控接收32位數(shù)據(jù)暫存寄存器
    //uchar  CSR3A ;      //遙控接收32位數(shù)據(jù)暫存寄存器
     
    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;//  先熄滅所有數(shù)碼管以免閃爍
       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;  //送定時(shí)器初值
         T0IF =0;   //清定時(shí)器0溢出中斷標(biāo)志位
    }
    //-------------系統(tǒng)初始化子程序------------------------------
    void  initial (void)
    {
            PORTA=0;
            PORTB=0;     //初始化IO口
            ADCON1=7;    // ;設(shè)置RA口全部為普通數(shù)字IO口
            TRISA=0x0c2; // 將RMT設(shè)置為輸入,其它所有IO口設(shè)置為輸出
            TRISB= 0x0FF;//;RB口全部為輸入 
            TRISC=0;     // ;RC口全部為輸出
            OPTION=4;    //預(yù)分頻器分配給定時(shí)器0,分頻比1:32;開啟RB口弱上拉.
            TMR0=155;    //定時(shí)器送初值(255-155)*32US=3.2MS,每3.2MS一次中斷
            PORTC=0xFF;  //先讓數(shù)碼管全部不顯示
            DISPBUF_L=0; //數(shù)碼管先顯示00
            DISPBUF_H=0;
            T0IF=0;

        T0IE=1;     ///定時(shí)器0溢出中斷允許
            GIE=1;      //總中斷允許
    }
    //-------------將鍵碼送顯示---------------------------------------
    void  KEY1(void)
    {       
             CNT0 =0;        //消除鍵抖動(dòng)
             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;        //消除鍵抖動(dòng)
                 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;        //消除鍵抖動(dòng)
               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 {           // ;先檢測(cè)引導(dǎo)碼的9MS低電平_____┏┓
                            // ;每一個(gè)循環(huán)16US
                  if(RMT)
                   CNT2=CNT2++;
                  if(!RMT)
                    CNT2=0;
                  if(CNT2_2)      //高電平大于8*10US=80US則為有效高電平,
                    break;        //否則是一些干擾信號(hào)16*4=64us
                } while (CNT1--); //低電平大于4*256*10US=10.24MS則是錯(cuò)誤脈沖
                 

     //RCV2
            if(CNT2_2&&(0<cnt1)&&(cnt1<320)) ;低電平小于2*256*10us="5.12MS┏┒____<br">          {                              //320*16=5。12ms則是錯(cuò)誤脈沖
                 CNT1=480;                   //;3*256*10us  480*16=7.68
                 CNT2=0;
            
               //RCV3          //;每一個(gè)循環(huán)16US
                          
                  do {     
                      if(!RMT)
                       CNT2=CNT2++;
                      if (RMT)
                        CNT2=0;
                      if(CNT2_2)       // 低電平大于8*10US=80US則為有效低電平,否則是一

    些干擾信號(hào)
                        break;//RCV4   //否則是一些干擾信號(hào)16*4=64us
                                       // 高電平大于3*256*10US=7.68MS則是錯(cuò)誤的              
                    } while (CNT1--);

                   //RCV4

                    if(CNT2_2 && (0<cnt1)&&(cnt1<320)) 高電平小于1*256*10us="2.56MS則是錯(cuò)誤的">                 {                                //480-320=160 *16= 2.56ms
                           CNT3 =32;                 //接收數(shù)據(jù)共32位,16位用戶碼,8位控制碼加8位控制碼的反碼
                    //RCV5    
                      do {  

     CNT2=0;
                             CNT0=86;   //低電平大于256-170=86*10US=860US錯(cuò)誤 86*10 __┌┐
                             CNT4=200;  //高電平大于256-56=200*10US=2MS錯(cuò)誤   200*10
                      //RCV5_HI           
                               do {        //;每一個(gè)循環(huán)10US
                                    if(RMT)
                                      CNT2=CNT2++;
                                    if(!RMT)
                                       CNT2=0;
                                    if(CNT2_3)  //;高電平大于8*10US=80US則為有效高電平
                                       break;   //RCV6否則是一些干擾信號(hào)16*4=64us
                             
                                               //;低電平大于860US則是錯(cuò)誤的
                                   } 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 否則是一些干擾信號(hào)16*4=64us
                                            } while (CNT4--);//高電平大于256-56=200*10US=2MS錯(cuò)誤
                                      
                                      if((CNT4==0)||(CNT2_3==0))   break;
     

    //OMPARE       
                                          CNT0=(86-CNT0)+(200-CNT4) ;
                                             //;減CNT0的值  等于實(shí)際低電平計(jì)數(shù)值
                                             // ;減CNT4的值  等于實(shí)際高電平計(jì)數(shù)值
                                             // ;將高低電平的計(jì)數(shù)加在一起并存入CNT0,通過比較高低電平總的時(shí)間來確定是1還是0
                                             // ;總的值大于255(即時(shí)間大于255*10US=2.55MS)則錯(cuò)誤  255*10=2.55
                                             // ;總的時(shí)間小于70*10US=700US則是錯(cuò)誤的            70*10=700
                                         if(( (70<cnt0)&&(cnt0<130))||((160<cnt0)&&(cnt0<230) ;130*10="1.3MS  ">        

    if((70<cnt0)&&(cnt0<130))
                                                              //COMPARE_H   // ;時(shí)間大于1.3MS轉(zhuǎn)去確定是否1
                                                             
                                                         Bitin=0;           //;時(shí)間在700US-1.3MS之間則是0
                                                  else// if (160<cnt0<230)  ;小于160*10us="1.6MS,則錯(cuò)誤  ">                                                                        //;大于230*10US=2.3MS,則錯(cuò)誤 
                                                        Bitin=1;            // ;時(shí)間在1.6MS-2.3MS之間則是1 
                                                myCsra.i= myCsra.i>>1;      //;將每一位移入相應(yīng)寄存器
                                                 if(Bitin)
                                                          bitset (  myCsra. Csra[3],7); 

    (文源網(wǎng)絡(luò),侵刪)

    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频
  • <tbody id="w8jhq"><dfn id="w8jhq"><pre id="w8jhq"></pre></dfn></tbody>
  • <fieldset id="w8jhq"><pre id="w8jhq"></pre></fieldset>