找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4634|回复: 5
收起左侧

单片机红外解码,短按开关灯,长按调光,数码管显示键值 源程序

  [复制链接]
ID:140489 发表于 2020-9-2 15:32 | 显示全部楼层 |阅读模式
//红外解码,实验板测试正常,8位数码管显示遥控编码(用户码,用户反码,右边3位数码管显示PWM值),
//两片74hc573驱动8位共阴数码管
//CH-键短按开关灯,+键长按调光,数码管显示键值;长按调光的解码程序目前网上很难找到,我琢磨了很久才把程序调通//压缩包里有完整的程序代码,有逻辑分析仪测试的连发码的波形
遥控器键值图.png aaa.jpg
单片机源程序如下:
  1. #include "INC\STC89C52RC.H"
  2. #include "INC\MY_SET.H"
  3. #include "INC\IR_NEC.H"                   //调用NEC解码头文件


  4. #define DIGI_PORT P0 // 宏定义数码管端口,如果端口改变,只需修改这一句即可
  5. #define DIGI_NUM 8 // 宏定义数码管个数
  6. unsigned char digiBuf[DIGI_NUM]; //数码管缓冲区
  7. sfr   SE   = 0x80;             //数码管段选 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; //开关灯标志
  13. uint8 flag1;//调光方向标志
  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}; //数码管段码  共阴不带小数点段码

  19. void KZ0();      //短按处理
  20. //void KZ1();      //长按处理


  21. /***************** 主函数 ********************/
  22. void main(void)
  23. {
  24.         IR_Init();                           //红外线解码初始化
  25.         while(1)
  26.         {
  27.           //遥控检测
  28.                    if(IR_BT==2)
  29.                 {
  30.                          KZ0();                //短按处理
  31.                         IR_BT =0;        //清有效标志
  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;   //数据码
  38.         //                digiBuf[5]  = NEC[2]%16;
  39.         //                digiBuf[6]  = NEC[3]/16;   //数据反码
  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 )                //长按调光,松手停止调光
  48.                 {        
  49.                         
  50.                         switch(NEC[2])
  51.                         {                                                                                  //长按接收的是连发码,97.11ms高电平,10.15ms低电平
  52.                                 case 0x15:        if(IR==1)                                     //if(IR==0)
  53.                                                         {
  54.                                                                 KeyUpDownFlag=1;        //如果按键抬起,松手标志置1
  55.                                                         }         
  56.                                 
  57.                                                         if(flag1==1 && flag==0)           // 开灯状态 +键 长按连加          亮度加
  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)   //开灯状态  +键 长按连减         亮度 减
  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;                  //关灯
  112.                 }

  113.          
  114.         }

  115. }
复制代码


全部资料51hei下载地址:
红外线NEC解码(任意脚接收,短按开关,长按调光).rar (329.78 KB, 下载次数: 191)

评分

参与人数 2黑币 +65 收起 理由
digger63 + 15 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:964280 发表于 2021-9-10 10:55 | 显示全部楼层
很好,希望可以用到
回复

使用道具 举报

ID:965189 发表于 2021-11-27 10:04 | 显示全部楼层
希望能正常解码。
回复

使用道具 举报

ID:543220 发表于 2021-12-17 18:00 | 显示全部楼层
我想问下 为啥IR判断等于1,就是红外遥控按键抬起呢?
回复

使用道具 举报

ID:543220 发表于 2021-12-17 18:01 | 显示全部楼层
你好 我想问下 为啥是IR=1 表示红外按键抬起呢
回复

使用道具 举报

ID:140489 发表于 2021-12-29 16:47 | 显示全部楼层
a2748446 发表于 2021-12-17 18:01
你好 我想问下 为啥是IR=1 表示红外按键抬起呢

接收头没有接收到红外光时,输出端是高电平
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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