中文字幕无码不卡一区二区三区_少妇被又大又粗又爽毛片久久黑人_91精品国产在热久久无毒不卡_久久久久久亚洲综合网站

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

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

開發(fā)工具

提供開發(fā)工具、應用測試 完善的開發(fā)代碼案例庫分享

技術(shù)支持

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

新品推廣

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

新聞中心

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

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

更新時間: 2019-03-23
閱讀量:1889

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

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

uchar  TABADD;         //數(shù)碼管顯示碼取碼用寄存器
//uchar  FLAGS;       //顯示位選標志位
uchar  DISPBUF_H;     //顯示器高位
uchar  DISPBUF_L;     //顯示器低位
uchar  CSR0;          //;遙控鍵碼反碼寄存器
uchar  CSR1;          //;遙控器鍵碼寄存器
uchar  CSR2;          //;遙控器用戶碼高8位寄存器
uchar  CSR3;          //;遙控器用戶碼低8位寄存器
uchar  FLAGS2;        //;臨時寄存器
//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;  //送定時器初值
     T0IF =0;   //清定時器0溢出中斷標志位
}
//-------------系統(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;    //預分頻器分配給定時器0,分頻比1:32;開啟RB口弱上拉.
        TMR0=155;    //定時器送初值(255-155)*32US=3.2MS,每3.2MS一次中斷
        PORTC=0xFF;  //先讓數(shù)碼管全部不顯示
        DISPBUF_L=0; //數(shù)碼管先顯示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低電平_____┏┓
                        // ;每一個循環(huán)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          //;每一個循環(huán)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;                 //接收數(shù)據(jù)共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 {        //;每一個循環(huán)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的值  等于實際低電平計數(shù)值
                                         // ;減CNT4的值  等于實際高電平計數(shù)值
                                         // ;將高低電平的計數(shù)加在一起并存入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轉(zhuǎn)去確定是否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); 

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

紫云| 行唐县| 南雄市| 拜城县| 新安县| 武穴市| 济南市| 张家口市| 靖江市| 隆林| 大兴区| 山阳县| 阜城县| 达尔| 潞西市| 阳新县| 开阳县| 佛教| 晋州市| 潮安县| 岱山县| 黄石市| 双城市| 呼伦贝尔市| 溆浦县| 沁阳市| 巍山| 噶尔县| 唐河县| 抚顺市| 巴彦县| 资源县| 赤城县| 鲜城| 罗江县| 十堰市| 东辽县| 吴川市| 南涧| 云安县| 犍为县|