×
单片机 > 单片机程序设计 > 详情

51单片机红外接收代码加解码

发布时间:2020-08-21 发布时间:
|

头文件 stc12c5a.h下载: http://www.51hei.com/mcu/2564.html 

头文件 1602.h 下载: http://www.51hei.com/bbs/dpj-24671-1.html 

  ///*redPC838.c文件

* 红外接收数据,中断方式,并通过串口发送

* 晶振:11.0592M*/

#include

#include<1602.h>

typedef unsigned char uint8;

sbit Ir_Pin = P3^3;

uint8 Ir_Buf[4]; //用于保存解码结果

extern int keynum=1;

void int1_init(void)

{

IT1 = 1; //下降沿有效

EX1 = 1;

EA = 1;

TMOD = 0x01;

}

/*获取低电平时间*/

unsigned int Ir_Get_Low()

{

TL0 = 0;

TH0 = 0;

TR0 = 1;

while (!Ir_Pin && (TH0&0x80)==0);  

              

TR0 = 0;           

return (TH0 * 256 + TL0);

}

/* 获取高电平时间*/

unsigned int Ir_Get_High()

{

TL0 = 0;

TH0 = 0;

TR0 = 1;

while (Ir_Pin && (TH0&0x80)==0);

TR0 = 0;

return (TH0 * 256 + TL0);

}

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

void PC838()

{ int1_init();

}

void int1_isr() interrupt 2

{

unsigned int temp;

char i,j;

temp = Ir_Get_Low();

if ((temp < 7833) || (temp > 8755))  //引导脉冲低电平8500~9500us

return;

temp = Ir_Get_High();

if ((temp < 3686) || (temp > 4608))  //引导脉冲高电平4000~5000us

return;

for (i=0; i<4; i++) //4个字节

{

for (j=0; j<8; j++) //每个字节8位

{

temp = Ir_Get_Low();

if ((temp < 184) || (temp > 737)) //200~800us

return;

temp = Ir_Get_High();

if ((temp < 184) || (temp > 1843)) //200~2000us

return;

Ir_Buf[ i] >>= 1;

if (temp > 1032) //1120us

Ir_Buf[ i] |= 0x80;

}

}

if( Ir_Buf[2]=~ Ir_Buf[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码

{

if(Ir_Buf[2]==0x16)  keynum=0; //a[0]=00h;a[1]=ffh

if(Ir_Buf[2]==0x0c)  keynum=1; //a[0]=00h;a[1]=ffh

if(Ir_Buf[2]==0x18)  keynum=2; //a[0]=00h;a[1]=ffh

if(Ir_Buf[2]==0x5E)  keynum=3;

if(Ir_Buf[2]==0x08)  keynum=4;

if(Ir_Buf[2]==0x1C)  keynum=5;

if(Ir_Buf[2]==0x5A)  keynum=6;

if(Ir_Buf[2]==0x42)  keynum=7;

if(Ir_Buf[2]==0x52)  keynum=8;

if(Ir_Buf[2]==0x4A)  keynum=9;

if(Ir_Buf[2]==0x45)  keynum=10; //ON/OFF

if(Ir_Buf[2]==0x46)  keynum=11; //MODE

if(Ir_Buf[2]==0x47)  keynum=12; //静音

if(Ir_Buf[2]==0x44)  keynum=13; //暂停

if(Ir_Buf[2]==0x40)  keynum=14; //下一曲

if(Ir_Buf[2]==0x43)  keynum=15; //上一曲

if(Ir_Buf[2]==0x07)  keynum=16; //EQ

if(Ir_Buf[2]==0x15)  keynum=17; //VOL-

if(Ir_Buf[2]==0x09)  keynum=18; //VOL+

if(Ir_Buf[2]==0x19)  keynum=19; //RPT

if(Ir_Buf[2]==0x0D)  keynum=20; //U/SD

  //  beep();        //蜂鸣器响一声 提示解码成功




}


}

//******************8redPC838.h文件

#ifndef _redPC838_

#define _redPC838_

#define uchar unsigned char

#define uint  unsigned int

void PC838();

extern int keynum;

#endif 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计