标题: 得用stc12c5a60s2片内pca模块的捕获解码红外遥控器 [打印本页]

作者: bayga456    时间: 2017-5-5 19:20
标题: 得用stc12c5a60s2片内pca模块的捕获解码红外遥控器
得用stc12c5a60s2片内pca模块的捕获解码红外遥控器。

20170505191756.jpg (125.83 KB, 下载次数: 219)

20170505191756.jpg

20170505191830.jpg (55.6 KB, 下载次数: 215)

20170505191830.jpg

20170505 PCA_捕获 红外遥控.rar

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


作者: bayga456    时间: 2017-5-5 19:24
程序操作LCD1602都带忙碌标记检测,故不接LCD1602程序会一直停在LCD1602的初始化程序处,在此作提示。
作者: admin    时间: 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黑下载附件…………
复制代码

作者: YQS    时间: 2017-6-21 16:08
关注红外线,正需要这些资料,谢谢楼主分享资源!
作者: A17094430    时间: 2017-12-20 20:47
非常实用的制作,正需要这个
作者: bhjyqjs    时间: 2018-2-7 15:15
思路全新,值得学习
作者: ws1336    时间: 2018-2-9 00:09
不错的想法,又长见识了,我都是用一个外部中断检测下降沿,一个定时器计时两次下降沿时间间隔的,这种方法节省资源,不过只能在有输入捕获的芯片上用
作者: wjx_arduino    时间: 2018-2-18 21:01
回复支持一下,是否可以直接对接收到的红外载波进行学习,不通过接收头解调,这样不就可以实现任意载波频率信号的学习了吗
作者: tcvsdonnie    时间: 2018-12-31 09:57
绝世好贴,顶一个
作者: yuski    时间: 2019-1-24 17:49
谢谢分享 刚好需要
作者: 还有谁?    时间: 2019-2-10 16:57
admin 发表于 2017-5-6 01:01
楼主的源码:

有一点坑,不全!
作者: frank123098    时间: 2019-8-21 17:26
谢谢楼主的资源,正在学习中
作者: frank123098    时间: 2019-8-21 17:27
还有谁? 发表于 2019-2-10 16:57
有一点坑,不全!

可以自己下载,值得学习参考
作者: frank123098    时间: 2019-8-21 17:27
谢谢楼主分享的资源




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1