找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4531|回復(fù): 29
打印 上一主題 下一主題
收起左側(cè)

遙控風(fēng)扇芯片BA5104 STC8G1K08-TSSOP20單片機(jī)四位共陰數(shù)碼管 紅外解碼程序

  [復(fù)制鏈接]
回帖獎勵 100 黑幣 回復(fù)本帖可獲得 5 黑幣獎勵! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:796012 發(fā)表于 2023-5-8 09:40 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /*風(fēng)扇遙控芯片:BA5104  紅外遙控解碼程序  晶振頻率:11.0592MHZ  1幀12位,一次至少發(fā)2幀*//*歷時8天成功調(diào)試,干擾碼直接清零,只顯示相關(guān)鍵值*/
  2. /*解碼后的鍵值:關(guān)機(jī) 0xfd81; 開/風(fēng)速 0xfd82; 風(fēng)類 0xfd84; 定時 0xfd88; 搖頭 0xfd90; 彩燈 0xfdc3; 無 0xfda0; 無 0xfdc6*/
  3. #include "STC8G.h"/*單片機(jī):STC8G1K08-TSSOP20*//*紅外端口:P33(包含外部中斷1,改端口時要注意)*/
  4. unsigned char q,b,s,g,/*位選*/xs,ir[13],j,c;unsigned int r,m,d0,d1;
  5. unsigned char code dm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*共陰段碼*/
  6. void delayms(unsigned int i){while(i--);}/*延時函數(shù)*/
  7. void int1init(){IT1=1;EX1=1;EA=1;}/*外部中斷1初始化函數(shù),設(shè)置成下降沿觸發(fā)*/
  8. void d1r1Init()/*定時器1初始化函數(shù)*/{AUXR |= 0x40;/*1T*/TMOD &= 0x0F;TL1 = 0x70;/*初始值*/TH1 = 0xFF;/*初始值*/TF1 = 0;/*清除TF1標(biāo)志*/TR1=0;/*先不啟動*/ET1=1;/*開中斷*/EA=1;}
  9. void kayscan()/*P1端口對地增加按鍵*/
  10. {
  11.         P1=0xff;
  12.         P34=1;P35=1;P36=1;P37=1;
  13.   if(P11==0){delayms(5);if(P11==0){IAP_CONTR |= 0x20;/*軟件復(fù)位,并且從用戶程序開始執(zhí)行*/while(!P11);}}
  14.         if(P12==0){delayms(5);if(P12==0){xs=1;while(!P12);}}if(P13==0){delayms(5);if(P13==0){xs=2;while(!P13);}}  
  15.         P1=0x00;
  16. }
  17. void display()/*數(shù)碼管掃描*/
  18. {
  19.         unsigned char i;for(i=0;i<4;i++){switch(i)/*選擇顯示位置*/
  20.         {case(0):P34=0;P35=1;P36=1;P37=1;break;/*千位*/case(1):P34=1;P35=0;P36=1;P37=1;break;/*百位*/case(2):P34=1;P35=1;P36=0;P37=1;break;/*十位*/case(3):P34=1;P35=1;P36=1;P37=0;break;/*個位*/}
  21.    if(i==0){P1=dm[q];}/*千位*/if(i==1){P1=dm[b];}/*百位*/if(i==2){P1=dm[s];}/*十位*/if(i==3){P1=dm[g];}/*個位*/delayms(50); /*間隔一段時間掃描*/P1=0x00;/*消隱*/}
  22. }
  23. void ircl()/*紅外時間記錄*/
  24. {
  25.         unsigned char c1;
  26.         if(!P33)
  27.         {
  28.     d1=0;
  29.     TR1=1;/*啟動定時器1*/
  30.     while(!P33);
  31.     TR1=0;
  32.     ir[j]=d1;
  33.         }
  34.         /*編碼位置清零*/
  35.   if(P33==1&&j>0)/*當(dāng)端口高電平時,編碼位置還未清零*/
  36.         {
  37.     c++;/*計算一下持續(xù)時間*/
  38.    if(c>250){c1++;c=0;}/*超過一定的時間*/
  39.          if(c1>5){j=0;c1=0;}/*就要再次按遙控按鍵*/
  40.          /*如果還有干擾碼就直接清零*/
  41.         }
  42. }
  43. void xssz() /*顯示的數(shù)值*/
  44. {
  45.         /*按K1顯示收錄的紅外編碼*/
  46.         if(xs==0){g=m/1%16;s=m/16%16;b=m/256%16;q=m/4096%16;}/*1倍代表示4位16進(jìn)制,16倍表示8位16進(jìn)制,256倍表示12位16進(jìn)制,4096倍表示16位16進(jìn)制*/
  47.         /*按K2顯示0表示編碼位置清零成功*/
  48.         if(xs==1){g=c%10;s=c/10%10;b=c/100%10;q=0;}
  49.         /*按K3顯示大約中斷次數(shù)和快速清零*/
  50.         if(xs==2){g=j%10;s=j/10%10;b=j/100%10;q=j/1000%10;}
  51. }
  52. void main()
  53. {
  54.         P1M0=0xff; P1M1=0; P3M0=0; P3M1=0; P5M0=0; P5M1=0;/*端口模式*/P33=1;j=0;xs=0;
  55.         d1r1Init();/*定時器1初始化*/
  56.         delayms(1000);/*等待電源穩(wěn)定*/
  57.         int1init();/*外部中斷1初始化*/
  58.         while(1)
  59.         {
  60.                 ircl();
  61.                 kayscan();
  62.                 xssz();
  63.                 display();
  64.         }
  65. }
  66. /*傳統(tǒng)51單片機(jī)具有5個中斷源,中斷優(yōu)先級從高到低依次是:外部中斷0(interrupt0)、定時器0(interrupt1)、外部中斷1(interrupt2)、定時器1(interrupt3)和串口中斷(interrupt4)。*/
  67. void int1() interrupt 2 /*外部中斷1服務(wù)函數(shù),低電平觸發(fā)*//*受遙控中斷影響,不夠時間處理編碼,記錄時間不可以在這函數(shù)里*/
  68. {
  69.         unsigned int i;
  70.         j++;/*編碼位置*/
  71.   if(m==0)/*如果還沒解碼正確*/
  72.           {
  73.       for(i=1;i<13;i++)/*未捕獲間隔碼*/
  74.          {
  75.            r=r<<1;
  76.            if(ir[i]>70&&ir[i]<125)
  77.              {
  78.                      r=r|0x001;
  79.              }
  80.           }
  81.     }
  82.         if(j>12){r=r|0xf000;}/*表示收到符合長度的編碼*/else{r=0x0000;}/*清零*/  
  83.         if(r==0xfd81|r==0xfd82|r==0xfd84|r==0xfd88|r==0xfd90|r==0xfdc3|r==0xfda0|r==0xfdc6)
  84.         {
  85.                 m=r;/*收錄合格編碼*/
  86.         }
  87.         else
  88.         {
  89.                 m=0;
  90.         }
  91.         if(j>12&m==0){j=0;}/*如果大于12位了,編碼還不正確,就把位置清零,防止下一幀亂碼*/
  92. }
  93. void TM1_Isr() interrupt 3 /*定時器1 中斷服務(wù)函數(shù),每約13微秒中斷1次*/{d1++;/*每約13微秒加1*/}
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:796012 發(fā)表于 2023-5-8 09:44 | 只看該作者
歡迎各位黒友一起研究學(xué)習(xí)。
回復(fù)

