专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

c51学习型红外遥控器程序

作者:佚名   来源:刘洪   点击数:  更新时间:2010年08月01日   【字体:
#include<AT89X51.H>   //装入AT89X51头文件
#include<ir.h>			//装入红外解码程序
#include<24c02.H>		//装入24c02读写程序
sbit key=P1^0;			//定义按键IO
sbit led=P0^0;       //定义指示led
sbit rel=P0^1;			//定义输出控制脚

unsigned char kaver;  //定义kaver为输出口状态缓存
unsigned char iccdate,irdate;  //定义24c02数据和解码数据

//延时10ms函数,用于开关消抖等
delay10ms()   
{ 
	unsigned char i,j; 	
	for(i=20;i>0;i--) 	
	for(j=248;j>0;j--); 	
}

//学习红外解码并写入24c02的函数
study()
{
    IR_IN();
 	irdate=IRCOM[3];
    iccdate=ReadIIC(W_cmd,0x00,R_cmd);
	if(irdate!=iccdate)        //只在解码结果与读取结果不同时写入24C02
	{
		if(irdate!=0)			//防止没有接收到红外信号,IRCOM[3]置零时,误写入0
		{
		WP=0;
		WriIIC(W_cmd,0x00,irdate);
		delay10ms();
		WP=1;
		led=0;
		while(key==0);		//学习成功等待按键释放,led停止闪动作为指示
		}
	 }
}
//进入学习状态时的led闪动函数
flash()
{
    unsigned char i;
	  while(key==0)
	  {
	     led=~led;
		  for(i=50;i>0;i--)
		  		study();		 
	  }
}
//按键模式识别函数
keymod()
{
	unsigned char m=0;
	while(key==0)          		//如果按键按下,开始对按键时间进行计数
	{		
			delay10ms();			//计数时间延时
			m++;
			delay10ms();			//计数时间延时
			if(m>=90)				//如果计数次数大于90次,等于按键按下时间大于约5秒后,进入led闪动学习模式
			{
				m=0;
				flash();
			} 
	}

	 if(m<90)              //如果计数次数小于90,则按键作为开关使用
	 {
	 	m=0; 
		kaver=~kaver;
	 }

}
////////////////////主函数////////////////////////////////////
main()
{
	WP=1;			//24c02写保护
	while(1)
	{
		IRCOM[3]=0;
	    IR_IN();				// 读4字节32位按键编码 ,前16位用户码为IRCOM[1]+IRCOM[2],8位键值码为IRCOM[3] 
		irdate=IRCOM[3];					//8位键值反码为IRCOM[4] 这里只调用 IRCOM[3]键值码作为数据码
		iccdate=ReadIIC(W_cmd,0x00,R_cmd);
		if(irdate==iccdate)						//如果解码结果与24C读取码相同,kaver翻转一次
		{
			irdate=0;
			kaver=~kaver;
		}

      if(key==0) 	
			keymod();
		rel=~kaver;
		led=kaver;
	}
}
关闭窗口

相关文章