找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7610|回复: 13
收起左侧

得用stc12c5a60s2片内pca模块的捕获解码红外遥控器

  [复制链接]
ID:162136 发表于 2017-5-5 19:20 | 显示全部楼层 |阅读模式
得用stc12c5a60s2片内pca模块的捕获解码红外遥控器。
20170505191756.jpg
20170505191830.jpg

20170505 PCA_捕获 红外遥控.rar

25.21 KB, 下载次数: 148, 下载积分: 黑币 -5

评分

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

查看全部评分

回复

使用道具 举报

ID:162136 发表于 2017-5-5 19:24 | 显示全部楼层
程序操作LCD1602都带忙碌标记检测,故不接LCD1602程序会一直停在LCD1602的初始化程序处,在此作提示。
回复

使用道具 举报

ID:1 发表于 2017-5-6 01:01 | 显示全部楼层
楼主的源码:
  1. /*STC12C5A60S2 PCA模块捕获模式接收红外遥控和解码在显示在LCD1602上,
  2.   P1^3为捕获输入引脚,接红外接收传感器。普中(HC6800 V3.2)开发箱测试成功*/
  3. #include<stc12c5a60s2.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit Lcd_RS=P2^6;                                        //LCD数据/命令选择端(H/L)
  7. sbit Lcd_RW=P2^5;                                        //LCD读/写选择端(H/L)//
  8. sbit Lcd_EN=P2^7;                                        //lcd使能端(lcd读命令时=H,lcd写命令时=高脉冲)
  9. sbit Lcd_PSB=P3^2;                                        //并口串口选择
  10. sbit Lcd_BF=P0^7;                                        //LCD忙碌端

  11. code uchar TABLE[]="0123456789ABCDEF";                //LCD显示用的数字
  12. uchar IR[33];                                                                //红外接收捕获的数据
  13. uchar IR_i=0;                                                                //红外捕获次数记录
  14. bit F_IR=0;                                                                        //红外捕获起始标记位                                         

  15. void delay(uint xms)                                                //延时函数约(x)ms
  16. {
  17.         uint i;
  18.         for(;xms>0;xms--)
  19.                 for(i=920;i>0;i--);
  20. }
  21. void lcd_read_bf()                                                        //读忙碌标志
  22. {
  23.         P0=0xff;
  24.         Lcd_RS=0;
  25.         Lcd_RW=1;
  26.         Lcd_EN=1;
  27.         while(Lcd_BF);
  28.         Lcd_EN=0;
  29. }
  30. void lcd_write_cmd(uchar cmd)                                //写命令
  31. {
  32.         lcd_read_bf();
  33.         Lcd_RS=0;                                                                //选择写命令方式
  34.         Lcd_RW=0;
  35.         P0=cmd;                                                                        //将要写入的命令数据送到数据总线上
  36.         Lcd_EN=1;                                                                //给使能端1高脉冲,先置1
  37.         Lcd_EN=0;                                                                //再置0,以完成高脉冲
  38. }
  39. void lcd_write_dat(uchar dat)                                //写数据
  40. {
  41.         lcd_read_bf();
  42.         Lcd_RS=1;                                                                //选择写数据方式
  43.         Lcd_RW=0;
  44.         P0=dat;                                                                //将要写入的命令数据送到数据总线上
  45.         Lcd_EN=1;                                                                //给使能端1高脉冲,先置1
  46.         Lcd_EN=0;                                                                //再置0,以完成高脉冲
  47. }
  48. void lcd_init()                                                                //LCD初始化
  49. {
  50.         Lcd_PSB=1;                                                //串口
  51.         P2&=0xff-0x80-0x20;                                //并口端口初始化
  52.         lcd_write_cmd(0x38);
  53.         lcd_write_cmd(0x06);
  54.         lcd_write_cmd(0x0c);
  55.         lcd_write_cmd(0x01);
  56. }
  57. void pca_init()                                                                //PCA模块初始化 设置成捕获模式
  58. {
  59.         CMOD=0x00;                                //PCA计数器模式寄存器
  60.         CCAPM0=0x11;                        //PCA比较/捕获工作模式寄存器
  61.         CL=0x00;                                //PCA计数寄存器的低8位
  62.         CH=0x00;
  63. //        CCAP0L=0x00;                        //捕获寄存器低8位,当PCA模块用于PWM模式时,用来控制输出的占空比
  64. //        CCAP0H=0x00;                        //当CH&L=CCAPnH&L时输出高电平,故CCAPnH&L越大,输出高电平时间越短
  65.         CCON=0x01;                                //PCA控制寄存器 CR=1
  66.         EA=1;
  67. }
  68. void init()                                                                        //系统初始化
  69. {
  70.         lcd_init();
  71.         pca_init();
  72. }
  73. void out_lcd()                                                                //LCD显示
  74. {
  75.         uchar i,num1,num2,num3,num4,nums;
  76.         for(i=0;i<8;i++)
  77.         {
  78.                 num1>>=1;
  79.                 if(IR[i]>0x06) num1|=0x80;
  80.         }
  81.         for(i=8;i<16;i++)
  82.         {
  83.                 num2>>=1;
  84.                 if(IR[i]>0x06) num2|=0x80;
  85.         }
  86.         for(i=16;i<24;i++)
  87.         {
  88.                 num3>>=1;
  89.                 if(IR[i]>0x06) num3|=0x80;
  90.         }
  91.         for(i=24;i<32;i++)
  92.         {
  93.                 num4>>=1;
  94.                 if(IR[i]>0x06) num4|=0x80;
  95.         }
  96.         nums=IR[32];
  97.         lcd_write_cmd(0x80);
  98.         lcd_write_dat(TABLE[num1>>4]);
  99.         lcd_write_dat(TABLE[num1&0x0f]);
  100.         lcd_write_dat(' ');
  101.         lcd_write_dat(TABLE[num2>>4]);
  102.         lcd_write_dat(TABLE[num2&0x0f]);
  103.         lcd_write_dat(' ');
  104.         lcd_write_dat(TABLE[num3>>4]);
  105.         lcd_write_dat(TABLE[num3&0x0f]);
  106.         lcd_write_dat(' ');
  107.         lcd_write_dat(TABLE[num4>>4]);
  108.         lcd_write_dat(TABLE[num4&0x0f]);
  109.         lcd_write_dat(' ');
  110.         lcd_write_dat(TABLE[nums>>4]);
  111.         lcd_write_dat(TABLE[nums&0x0f]);
  112.         lcd_write_cmd(0xc0);
  113.         if(num1==0x00&&num2==0xff&&(num3|num4)==0xff)
  114.         {
  115.                 lcd_write_dat('y');
  116.                 lcd_write_dat('e');
  117.                 lcd_write_dat('s');
  118.                 lcd_write_dat(' ');
  119.                 lcd_write_dat('0');
  120.                 lcd_write_dat('x');
  121.                 lcd_write_dat(TABLE[num3>>4]);
  122.                 lcd_write_dat(TABLE[num3&0x0f]);
  123.         }
  124.         else
  125.         {
  126.                 lcd_write_dat('n');
  127.                 lcd_write_dat('o');
  128.                 lcd_write_dat(' ');
  129.                 lcd_write_dat(' ');
  130.                 lcd_write_dat(' ');
  131.                 lcd_write_dat(' ');
  132.                 lcd_write_dat(' ');
  133.                 lcd_write_dat(' ');
  134.                 lcd_write_dat(' ');
  135.                 lcd_write_dat(' ');
  136.         }
  137.         if(nums>2)
  138.         {
  139.                 lcd_write_dat(' ');
  140.                 lcd_write_dat('s');
  141.                 lcd_write_dat('s');
  142.         }
  143.         else
  144.         {
  145.                 lcd_write_dat(' ');
  146.                 lcd_write_dat(' ');
  147.                 lcd_write_dat(' ');
  148.         }
  149. }
  150. void main()                                                                        //主程序
  151. {
  152.         delay(100);
  153.         init();
  154.         delay(100);
  155.         while(1)
  156.         {
  157.                 out_lcd();
  158.                 delay(100);                                                        //刷新显示的间隔时间
  159.         }
  160. }
  161. void pca_()interrupt 7                                                //PCA中断入口
  162. {
  163.         if(CF)                                                                        //PCA计数器中断复位
  164.         {
  165.                 CF=0;
  166.                 IR_i=0;
  167.         }
  168.         if(CCF0)                                                                //捕获中断处理捕获的时间
  169.         {                  
  170.                 CR=1;
  171.                 CCF0=0;
  172.                 if(F_IR)
  173.                 {
  174.                         IR[IR_i++]=CCAP0H;                                        //保存捕获的时间(这里只要高8位即可)
  175.                         if(IR_i>=32)                                                //捕获到32个时间数据后复位等下一个起始信号                                               
  176.                         {
  177.                                 F_IR=0;
  178.                                 IR_i=0;
  179.                         }
  180.                 }
  181.                 else

  182. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
回复

使用道具 举报

ID:167337 发表于 2017-6-21 16:08 | 显示全部楼层
关注红外线,正需要这些资料,谢谢楼主分享资源!
回复

使用道具 举报

ID:183763 发表于 2017-12-20 20:47 | 显示全部楼层
非常实用的制作,正需要这个
回复

使用道具 举报

ID:66287 发表于 2018-2-7 15:15 | 显示全部楼层
思路全新,值得学习
回复

使用道具 举报

ID:280994 发表于 2018-2-9 00:09 | 显示全部楼层
不错的想法,又长见识了,我都是用一个外部中断检测下降沿,一个定时器计时两次下降沿时间间隔的,这种方法节省资源,不过只能在有输入捕获的芯片上用
回复

使用道具 举报

ID:262047 发表于 2018-2-18 21:01 | 显示全部楼层
回复支持一下,是否可以直接对接收到的红外载波进行学习,不通过接收头解调,这样不就可以实现任意载波频率信号的学习了吗
回复

使用道具 举报

ID:458859 发表于 2018-12-31 09:57 | 显示全部楼层
绝世好贴,顶一个
回复

使用道具 举报

ID:471147 发表于 2019-1-24 17:49 | 显示全部楼层
谢谢分享 刚好需要
回复

使用道具 举报

ID:475247 发表于 2019-2-10 16:57 | 显示全部楼层

有一点坑,不全!

评分

参与人数 1黑币 +10 收起 理由
就你**** + 10

查看全部评分

回复

使用道具 举报

ID:258210 发表于 2019-8-21 17:26 | 显示全部楼层
谢谢楼主的资源,正在学习中
回复

使用道具 举报

ID:258210 发表于 2019-8-21 17:27 | 显示全部楼层

可以自己下载,值得学习参考
回复

使用道具 举报

ID:258210 发表于 2019-8-21 17:27 | 显示全部楼层
谢谢楼主分享的资源
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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