|
|
本帖最后由 ll13536121668 于 2019-5-7 12:02 編輯
這個(gè)程序缺少了<ir.h> <24c02.H>那位師博能把這個(gè),用Keil uVision 4編譯 通過生成代碼嗎? 修改好用壓縮包上傳,謝謝
#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為輸出口狀態(tài)緩存
unsigned char iccdate,irdate; //定義24c02數(shù)據(jù)和解碼數(shù)據(jù)
//延時(shí)10ms函數(shù),用于開關(guān)消抖等
delay10ms()
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
//學(xué)習(xí)紅外解碼并寫入24c02的函數(shù)
study()
{
IR_IN();
irdate=IRCOM[3];
iccdate=ReadIIC(W_cmd,0x00,R_cmd);
if(irdate!=iccdate) //只在解碼結(jié)果與讀取結(jié)果不同時(shí)寫入24C02
{
if(irdate!=0) //防止沒有接收到紅外信號(hào),IRCOM[3]置零時(shí),誤寫入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) //如果按鍵按下,開始對(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,則按鍵作為開關(guān)使用
{
m=0;
kaver=~kaver;
}
}
////////////////////主函數(shù)////////////////////////////////////
main()
{
WP=1; //24c02寫保護(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;
}
}
|
|