使用道具 舉報

板凳
ID:1075581 發(fā)表于 2023-5-8 23:14 | 只看該作者
不錯不錯,回去我試試
回復(fù)

使用道具 舉報

地板
ID:85865 發(fā)表于 2023-5-9 08:02 | 只看該作者
紅外解碼程序
回復(fù)

使用道具 舉報

5#
ID:603592 發(fā)表于 2023-5-9 09:45 | 只看該作者
不錯 也做個試試
回復(fù)

使用道具 舉報

6#
ID:1064915 發(fā)表于 2023-5-9 16:04 | 只看該作者
配上原理圖,更完美
回復(fù)

使用道具 舉報

7#
ID:78835 發(fā)表于 2023-5-9 19:29 | 只看該作者
代碼有點亂啊
回復(fù)

使用道具 舉報

8#
ID:409878 發(fā)表于 2023-5-10 09:06 | 只看該作者
代碼學(xué)習(xí)是否規(guī)范?
回復(fù)

使用道具 舉報

9#
ID:796012 發(fā)表于 2023-5-10 11:49 | 只看該作者
回復(fù)

使用道具 舉報

10#
ID:796012 發(fā)表于 2023-5-10 11:50 | 只看該作者
參考原理圖:

回復(fù)

使用道具 舉報

