找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5259|回復(fù): 5
收起左側(cè)

單片機(jī)紅外解碼,短按開關(guān)燈,長(zhǎng)按調(diào)光,數(shù)碼管顯示鍵值 源程序

  [復(fù)制鏈接]
ID:140489 發(fā)表于 2020-9-2 15:32 | 顯示全部樓層 |閱讀模式
//紅外解碼,實(shí)驗(yàn)板測(cè)試正常,8位數(shù)碼管顯示遙控編碼(用戶碼,用戶反碼,右邊3位數(shù)碼管顯示PWM值),
//兩片74hc573驅(qū)動(dòng)8位共陰數(shù)碼管
//CH-鍵短按開關(guān)燈,+鍵長(zhǎng)按調(diào)光,數(shù)碼管顯示鍵值;長(zhǎng)按調(diào)光的解碼程序目前網(wǎng)上很難找到,我琢磨了很久才把程序調(diào)通//壓縮包里有完整的程序代碼,有邏輯分析儀測(cè)試的連發(fā)碼的波形
遙控器鍵值圖.png aaa.jpg
單片機(jī)源程序如下:
  1. #include "INC\STC89C52RC.H"
  2. #include "INC\MY_SET.H"
  3. #include "INC\IR_NEC.H"                   //調(diào)用NEC解碼頭文件


  4. #define DIGI_PORT P0 // 宏定義數(shù)碼管端口,如果端口改變,只需修改這一句即可
  5. #define DIGI_NUM 8 // 宏定義數(shù)碼管個(gè)數(shù)
  6. unsigned char digiBuf[DIGI_NUM]; //數(shù)碼管緩沖區(qū)
  7. sfr   SE   = 0x80;             //數(shù)碼管段選 P0:0x80   P1:0x90
  8. sbit wela = P2^7;           //位選
  9. sbit dula = P2^6;           //段選


  10. sbit led = P1^2;

  11. uint8 PWM_Val=200;           //占空比 變量
  12. uint8 flag; //開關(guān)燈標(biāo)志
  13. uint8 flag1;//調(diào)光方向標(biāo)志
  14. uint8 count;
  15. uint8 flag2; //
  16. uint8 num,pwm;
  17.                                 // 0     1    2    3    4     5    6    7    8   9          A    B    C    D   E    F    不顯  -
  18. uint8 code d[]={ 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40}; //數(shù)碼管段碼  共陰不帶小數(shù)點(diǎn)段碼

  19. void KZ0();      //短按處理
  20. //void KZ1();      //長(zhǎng)按處理


  21. /***************** 主函數(shù) ********************/
  22. void main(void)
  23. {
  24.         IR_Init();                           //紅外線解碼初始化
  25.         while(1)
  26.         {
  27.           //遙控檢測(cè)
  28.                    if(IR_BT==2)
  29.                 {
  30.                          KZ0();                //短按處理
  31.                         IR_BT =0;        //清有效標(biāo)志
  32.                 //更新顯示
  33.                         digiBuf[0]  = NEC[0]/16;   //用戶碼               
  34.                         digiBuf[1]  = NEC[0]%16;   
  35.                         digiBuf[2]  = NEC[1]/16;   //用戶反碼
  36.                         digiBuf[3]  = NEC[1]%16;
  37.         //                digiBuf[4]  = NEC[2]/16;   //數(shù)據(jù)碼
  38.         //                digiBuf[5]  = NEC[2]%16;
  39.         //                digiBuf[6]  = NEC[3]/16;   //數(shù)據(jù)反碼
  40.         //                digiBuf[7]  = NEC[3]%16;
  41.                 }
  42.                 digiBuf[4]  = 16;        //不顯
  43.                 digiBuf[5]  = PWM_Val/100;        //顯示pwm值
  44.                 digiBuf[6]  = PWM_Val%100/10;   
  45.                 digiBuf[7]  = PWM_Val%10;

  46.         
  47.                 if(IR_BT==3 && KeyUpDownFlag==0 )                //長(zhǎng)按調(diào)光,松手停止調(diào)光
  48.                 {        
  49.                         
  50.                         switch(NEC[2])
  51.                         {                                                                                  //長(zhǎng)按接收的是連發(fā)碼,97.11ms高電平,10.15ms低電平
  52.                                 case 0x15:        if(IR==1)                                     //if(IR==0)
  53.                                                         {
  54.                                                                 KeyUpDownFlag=1;        //如果按鍵抬起,松手標(biāo)志置1
  55.                                                         }         
  56.                                 
  57.                                                         if(flag1==1 && flag==0)           // 開燈狀態(tài) +鍵 長(zhǎng)按連加          亮度加
  58.                                                         {
  59.                                                                 if(PWM_Val<200)
  60.                                                                 {
  61.                                                                         
  62.                                                                         PWM_Val++;                   // if(IR==1)用這句
  63.                                                                 //        PWM_Val += 5;           //if(IR==0)用這句    加5 燈亮度變化才明顯
  64.                                                                         if(PWM_Val==200)
  65.                                                                                 
  66.                                                                                 flag1=0;
  67.                                                                         
  68.                                                                 }
  69.                                                         }         
  70.                                                 
  71.                                                         if(flag1==0 && flag==0)   //開燈狀態(tài)  +鍵 長(zhǎng)按連減         亮度 減
  72.                                                         {
  73.                                                                 if(PWM_Val>0)
  74.                                                                 {
  75.                                                                 //        PWM_Val -= 5;
  76.                                                                         PWM_Val--;
  77.                                                                         if(PWM_Val==0)
  78.                                                                            
  79.                                                                                 flag1=1;
  80.                                                                
  81.                                                                 }
  82.                                                         }          break;  
  83.                         
  84.                                                         
  85.                                         case 0x07:break;
  86.                                         default:break;
  87.                         }        
  88.                
  89.                 }        
  90.                


  91. ///////////////////////////////////////////               
  92.                
  93.                 if(flag==0)                   //開燈
  94.                 {        
  95.                         for(pwm=200;pwm>0;pwm--)
  96.                         {
  97.                                 if(PWM_Val<pwm)
  98.                                 {
  99.                                         led=1;
  100.                         
  101.                                 }
  102.                                 else
  103.                                 {
  104.                                         led=0;
  105.                         
  106.                                 }
  107.                         }
  108.                 }
  109.                 else
  110.                 {
  111.                         led=1;                  //關(guān)燈
  112.                 }

  113.          
  114.         }

  115. }
