当前位置:文档之家› 红外遥控器接收程序

红外遥控器接收程序

//STC89C52RC
//11.0592MHZ
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define TH0_V ALUE 0xc5
#define TL0_V ALUE 0xc5 // 定时器计数值
#define ANT P2^4 //红外IO口,可任意一个IO
//系统变量定义区============================================================
volatile unsigned char irr_b=0,s_s=0;//irr_b接收状态指示,s_s显示许可
volatile signed long da=0; //32位数据码
volatile unsigned char wb=0, a=0; //wb为接收到的位数,a为接收到信号高低电平判断依据volatile unsigned int js=0; //定时器计数
volatile unsigned char a1=1,a2=1; //上升沿处理变量
void timer_init(void)
{
ET0=0;
TMOD=0x02;
TCON=0x10;
TL0=TL0_VALUE;
TH0=TH0_V ALUE;
ET0=1;
}
void timer_start()
{
TR0=1;
EA=1;
}
void timer0_interrupt(void) interrupt 1 //大约63us中断一次
{
js++;
//判断下降
a2=ANT;
if (a1>a2)
{
if(irr_b==0) //第一个中断
{
irr_b=1; //状态为:开始接收
js=0;
}
else if(irr_b==1) //第二个以后的中断
{
a=js; //读取定时器的值
if((170<a)&&(a<240)) //判断是引导,还是数据10.7ms-15.7ms 引导码长13.5ms
{
wb=0; //数据计数清零
da=0; //数据清零
js=0; //定时器清零
}
else //数据
{
if((8<a)&&(a<25)) //0.5ms-1.57ms 低电平长1.125ms
{
wb++;
js=0;
da=(da<<1) ;
}
else
{
if((25<a)&&(a<45)) //1.57ms-2.8ms 高电平长2.25ms
{
wb++;
js=0;
da=(da<<1) +1 ;
}
}
if(wb>=32) //数据长度够32位
{
irr_b=0; //状态为停止接收
wb=0; //数据计数清零
s_s=1; //打开显示许可
}
}
}
}
a1=a2; //a为两个下降沿之间的时间
}
void program(void)
{
uchar ds=0,d1;
while(1)
{
ds=js;
if(ds>250) //定时器超时,接收复位
{
js=0;
irr_b=0;
da=0;
wb=0;
s_s=0;
}
if(s_s==1) //显示开关打开,开始显示
{
TR0=0; //关闭全局中断
//显示设备码
d1=da>>8;
d1=da; //把long型的da强制转换为char型的d1
switch(d1)
{
case 0xff:P2=0xff;uart_tx(255);break; //停止,灯全灭
case 0x9f:P2=0xfe;uart_tx(191);break; //正转,对应的灯亮
case 0x5f:P2=0xfd;uart_tx(239);break; //反转,对应的灯亮
case 0xaf:P2=0xfb;uart_tx(251);break; //加速,对应的灯亮
case 0x6f:P2=0xf7;uart_tx(254);break; //减速,对应的灯亮
default:break; }
s_s=0; //关闭显示开关
TR0=1; //开全局中断
}
}
}
void delay_ms(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j=0;j<75;j++);
}
}
void uart_init()
{
TMOD|=0X20; //只把M1置为1,其余位不变,默认为0
TH1=0XFD;
TL1=0XFD;
SCON=0X50; // 设定串行口工作方式
PCON&=0XEF; // 波特率不倍增,只把倍增位置0,其他位保持不变,默认为0
TR1=1;
}
void uart_tx(unsigned char txd)
{
SBUF=txd;
while(!TI);
TI=0;
}
void uart_cn(unsigned char *cn,unsigned char cn_nub)
{
unsigned char i;
for(i=0;i<(cn_nub);i++)
{
uart_tx(cn[i]); //发送数据i
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //无实际意义,后移cpu指针,使指令按字对齐,减少取指令时的内存访问次数
}
}
void main()
{
timer_init();
timer_start();
uart_init();
EA=1;
P2=0xf0;
delay_ms(10);
program();
}。

相关主题