專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

c51學(xué)習(xí)型紅外遙控器程序

作者:佚名   來(lái)源:劉洪   點(diǎn)擊數(shù):  更新時(shí)間:2010年08月01日   【字體:
#include<AT89X51.H>   //裝入AT89X51頭文件
#include<ir.h>			//裝入紅外解碼程序
#include<24c02.H>		//裝入24c02讀寫(xiě)程序
sbit key=P1^0;			//定義按鍵IO
sbit led=P0^0;       //定義指示led
sbit rel=P0^1;			//定義輸出控制腳

unsigned char kaver;  //定義kaver為輸出口狀態(tài)緩存
unsigned char iccdate,irdate;  //定義24c02數(shù)據(jù)和解碼數(shù)據(jù)

//延時(shí)10ms函數(shù),用于開(kāi)關(guān)消抖等
delay10ms()   
{ 
	unsigned char i,j; 	
	for(i=20;i>0;i--) 	
	for(j=248;j>0;j--); 	
}

//學(xué)習(xí)紅外解碼并寫(xiě)入24c02的函數(shù)
study()
{
    IR_IN();
 	irdate=IRCOM[3];
    iccdate=ReadIIC(W_cmd,0x00,R_cmd);
	if(irdate!=iccdate)        //只在解碼結(jié)果與讀取結(jié)果不同時(shí)寫(xiě)入24C02
	{
		if(irdate!=0)			//防止沒(méi)有接收到紅外信號(hào),IRCOM[3]置零時(shí),誤寫(xiě)入0
		{
		WP=0;
		WriIIC(W_cmd,0x00,irdate);
		delay10ms();
		WP=1;
		led=0;
		while(key==0);		//學(xué)習(xí)成功等待按鍵釋放,led停止閃動(dòng)作為指示
		}
	 }
}
//進(jìn)入學(xué)習(xí)狀態(tài)時(shí)的led閃動(dòng)函數(shù)
flash()
{
    unsigned char i;
	  while(key==0)
	  {
	     led=~led;
		  for(i=50;i>0;i--)
		  		study();		 
	  }
}
//按鍵模式識(shí)別函數(shù)
keymod()
{
	unsigned char m=0;
	while(key==0)          		//如果按鍵按下,開(kāi)始對(duì)按鍵時(shí)間進(jìn)行計(jì)數(shù)
	{		
			delay10ms();			//計(jì)數(shù)時(shí)間延時(shí)
			m++;
			delay10ms();			//計(jì)數(shù)時(shí)間延時(shí)
			if(m>=90)				//如果計(jì)數(shù)次數(shù)大于90次,等于按鍵按下時(shí)間大于約5秒后,進(jìn)入led閃動(dòng)學(xué)習(xí)模式
			{
				m=0;
				flash();
			} 
	}

	 if(m<90)              //如果計(jì)數(shù)次數(shù)小于90,則按鍵作為開(kāi)關(guān)使用
	 {
	 	m=0; 
		kaver=~kaver;
	 }

}
////////////////////主函數(shù)////////////////////////////////////
main()
{
	WP=1;			//24c02寫(xiě)保護(hù)
	while(1)
	{
		IRCOM[3]=0;
	    IR_IN();				// 讀4字節(jié)32位按鍵編碼 ,前16位用戶碼為IRCOM[1]+IRCOM[2],8位鍵值碼為IRCOM[3] 
		irdate=IRCOM[3];					//8位鍵值反碼為IRCOM[4] 這里只調(diào)用 IRCOM[3]鍵值碼作為數(shù)據(jù)碼
		iccdate=ReadIIC(W_cmd,0x00,R_cmd);
		if(irdate==iccdate)						//如果解碼結(jié)果與24C讀取碼相同,kaver翻轉(zhuǎn)一次
		{
			irdate=0;
			kaver=~kaver;
		}

      if(key==0) 	
			keymod();
		rel=~kaver;
		led=kaver;
	}
}
關(guān)閉窗口

相關(guān)文章