医疗电子技术网|技术阅读
登录|注册

您现在的位置是:医疗电子技术网 > 技术阅读 > 51单片机红外解码程序

51单片机红外解码程序

广告

51单片机红外解码程序,解释的很详细,很适合初学者,这两天刚好用到,特来分享。


#include

#include


// 函数原型

void SystemInit(void);

void Delay_840us(void);

void Delay_2400us(void);

void LedDisp();

unsigned char GetCode(void);//获得码

voiddelay(unsigned char loop);


// 位变量

sbit IRIN = P3^2;

sbit BEEP = P1^6;

sbit swch = P1^7;


// 变量

unsigned char KeyValue; //机器码

unsigned char MaValue;  //键值码;

unsigned char disbuf[4];  //数码管显示缓冲

unsigned char scan[4]={0x04,0x08,0x10,0x20}; //p2位选择

unsigned char code table[16] = //共陰碼

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};


/**

* 延时

*/

void delay(unsigned char loop)

{

unsigned char i;

for(i=0;i>8);

TR1=1;

while(!TF1);

TF1=0;

TR1=0;

}


/**

* 延时9ms

*/

void Delay_9000us(void)

{

TL1 = 153.6;

TH1 = 223.6;

TR1 = 1;

while(!TF1);

TF1 = 0;

TR1 = 0;

}


/**

* 延时4.5ms

*/

void Delay_4500us(void)

{

TH1 = 239.8;

TL1 = 204.8;

TR1 = 1;

while(!TF1);

TF1 = 0;

TR1 = 0;

}


/**

*系统初始化

*/

void SystemInit(void)

{

IRIN = 1;

IT0 = 1;   //INT0负跳变触发

TMOD = 0x10; //定时器1工作在方式1

EA = 1;

EX0 = 1;

}


/**

* 读码

*/

unsigned char GetCode()

{

unsigned char n;


static temp = 0;


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

{

while(!IRIN);// 等待高电平,开始解码


Delay_840us(); // 延时0.84ms


if(IRIN) // 若仍然为高电平,则为1,否则为0

{

temp = (0x80|(temp>>1));// 1

while(IRIN); //等待跳变成低电平

}

else {

temp=(0x00|(temp>>1));// 0

}

}


return temp;

}


/**

* 数码管显示

*/

void LedDisp()

{

unsigned char i;

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

{

P0=table[disbuf];

 P2 = scan;

 delay(50);

 P0=0x00;

 }

}


void main(void)

{

 SystemInit();


 while(1)

 {

 //以下是查表显示

 disbuf[0]=(((KeyValue&0xf0)>>4)&0x0f);

 disbuf[1]=KeyValue&0x0f;

 disbuf[2]=(((MaValue&0xf0)>>4)&0x0f);

 disbuf[3]=MaValue&0x0f;

 LedDisp();

 }

}



void interr_ir(void) interrupt 0

{

 /**

* 用户码和机器码

*/

 unsigned char addrl,addrh,num1,num2;


 EA = 0;//先关闭外部中断0


 Delay_9000us(); // 检测9ms开始码


 if (IRIN) { // 检测是否为干扰信号

 EA = 1; // 重新开启外部中断0

 return ;  // 退出解码

 }

     

 while(!IRIN); // 等待跳为高电平


 Delay_4500us(); // 检测4.5ms结果码


 if (IRIN) { // 检测是否为干扰信号

 EA = 1; // 重新开启外部中断0

 return ;  // 退出解码

 }


 // 读码

 addrl=GetCode(); // 用户编码高位

 addrh=GetCode(); // 用户编码低位

 num1=GetCode();// 机器码

 num2=GetCode();// 机器码反码


 //校验是否为错码

 if(num1!=~num2)

 {

 KeyValue=14;

 EA=1;

 return;

 }


 KeyValue=num2;

 MaValue=addrh;


 EA=1;

}

广告

关于立创商城

立创商城(WWW.SZLCSC.COM)成立于2011年,致力于为客户提供一站式电子元器件线上采购服务,成交量全国领先。自建6000多平米现代化元器件仓库,现货库存超40000种,集团电子全产业链自营服务涵盖:在线EDA(EasyEDA)+行业领先的PCB打样/中小批量+元器件商城+钢网制造+SMT贴片+电子设计教育及方案。作为一家品种齐全、自营库存、质量有保障的电子元器件垂直商城,立创商城所有元器件均从原厂或代理商正规渠道采购,保证原装正品,为您提供专业的一站式电子元器件采购服务。