找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2529|回复: 29
打印 上一主题 下一主题
收起左侧

遥控风扇芯片BA5104 STC8G1K08-TSSOP20单片机四位共阴数码管 红外解码程序

  [复制链接]
回帖奖励 100 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
  1. /*风扇遥控芯片:BA5104  红外遥控解码程序  晶振频率:11.0592MHZ  1帧12位,一次至少发2帧*//*历时8天成功调试,干扰码直接清零,只显示相关键值*/
  2. /*解码后的键值:关机 0xfd81; 开/风速 0xfd82; 风类 0xfd84; 定时 0xfd88; 摇头 0xfd90; 彩灯 0xfdc3; 无 0xfda0; 无 0xfdc6*/
  3. #include "STC8G.h"/*单片机: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--);}/*延时函数*/
  7. void int1init(){IT1=1;EX1=1;EA=1;}/*外部中断1初始化函数,设置成下降沿触发*/
  8. void d1r1Init()/*定时器1初始化函数*/{AUXR |= 0x40;/*1T*/TMOD &= 0x0F;TL1 = 0x70;/*初始值*/TH1 = 0xFF;/*初始值*/TF1 = 0;/*清除TF1标志*/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;/*软件复位,并且从用户程序开始执行*/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()/*数码管扫描*/
  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)/*当端口高电平时,编码位置还未清零*/
  36.         {
  37.     c++;/*计算一下持续时间*/
  38.    if(c>250){c1++;c=0;}/*超过一定的时间*/
  39.          if(c1>5){j=0;c1=0;}/*就要再次按遥控按键*/
  40.          /*如果还有干扰码就直接清零*/
  41.         }
  42. }
  43. void xssz() /*显示的数值*/
  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进制,16倍表示8位16进制,256倍表示12位16进制,4096倍表示16位16进制*/
  47.         /*按K2显示0表示编码位置清零成功*/
  48.         if(xs==1){g=c%10;s=c/10%10;b=c/100%10;q=0;}
  49.         /*按K3显示大约中断次数和快速清零*/
  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);/*等待电源稳定*/
  57.         int1init();/*外部中断1初始化*/
  58.         while(1)
  59.         {
  60.                 ircl();
  61.                 kayscan();
  62.                 xssz();
  63.                 display();
  64.         }
  65. }
  66. /*传统51单片机具有5个中断源,中断优先级从高到低依次是:外部中断0(interrupt0)、定时器0(interrupt1)、外部中断1(interrupt2)、定时器1(interrupt3)和串口中断(interrupt4)。*/
  67. void int1() interrupt 2 /*外部中断1服务函数,低电平触发*//*受遥控中断影响,不够时间处理编码,记录时间不可以在这函数里*/
  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 中断服务函数,每约13微秒中断1次*/{d1++;/*每约13微秒加1*/}
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:796012 发表于 2023-5-8 09:44 | 只看该作者
欢迎各位黒友一起研究学习。
回复

使用道具 举报

板凳
ID:1075581 发表于 2023-5-8 23:14 | 只看该作者
不错不错,回去我试试
回复

使用道具 举报

地板
ID:85865 发表于 2023-5-9 08:02 | 只看该作者
红外解码程序
回复

使用道具 举报

5#
ID:603592 发表于 2023-5-9 09:45 | 只看该作者
不错 也做个试试
回复

使用道具 举报

6#
ID:1064915 发表于 2023-5-9 16:04 | 只看该作者
配上原理图,更完美
回复

使用道具 举报

7#
ID:78835 发表于 2023-5-9 19:29 | 只看该作者
代码有点乱啊
回复

使用道具 举报

8#
ID:409878 发表于 2023-5-10 09:06 | 只看该作者
代码学习是否规范?
回复

使用道具 举报

9#
ID:796012 发表于 2023-5-10 11:49 | 只看该作者
回复

使用道具 举报

