html5红外遥控,自己写的单片机万能红外遥控解码

/****************************************************

家用遥控器通用解码程序

原理和录音机一样只不过这里录的是高低电平的脉宽,注意家用遥控器一般是38KHZ的脉冲接收头所以为了

发射方便所以单片机使用了455KHZ晶振(旧遥控里拆一个),最好不要自己用定时器溢出来输出38KHZ的方波

我自己试了N种中断或延时的方法都没成功,因为没有示波器也找不到究竟是神马问题最后还是靠拆一个455晶振

才解决问题,自己家里的机顶盒和电视遥控都成功解码

*****************************************************/

#include"STC12C5A60S2.H"//STC12C5AxxS2系列单片机头文件

#define uchar unsigned char//宏定义

#define uint unsigned int//宏定义

sbit Rc=P3^2;

sbit LED_zs=P0^0;

sbit LED_zs1=P0^1;

sbit Key_s=P1^0;

sbit Key_f=P1^1;

sbit red=P0^2;

int i=0;

int TCC=0;

int xdata Hdate [46];

int xdata Ldate [46];

void Delay(uint ms)//延时子程序

{

uint x,y;

for(x=ms;x>0;x--)

for(y=0;y<12;y++);

}

void Delay1(uint ms)//延时子程序

{

uint x,y;

for(x=ms;x>0;x--)

for(y=0;y<2400;y++);

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:定时/计数器初始化函数

调 用:T_C_init();

参 数:无

返回值:无

结 果:设置SFR中T/C1和(或)T/C0相关参数

备 注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽

/**********************************************************************************************/

void T_C_init (void){

TMOD = 0x01; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]

TH0 = 0xfe; //16位计数寄存器T0高8位

TL0 = 0x0c; //16位计数寄存器T0低8位(100uS延时)

TR0 = 1; //T/C0启动开关

ET0 = 1; //T/C0中断开关

EA = 1; //中断总开关

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:定时/计数器0中断处理函数

调 用:[T/C0溢出后中断处理]

参 数:无

返回值:无

结 果:重新写入16位计数寄存器初始值,处理用户程序

备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致

/**********************************************************************************************/

void T_C0 (void) interrupt 1 using 1{ //切换寄存器组到1

TH0 = 0xfe; //16位计数寄存器T0高8位(重新写入初值)

TL0 = 0x0c; //16位计数寄存器T0低8位(100uS延时)

//函数内容

TCC++;

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:UART串口初始化函数

调 用:UART_init();

参 数:无

返回值:无

结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)

备 注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]

/**********************************************************************************************/

void UART_init (void){

//EA = 1; //允许总中断(如不使用中断,可用//屏蔽)

//ES = 1; //允许UART串口的中断

TMOD = 0x20; //定时器T/C1工作方式2

SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)

TH1 = 0xF3; //定时器初值高8位设置

TL1 = 0xF3; //定时器初值低8位设置

PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)

TR1 = 1; //定时器启动

}

/**********************************************************************************************/

/*********************************************************************************************

函数名:外部中断INT初始化函数

调 用:INT_init();

参 数:无

返回值:无

结 果:启动外部中断INT1、INT0中断,设置中断方式

备 注:

/**********************************************************************************************/

void INT_init (void){

EA = 1; //中断总开关

//EX0 = 1; //允许外部中断0中断

IT0 = 1; //1:下沿触发 0:低电平触发

}

void INT_0 (void) interrupt 0 using 2{ //切换寄存器组到2

EX0 = 0; //允许外部中断0中断

//用户函数内容

for(i=0;i<46;i++)

{

//获取低电平宽度

TH0 = 0xfe; //16位计数寄存器T0高8位

TL0 = 0x0c; //16位计数寄存器T0低8位(100uS延时)

TCC=0;

TR0 = 1; //T/C0启动开关

while(Rc==0);

TR0=0;

Ldate[i]=TCC;

//获取高电平宽度

TH0 = 0xfe; //16位计数寄存器T0高8位

TL0 = 0x0c; //16位计数寄存器T0低8位(100uS延时)

TCC=0;

TR0 = 1; //T/C0启动开关

while(Rc==1);

TR0=0;

Hdate[i]=TCC;

}

LED_zs=0;

Delay1(100);

LED_zs=1;

Delay1(100);

LED_zs=1;

Delay1(300);

LED_zs1=0;

}

void fs(void)

{

int fs;

for(fs=0;fs<46;fs++)

{

TH0 = 0xfe; //16位计数寄存器T0高8位

TL0 = 0x0c; //16位计数寄存器T0低8位(100uS延时)

TCC=0;

TR0 = 1; //T/C0启动开关

while(TCC

TR0=0;

TH0 = 0xfe; //16位计数寄存器T0高8位

TL0 = 0x0c; //16位计数寄存器T0低8位(100uS延时)

TCC=0;

TR0 = 1; //T/C0启动开关

while(TCC

TR0=0;

}

}

void main (void){

int n;

IP=0x02;

T_C_init();

INT_init();

UART_init();

LED_zs=1;

LED_zs1=0;

red=0;

while(1)

{

Key_f=1;

if( Key_f!=1)

{

Delay1(2);

Key_f=1;

if(Key_f!=1)

{

for(n=0;n<46;n++)

{

SBUF = Ldate[n]; //将接收的数据发送回去

while(TI == 0); //检查发送中断标志位

TI = 0;

}

for(n=0;n<46;n++)

{

SBUF = Hdate[n]; //将接收的数据发送回去

while(TI == 0); //检查发送中断标志位

TI = 0;

}

while(!Key_f){fs();Delay1(100);}

}

}

Key_s=1;

if(Key_s!=1)

{

Delay1(2);

if(Key_s!=1)

{

EX0=1;

LED_zs1=1;

while(!Key_s);

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值