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
-----------------------------------------------------------------------
自己顶啊。。怎么没人回呢 正好有rc5编码的遥控器,学习了 谢谢! make
页:
[1]