11#
ID:796012 發(fā)表于 2023-5-10 12:26 | 只看該作者
joyb 發(fā)表于 2023-5-9 16:04
配上原理圖,更完美

已上傳原理圖了
回復(fù)

使用道具 舉報

12#
ID:409878 發(fā)表于 2023-5-11 08:37 | 只看該作者
這個不屬于51單片機(jī)?
回復(fù)

使用道具 舉報

13#
ID:796012 發(fā)表于 2023-5-11 10:06 | 只看該作者
suiwinder 發(fā)表于 2023-5-11 08:37
這個不屬于51單片機(jī)?

屬于的呢,是51系列單片機(jī)呀。
回復(fù)

使用道具 舉報

14#
ID:1076852 發(fā)表于 2023-5-11 16:58 | 只看該作者
贊,學(xué)到了
回復(fù)

使用道具 舉報

15#
ID:965189 發(fā)表于 2023-5-11 22:50 | 只看該作者
不一樣的紅外解碼。
回復(fù)

使用道具 舉報

16#
ID:1063563 發(fā)表于 2023-5-12 07:52 | 只看該作者
很不錯的程序謝謝分享
回復(fù)

使用道具 舉報

17#
ID:194654 發(fā)表于 2023-5-12 08:56 | 只看該作者
這個值得學(xué)習(xí),謝謝分享
回復(fù)

使用道具 舉報

18#
ID:1095638 發(fā)表于 2023-10-12 17:27 | 只看該作者
牛逼啊,兄弟
回復(fù)

使用道具 舉報

19#
ID:433219 發(fā)表于 2023-10-14 08:05 | 只看該作者
紅外解碼  哪種b編碼格式? NEC ???
回復(fù)

使用道具 舉報

20#
ID:796012 發(fā)表于 2023-10-15 13:32 | 只看該作者
wkman 發(fā)表于 2023-10-14 08:05
紅外解碼  哪種b編碼格式? NEC ???

風(fēng)扇芯片專用的格式,一開始我也以為是NEC,搞了好久……
回復(fù)

使用道具 舉報

21#
ID:773929 發(fā)表于 2023-10-18 10:15 | 只看該作者
謝謝分享,我最近也寫了一款
回復(fù)

使用道具 舉報

22#
ID:104712 發(fā)表于 2023-12-2 09:16 來自手機(jī) | 只看該作者
玉萌業(yè)余發(fā)展 發(fā)表于 2023-5-8 09:44
歡迎各位黒友一起研究學(xué)習(xí)。

講解一下就好了
回復(fù)

使用道具 舉報

23#
ID:104712 發(fā)表于 2023-12-2 10:28 來自手機(jī) | 只看該作者
  c++;/*計算一下持續(xù)時間*/
   if(c>250){c1++;c=0;}/*超過一定的時間*/
         if(c1>5){j=0;c1=0;}/*就要再次按遙控按鍵*/
         /*如果還有干擾碼就直接清零*/

一次多長時間
回復(fù)

使用道具 舉報

24#
ID:104712 發(fā)表于 2023-12-2 16:26 來自手機(jī) | 只看該作者
玉萌業(yè)余發(fā)展 發(fā)表于 2023-5-8 09:44
歡迎各位黒友一起研究學(xué)習(xí)。

