找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机任意IO解码5104红外码

[复制链接]
跳转到指定楼层
楼主
ID:592337 发表于 2023-4-14 17:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. void infrared_5104(void);
  2. void infrared_task(void);

  3. #define        infrared_io        P42

  4. #define        user_code        0x0d

  5. #define        decode_ok        infrared5104_struct.decode_ok
  6. #define        state_old        infrared5104_struct.state_old
  7. #define        wait_rest        infrared5104_struct.wait_rest
  8. #define        bit_num            infrared5104_struct.bit_num

  9. struct{
  10.         unsigned char decode_ok:1;
  11.         unsigned char state_old:1;
  12.         unsigned char wait_rest:1;
  13.         unsigned char bit_num:4;
  14. }infrared5104_struct;

  15. unsigned char infrared_count,infrared_5104_buf;

  16. void infrared_5104(void)
  17. {//置于125us定时器中断中执行
  18.         if(wait_rest)
  19.         {
  20.                 if(infrared_io == 1)
  21.                 {
  22.                         ++infrared_count;
  23.                         if(infrared_count >= 200)
  24.                         {
  25.                                 infrared_count = 0;
  26.                                 bit_num = 0;
  27.                                 wait_rest = 0;
  28.                         }
  29.                 }
  30.                 else
  31.                 {
  32.                         infrared_count = 0;
  33.                 }
  34.                 return;
  35.         }
  36.         if(infrared_io == 0 && infrared_count < 16)
  37.         {
  38.                 infrared_count++;
  39.         }
  40.         if(state_old != infrared_io)
  41.         {
  42.                 state_old = infrared_io;
  43.                 if(state_old == 1)
  44.                 {//判断低电平计数
  45.                         if(infrared_count >= 2 && infrared_count <= 13)
  46.                         {
  47.                                 infrared_5104_buf <<= 1;
  48.                                 infrared_5104_buf &= 0xfe;
  49.                                 if(infrared_count >= 8)
  50.                                 {//bit1
  51.                                         infrared_5104_buf |= 0x01;
  52.                                 }
  53.                                 bit_num++;
  54.                                 if(bit_num == 4)
  55.                                 {
  56.                                         infrared_5104_buf &= 0x0f;
  57.                                         if(infrared_5104_buf != user_code)
  58.                                         {//用户码
  59.                                                 wait_rest = 1;
  60.                                         }
  61.                                 }
  62.                                 else if(bit_num == 12)
  63.                                 {
  64.                                         decode_ok = 1;
  65.                                         wait_rest = 1;
  66.                                 }
  67.                         }
  68.                         else
  69.                         {
  70.                                 wait_rest = 1;
  71.                         }
  72.                 }
  73.                 infrared_count = 0;
  74.         }
  75. }

  76. void infrared_task(void)
  77. {
  78.         if(decode_ok)
  79.         {
  80.                 decode_ok = 0;
  81.         }
  82. }


复制代码


评分

参与人数 1黑币 +12 收起 理由
17740048467 + 12 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:255559 发表于 2023-4-15 08:42 | 只看该作者
以前用过5204解码,想学习一下这个程序,是不是代码不全?
回复

使用道具 举报

板凳
ID:592337 发表于 2023-4-26 11:28 | 只看该作者
hurbocn 发表于 2023-4-15 08:42
以前用过5204解码,想学习一下这个程序,是不是代码不全?

这就是全部代码。因为我这边经常用那种OTP的1K,空间跟RAM很少,所以才写了这个。能达到解码需求,同时耗费的资源尽量少即可。总共用了3个RAM。但是这种写法会略微多点ROM。如果RAM足够就可以把结构体里那些变量换成全局变量,这样占用ROM就会减少,占用CPU时间也更少。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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