roothoo 发表于 2011-5-4 15:55:06

stc12c5a60s2 RC5解码

电路: STC12C5A60S2 的P3.2(int0) 与红外接收头HS0038的OUT连接

RC5码采用曼切斯特编码,即由高电平向低电平跳变为’0‘, 由低电平向高电平跳变为’1‘

RC5码由
2位前导码(始终为'11'),
一位翻转码(由此位判断是否按键一直按下),
5位地址码(电视机的地址为00000),
6位命令码,(例如音量增加为'0001000')
共同组成,共14位。


解码思路:
HS0038的红外接收头输出信号是输入信号的反码,即1(高电平)代表无信号,0(低电平)代表有信号。
1.当接收到第一位前导码时(由高电平向低电平跳变),触发单片机外部中断(INT0设置为下降沿触发),进入中断服务程序
2.先接收2位的前导码 和 1位的翻转码 ,保存在buffer中,并立即向串口发送
3.然后接收 5 位的地址码,保存在buffer中,并立即向串口发送
4.最后接收 6 位的命令码,保存在buffer中,并立即向串口发送

解码要注意延时的准确性,不同的晶振,不同的单片机,延时不同,所以要根据自己的单片机写出准确的延时函数

代码如下:
//RC5 Dedcoder
#include<stc12c5a60s2.h>
#include<intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LED = P1^7;//红外解码指示灯
sbit IR_IN = P3^2;//外部中断

unsigned char bdata buffer;//接收缓冲区
sbit way0=buffer^0; //每次接收一位,并存放在buffer^7中   

void Delay_ms(unsigned int n)
{ //FOSC=11.0592MHZ
unsigned int i;
        while(n--)
        {
                i = 600;
                while(i--);
        }
}


void Delay(unsigned int temp) //delay 1.25us
{//FOSC=11.0592MHZ
//temp can't be more than 255
       unsigned char i;
      for(i=temp;i>0;i--)
               _nop_();
}

void main()
{
        //设置串口
           TMOD=0x20;//定时器1工作在方式2
       TH1=0xfd;
       TL1=0xfd;//设置波特率为9600

       TR1=1;
       SM0=0;
       SM1=1;//串口设置为方式1
       REN=0;//接收允许
       EA=1; //EA=1,CPU开放中断,EA=0,CPU屏蔽所有中断
       //ES=1;//允许串口中断
       PCON=0x00;    //smod=0
       
        IT0 = 1;//set INT0(P3.2)
        EX0 = 1;

        while (1);
}

void int0() interrupt 0
{
        uchar i;
        EX0 = 0;
        buffer = 0x00;
        Delay(200);Delay(155);//delay 0.25bits time = 445us
        if (!IR_IN)
        {
                LED = 0;//开始解码
                //Delay_ms(4);Delay(200);Delay(155);//delay 2.5bits time = 4ms + 445us
                       
                way0 = 1;         //receive 2 bits '1' and 1 toggle bit
                Delay_ms(1);Delay(200);Delay(100);Delay(200);Delay(12);//delay 1bit time = 1ms + 778us
                buffer = buffer << 1;
                way0 =~IR_IN;
                Delay_ms(1);Delay(200);Delay(100);Delay(200);Delay(12);//delay 1bit time = 1ms + 778us
                buffer = buffer << 1;
                way0 =~IR_IN;
                Delay_ms(1);Delay(200);Delay(100);Delay(200);Delay(12);//delay 1bit time = 1ms + 778us
                TI = 0;
                SBUF = buffer;       
                buffer = 0x00;


                for (i = 0; i < 5; i++)//5 bits address
                {       
                        buffer = buffer<<1;       
                        way0 = ~IR_IN;
                        Delay_ms(1);Delay(200);Delay(100);Delay(200);Delay(12);//delay 1bit time = 1ms + 778us
                }
                TI = 0;
                SBUF = buffer;       
                buffer = 0x00;

                for (i = 0; i < 6; i++)//6 bits command
                {
                        buffer = buffer<<1;
                        way0 = ~IR_IN;       
                        Delay_ms(1);Delay(200);Delay(100);Delay(200);Delay(12);//delay 1bit time = 1ms + 778us
                }
                TI = 0;
                SBUF = buffer;
                buffer = 0x00;

                LED = 1;//结束解码
                Delay_ms(60);
        }
        EX0 = 1;
}

roothoo 发表于 2011-5-4 16:31:58

回复【楼主位】roothoo
-----------------------------------------------------------------------

自己顶啊。。怎么没人回呢

chinasy519 发表于 2012-3-2 10:28:32

正好有rc5编码的遥控器,学习了 谢谢!

xdco 发表于 2012-3-2 22:12:47

make
页: [1]
查看完整版本: stc12c5a60s2 RC5解码