10#
ID:796012 发表于 2023-5-10 11:50 | 只看该作者
参考原理图:

回复

使用道具 举报

11#
ID:796012 发表于 2023-5-10 12:26 | 只看该作者
joyb 发表于 2023-5-9 16:04
配上原理图,更完美

已上传原理图了
回复

使用道具 举报

12#
ID:409878 发表于 2023-5-11 08:37 | 只看该作者
这个不属于51单片机?
回复

使用道具 举报

13#
ID:796012 发表于 2023-5-11 10:06 | 只看该作者
suiwinder 发表于 2023-5-11 08:37
这个不属于51单片机?

属于的呢,是51系列单片机呀。
回复

使用道具 举报

14#
ID:1076852 发表于 2023-5-11 16:58 | 只看该作者
赞,学到了
回复

使用道具 举报

15#
ID:965189 发表于 2023-5-11 22:50 | 只看该作者
不一样的红外解码。
回复

使用道具 举报

16#
ID:1063563 发表于 2023-5-12 07:52 | 只看该作者
很不错的程序谢谢分享
回复

使用道具 举报

17#
ID:194654 发表于 2023-5-12 08:56 | 只看该作者
这个值得学习,谢谢分享
回复

使用道具 举报

18#
ID:1095638 发表于 2023-10-12 17:27 | 只看该作者
牛逼啊,兄弟
回复

使用道具 举报

19#
ID:433219 发表于 2023-10-14 08:05 | 只看该作者
红外解码  哪种b编码格式? NEC ???
回复

使用道具 举报

20#
ID:796012 发表于 2023-10-15 13:32 | 只看该作者
wkman 发表于 2023-10-14 08:05
红外解码  哪种b编码格式? NEC ???

风扇芯片专用的格式,一开始我也以为是NEC,搞了好久……
回复

使用道具 举报

21#
ID:773929 发表于 2023-10-18 10:15 | 只看该作者
谢谢分享,我最近也写了一款
回复

使用道具 举报

22#
ID:104712 发表于 2023-12-2 09:16 来自手机 | 只看该作者
玉萌业余发展 发表于 2023-5-8 09:44
欢迎各位黒友一起研究学习。

讲解一下就好了
回复

使用道具 举报

23#
ID:104712 发表于 2023-12-2 10:28 来自手机 | 只看该作者
  c++;/*计算一下持续时间*/
   if(c>250){c1++;c=0;}/*超过一定的时间*/
         if(c1>5){j=0;c1=0;}/*就要再次按遥控按键*/
         /*如果还有干扰码就直接清零*/

一次多长时间
回复

使用道具 举报

24#
ID:104712 发表于 2023-12-2 16:26 来自手机 | 只看该作者
玉萌业余发展 发表于 2023-5-8 09:44
欢迎各位黒友一起研究学习。

改成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
复制代码
回复

使用道具 举报

25#
ID:1103167 发表于 2023-12-14 17:20 | 只看该作者
希望能学会单片机
回复

使用道具 举报

26#
ID:21455 发表于 2023-12-21 16:19 | 只看该作者
希望能学好单片机。谢谢分享,同时想得到黑币
回复

使用道具 举报

27#
ID:23844 发表于 2024-4-25 19:48 | 只看该作者
楼主的程序好象不完整,可否上传一份压缩包分享一下。
回复

使用道具 举报

28#
ID:11804 发表于 2024-4-30 14:26 | 只看该作者
楼主的程序不完整,可否上传一份压缩包分享一下。
回复

使用道具 举报

29#
ID:23303 发表于 2024-5-3 11:43 | 只看该作者
想学习一下,请楼主多帮助,谢谢!
回复

使用道具 举报

30#
ID:796012 发表于 2024-5-5 09:50 | 只看该作者
zkele 发表于 2024-4-25 19:48
楼主的程序好象不完整,可否上传一份压

我还想让黒友优化一下呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表