51单片机红外解码程序

来源:本站
导读:目前正在解读《51单片机红外解码程序》的相关信息,《51单片机红外解码程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《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;

}

提醒:《51单片机红外解码程序》最后刷新时间 2024-03-14 01:12:17,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《51单片机红外解码程序》该内容的真实性请自行鉴别。