51单片机——红外遥控

1.基本发收与接送 

2.NEC编码

遥控器键码值

3.51单片机外部中断

 

4.基本发送与接收

5.代码

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include <INTRINS.H>
unsigned int irtime;
unsigned char irstate;
unsigned char irdata[4];
unsigned char irpdata;
unsigned char irdataflag;
unsigned char irrepeatflag;
unsigned char iraddress;
unsigned char ircommand;
void Delay1us()		//@11.0592MHz
{
	_nop_();
	_nop_();
	_nop_();
}

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}

void timer0(void)//设置定时器
{
	TMOD&=0xF0;
	TMOD|=0x01;
	TL0=0x18;
	TH0=0xFC;
	TF0=0;
	TR0=0;
}
void timer0set(unsigned int value)//设置定时器初值
{
	TH0=value/256;
	TL0=value%256;
}
unsigned int timer0get(void)//获取时间
{
	unsigned int t=TH0*256+TL0;
	return t;
}
void timer0run(unsigned char flag)//设置定时器启停
{
	TR0=flag;
}
void int0init(void)//外部中断
{
	IT0=1;
	IE0=0;
	EX0=1;
	EA=1;
	PX0=1;
}
unsigned char irgetdataflag(void)
{
	if(irdataflag)
	{
		irdataflag=0;
		return 1;
	}
	return 0;
}
unsigned char irgetrepeatflag(void)
{
	if(irrepeatflag)
	{
		irrepeatflag=0;
		return 1;
	}
	return 0;
}
unsigned char irgetaddress(void)
{
	return iraddress;
}
unsigned char irgetcommand(void)
{
	return ircommand;
}
void irinit(void)
{
	timer0();
	int0init();
}
unsigned int time;
void main()
{
	timer0();
	int0init();
	LCD_Init();
	LCD_ShowString(1,1,"A");
//	timer0set(0);
//	timer0run(1);
//	Delay1ms();
//	//Delay1ms();
//	
//	time=timer0get();
//	LCD_ShowNum(1,3,time,10);
	while(1)
	{
		
	}
}
void int0roueine(void) interrupt 0
{
	if(irstate==0)
	{
		
		timer0set(0);
		timer0run(1);
		irstate=1;
		irtime=timer0get();
		LCD_ShowNum(1,3,irtime,8);
	}
	else if(irstate==1)
	{
		//timer0run(0);
		irtime=timer0get();
		timer0set(0);
		LCD_ShowNum(2,1,irtime,8);
		if((irtime>13500-500)&&(irtime<13500+500))
		{
			irstate=2;
		}
		else if((irtime>11250-500)&&(irtime<11250+500))
		{
			irrepeatflag=1;
			timer0run(0);
			irstate=0;
		}
		else
		{
			irstate=1;
		}
	}
	else if(irstate==2)
	{
		irtime=timer0get();
		timer0set(0);
		if(irtime>1120-500&&irtime<1120+500)
		{
			irdata[irpdata/8]&=~(0x01<<irpdata%8);
			irpdata++;
		}
		else
		{
			irpdata=0;
			irstate=1;
		}
		if(irpdata>=32)
		{
			irpdata=0;
			if(irdata[0]==~irdata[1]&&irdata[2]==~irdata[3])
			{
				irdataflag=1;
				iraddress=irdata[0];
				ircommand=irdata[2];
				irdataflag=1;
			}
			timer0run(0);
			irstate=0;
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值