红外遥控器接收程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//STC89C52RC

//11.0592MHZ

#include

#include

#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

{

wb=0; //数据计数清零

da=0; //数据清零

js=0; //定时器清零

}

else //数据

{

if((8

{

wb++;

js=0;

da=(da<<1) ;

}

else

{

if((25

{

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_();

相关文档
最新文档