改成51不行
  1. #include "reg52.h"
  2. unsigned char q,b,s,g,xs,ir[13],j,c;unsigned int r,m,d0,d1,value;
  3. unsigned char  code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  4.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/"?0~F??
  5. sbit XP32=P3^2;
  6. sbit LSA=P2^2;
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;
  9. void delay(int i)
  10. {
  11.         while(i--);        
  12. }

  13. void display()
  14. {
  15.         unsigned char i;
  16.                 xs=0;
  17.          if(xs==0)
  18.                 {
  19.                         g=value/1%16;
  20.                         s=value/16%16;
  21.                         b=value/256%16;
  22.                         q=value/4096%16;
  23.                 }
  24.                 for(i=0;i<4;i++)
  25.                 {
  26.                         switch(i)
  27.                         {
  28.                                 
  29.                         case(0):
  30.                                 LSA=0;LSB=0;LSC=0; break;/"??0?
  31.                         case(1):
  32.                                 LSA=1;LSB=0;LSC=0; break;/"??1?
  33.                         case(2):
  34.                                 LSA=0;LSB=1;LSC=0; break;/"??2?
  35.                         case(3):
  36.                                 LSA=1;LSB=1;LSC=0; break;/"??3?
  37.                         }        
  38.                                 if(i==0)
  39.                                 {
  40.                                         P0=smgduan[q];
  41.                                 }
  42.                                 if(i==1)
  43.                                 {
  44.                                         P0=smgduan[b];
  45.                                 }
  46.                                 if(i==2)
  47.                                 {        
  48.                                         P0=smgduan[s];
  49.                                 }
  50.                                 if(i==3)
  51.                                 {
  52.                                         P0=smgduan[g];
  53.                                 }
  54.                         
  55.                                 
  56.                                 //P0=smgduan[i];
  57.                                 delay(100);
  58.                                 P0=0x00;
  59.                         
  60.         }               
  61. }
  62. void ircl()
  63. {
  64.         unsigned char c1;
  65.         if(!XP32)
  66.         {
  67.                         d1=0;
  68.                         TR0=1;
  69.                         while(!XP32);
  70.                         TR0=0;
  71.                         ir[j]=d1;
  72.         }
  73.         
  74.                 if(XP32==1&&j>0)
  75.         {
  76.                         c++;
  77.                         if(c>250){c1++;c=0;}
  78.                         if(c1>5){j=0;c1=0;}
  79.    
  80.         }
  81. }

  82. void main()
  83. {
  84.       
  85.                 TMOD=0x11;
  86.                  
  87.                 TH0=0xFF;
  88.                 TL0=0xF2;
  89.                 TR0=0;
  90.                 ET0=1;
  91.                 xs=0;
  92.         
  93.                 IT0=1;
  94.                 EX0=1;
  95.         EA=1;
  96.         while(1)
  97.         {
  98.                ircl();
  99.                
  100.               
  101.                 display();
  102.         }
  103. }
  104. void int1() interrupt 0
  105. {
  106.         unsigned int i;
  107.         j++;
  108.                 if(m==0)
  109.         {
  110.                         for(i=1;i<13;i++)
  111.                         {
  112.                                 r=r<<1;
  113.                                 if(ir[i]>70&&ir[i]<125)
  114.                                 {
  115.                      r=r|0x001;
  116.                                 }
  117.           }
  118.                 }
  119.       
  120.                
  121.         //        if(r==0xfd81|r==0xfd82|r==0xfd84|r==0xfd88|r==0xfd90|r==0xfdc3|r==0xfda0|r==0xfdc6)
  122.                 if(j>12)
  123.                 {
  124.                 value=r;j=0; m=0;r=0;
  125.         }
  126.       

  127. }
  128. void t0() interrupt 1
  129. {        
  130.         TH0=0xFF;
  131.         TL0=0xF2;
  132.         d1++;
  133. }
  134. //1.085069444444444e-6
復(fù)制代碼
回復(fù)

使用道具 舉報

25#
ID:1103167 發(fā)表于 2023-12-14 17:20 | 只看該作者
希望能學(xué)會單片機(jī)
回復(fù)

使用道具 舉報

26#
ID:21455 發(fā)表于 2023-12-21 16:19 | 只看該作者
希望能學(xué)好單片機(jī)。謝謝分享,同時想得到黑幣
回復(fù)

使用道具 舉報

27#
ID:23844 發(fā)表于 2024-4-25 19:48 | 只看該作者
樓主的程序好象不完整,可否上傳一份壓縮包分享一下。
回復(fù)

使用道具 舉報

28#
ID:11804 發(fā)表于 2024-4-30 14:26 | 只看該作者
樓主的程序不完整,可否上傳一份壓縮包分享一下。
回復(fù)

使用道具 舉報

29#
ID:23303 發(fā)表于 2024-5-3 11:43 | 只看該作者
想學(xué)習(xí)一下,請樓主多幫助,謝謝!
回復(fù)

使用道具 舉報

30#
ID:796012 發(fā)表于 2024-5-5 09:50 | 只看該作者
zkele 發(fā)表于 2024-4-25 19:48
樓主的程序好象不完整,可否上傳一份壓

我還想讓黒友優(yōu)化一下呢
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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