復(fù)制代碼


全部資料51hei下載地址:
紅外線NEC解碼(任意腳接收,短按開關(guān),長(zhǎng)按調(diào)光).rar (329.78 KB, 下載次數(shù): 191)

評(píng)分

參與人數(shù) 2黑幣 +65 收起 理由
digger63 + 15 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:964280 發(fā)表于 2021-9-10 10:55 | 顯示全部樓層
很好,希望可以用到
回復(fù)

使用道具 舉報(bào)

ID:965189 發(fā)表于 2021-11-27 10:04 | 顯示全部樓層
希望能正常解碼。
回復(fù)

使用道具 舉報(bào)

ID:543220 發(fā)表于 2021-12-17 18:00 | 顯示全部樓層
我想問下 為啥IR判斷等于1,就是紅外遙控按鍵抬起呢?
回復(fù)

使用道具 舉報(bào)

ID:543220 發(fā)表于 2021-12-17 18:01 | 顯示全部樓層
你好 我想問下 為啥是IR=1 表示紅外按鍵抬起呢
回復(fù)

使用道具 舉報(bào)

ID:140489 發(fā)表于 2021-12-29 16:47 | 顯示全部樓層
a2748446 發(fā)表于 2021-12-17 18:01
你好 我想問下 為啥是IR=1 表示紅外按鍵抬起呢

接收頭沒有接收到紅外光時(shí),輸出端是高電平
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表