打印

PIC12F508 红外解码程序(精简版)

[复制链接]
4808|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
erhohen|  楼主 | 2013-10-12 09:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 erhohen 于 2013-10-12 09:24 编辑

#include "pic.h"

#define IR      GP3

#define LED     GP1

#define PWM     GP2

char IR_CODE[4]={0};

void main()
{   
        TRIS=0b00001000;   //设定IR作输入,其余作输出
   
        OPTION=0b00000000;   //利用内部时钟TRM0   
   
        OSCCAL=0b00000000;   //
               
       //LED=1;    目前已经把这个注释掉了,程序正常。
      //但是 如果初始化了这个的话,if(0==LED) PWM=0;  这句就只执行一瞬间;这是为何???!!
   
        while(1)
        {
     //******************************************************红外解码开始*****************
          if(0==IR)
                  {  
                  unsigned int  i,j,n,m;      
                                            i=0;  j=0; n=0;  m=0;
                     
for(i=0;i<9;i++)  //延时882微秒后判断是否出现高电平如果有就退出解码程序,(882us就出现高电平说明是干扰信号)
                           {//重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
                       for(j=0;j<65;j++);// 延时0.882ms  
                            if(1==IR) return;
                          }
  
  //=======以上完成对遥控信号的9ms的初始低电平信号的识别======================

                while(0==IR);//等待高电平避开9毫秒低电平引导脉冲

  //=======延时4.74毫秒避开4.5毫秒的结果码====================================
                    for(j=0;j<351;j++);  //延时         

  //==============到此为止,已跳过13.5ms的引导码=====================

  //===============下面开始解码=====================================
    for(n=0;n<4;n++)
             {
                      for(m=0;m<8;m++)
                                {  
                                           while(0==IR);                              
                                
                                        for(i=0;i<65;i++);// 延时0.882ms
                                          
                                        IR_CODE[n]>>=1;
                        
                                          if(0==IR){                                

IR_CODE[n]=IR_CODE[n]|0x00; }

                                            if(1==IR){  for(i=0;i<74;i++);  //延时1ms
                                       
                               IR_CODE[n]=IR_CODE[n]|0x80;}
                           
                     }
                  
            }
//====解码结束,得到【用户码】【用户反码】【操作码】【操作反码】=====         
     if(0x46==IR_CODE[2]){LED=1;}   //接收的操作码为16进制的46则LED亮
     if(0x15==IR_CODE[2]){LED=0;}   //接收的操作码为16进制的46则LED灭
         
}
//******************************************************红外解码结束*****************     
     
    if(0==LED) PWM=0;    //为什么:如果初始化 “LED=1;” 的话这句会不起作用,或者说起了一瞬间的作用而已
    if(1==LED) PWM=1;         
         
   
}  

}   
沙发
qidaming| | 2013-10-12 10:16 | 只看该作者
代码写的看着好累!

使用特权

评论回复
板凳
xxiao6130| | 2013-10-12 11:12 | 只看该作者
不错啊,有知道了一种解码方法,呵呵,不知道这种方法可不可以接收呢?

使用特权

评论回复
地板
Rain_King| | 2013-10-12 11:27 | 只看该作者
你的代码看得人好累....红外的传送协议其实自己可以定义的....只要时间合适就行...

使用特权

评论回复
5
Rain_King| | 2013-10-12 11:27 | 只看该作者
还有你的延时既然用的软件延时????....这个太不精确了....

使用特权

评论回复
6
erhohen|  楼主 | 2013-10-12 11:29 | 只看该作者
关于这个问题是没问题的,我用安捷伦示波器和逻辑分析仪测试了,时间非常准。 而且遥控部分接收信号非常好。

使用特权

评论回复
7
yewuyi| | 2013-10-12 11:47 | 只看该作者
只能说:楼主呈现了一段自我感觉良好的代码。

从精神上,需要鼓励你。

从事实上,代码质量极为低下。

使用特权

评论回复
8
zhu11bing| | 2013-10-12 15:51 | 只看该作者
有谁能PIC16F84A单片机RC5协议的红外接收程序哦  急用急用啊   哪位仁兄会的麻烦Q 我哟  792876826

使用特权

评论回复
9
erhohen|  楼主 | 2013-10-13 10:06 | 只看该作者
yewuyi 发表于 2013-10-12 11:47
只能说:楼主呈现了一段自我感觉良好的代码。

从精神上,需要鼓励你。

版主能在百忙之中看我的贴,真的很高兴啊。哈哈。 因为我刚玩单片机不久,水平有待提高,而且PIC12F508 这个IC没有外部中断,也没有定时器中断,不怎么好用。 而且有个产品急着要做,所以能用起来就先用了。  不知道有什么方法可以写得效率高点?   。。。。其实这个倒不是重点。目前遇到一个问题是:如果没有初始化LED=1,遥控关了机子之后,这个时候拔掉电源线,然后再接上电源线,机子还是处于关机状态(除非用遥控器再开机)。         但是初始化LED=1了的话,按下遥控关机键,只会有瞬间的LED=0,然后还是LED=1  。

使用特权

评论回复
10
ZG11211| | 2013-10-13 11:17 | 只看该作者
本帖最后由 ZG11211 于 2013-10-13 11:18 编辑

没看到反码校验机制,做产品的话,注意误动作哦。

使用特权

评论回复
11
Rain_King| | 2013-10-14 10:20 | 只看该作者
zhu11bing 发表于 2013-10-12 15:51
有谁能PIC16F84A单片机RC5协议的红外接收程序哦  急用急用啊   哪位仁兄会的麻烦Q 我哟  792876826 ...

这个可以自己写的啊...而且传送协议也不一样啊....不知道你为啥要....

使用特权

评论回复
12
zhaokui11| | 2013-10-16 18:55 | 只看该作者
wo 看看!!

使用特权

评论回复
13
cos12a| | 2013-12-24 12:35 | 只看该作者
建议开设初级区/中级区/高级区,将好的东西分类出来.

使用特权

评论回复
14
erhohen|  楼主 | 2014-2-26 17:20 | 只看该作者
换工作了,好久没来坛子了,问题解决了,把循环里面的那个 return 改为continue就可以了。 这个错误搞得我当时好累啊,我还需要多学

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

44

帖子

1

粉丝